联邦学习中的优化算法概述#
联邦学习开创性的文献 [McMahan et al.[1]] 中,最重要的贡献便是联邦平均算法( FedAvg )的提出。数学上,联邦学习求解如下极小化经验风险函数的问题
其中 \(\ell_k\) 是客户端 \(k\) 的损失函数,\(\mathcal{D}_k\) 是客户端 \(k\) 的数据分布,\(\mathcal{P}\) 是客户端的分布,\(\mathbb{E}\) 是期望算子。假设我们令 \(\mathcal{P} = \{1, 2, \ldots, K\}\) ,则上述优化问题可以简记为
通常,为了形式简便,我们令 \(w_k = \frac{1}{K}\) 。对于 \(f\) 以及 \(f_k\) ,我们一般假设它们满足如下几条最基本的假设:
(A1) \(f\) 以及 \(f_k\) 都是 \(L\)-光滑的(\(L > 0\) ),亦即它们有 Lipschitz-连续的梯度:
(3)#\[\begin{split}\begin{array}{c} \lVert \nabla f (\theta) - f (\theta') \rVert \leqslant L \lVert \theta - \theta' \rVert, \\ \lVert \nabla f_k (\theta) - f_k (\theta') \rVert \leqslant L \lVert \theta - \theta' \rVert, \end{array} \quad \forall \theta, \theta' \in \mathbb{R}^d, k = 1, \ldots, K.\end{split}\](A2) \(f\) 的值域
\[\text{dom}(f) := \{ \theta \in \mathbb{R}^d ~|~ f(\theta) < + \infty \}\]非空,且下有界 (Lower Bounded):存在常数 \(c \in \mathbb{R}\) ,使得
(4)#\[f(\theta) \geqslant c > -\infty, ~ \forall \theta \in \mathbb{R}^d,\]或等价地
(5)#\[f^* := \inf\limits_{\theta \in \mathbb{R}^d} f(\theta) > - \infty.\]
很多时候,为了方便收敛性的分析,我们还会对目标函数的梯度进行一些假设:
(A3) 梯度有界性 (Bounded Gradient):存在常数 \(G > 0\) ,使得
(6)#\[\lVert \nabla f_k (\theta) \rVert^2 \leqslant G^2, ~ \forall \theta \in \mathbb{R}^d, ~ k = 1, \ldots K.\]
数据分布的特征(是否独立同分布,以及非独立同分布的程度)是联邦学习绕不开的问题,对此有如下假设:
(A4-1) 数据独立同分布 (I.I.D.):
(7)#\[\nabla f(\theta) = \mathbb{E} [f_k(\theta)] = \mathbb{E}_{(x, y) \sim \mathcal{D}_k}[\nabla \ell_k(\theta; x, y)], ~ \forall \theta \in \mathbb{R}^d, ~ k = 1, \ldots K,\]或者,对任意 \(\varepsilon > 0\) ,存在常数 \(B \geqslant 0\) ,满足
(8)#\[\sum\limits_{k=1}^K \lVert \nabla f_k(\theta) \rVert^2 = \lVert f(\theta) \rVert^2, ~ \forall \theta \in \left\{ \theta \in \mathbb{R}^d ~ \middle| ~ \lVert f(\theta) \rVert^2 > \varepsilon \right\}.\]
(A4-2) 数据非独立同分布 (Non-I.I.D.),这时候我们需要有一个量,用来度量这种统计上的异质性的程度。这个量可以有多种定义方式 [Karimireddy et al.[2], Zhang et al.[3], Li et al.[4], Li et al.[5]],这里采用 [Karimireddy et al.[2]] 与 [Zhang et al.[3]] 中定义的梯度差异有界性 (Bounded Gradient Dissimilarity, BGD),记作 \((G; B)\)-BGD。具体来说,存在常数 \(G > 0\) 以及 \(B \geqslant 0\) ,满足
(9)#\[\dfrac{1}{K} \sum\limits_{k=1}^K \lVert \nabla f_k(\theta) \rVert^2 \leqslant G^2 + B^2 \lVert \nabla f(\theta) \rVert^2, ~ \forall \theta \in \mathbb{R}^d.\]需要注意的是,如果令 \(B = 0\) ,那么梯度差异有界性条件(A4-2)就退化为梯度有界性条件(A3)。
很多时候,在证明算法收敛性的时候,我们需要对目标函数 \(f\) 进行一些凸性方面的假设,其定义如下:
(A5-1) 凸性:
(10)#\[f(a \theta + (1 - a) \theta') \leqslant a f(\theta) + (1 - a) f(\theta'), ~ \forall \theta, \theta' \in \mathcal{C}, ~ \alpha \in [0, 1].\]其中 \(\mathcal{C}\) 是一个凸集,\(f\) 定义在其上。
(A5-2) 强凸性:\(\mu > 0\) ,若 \(f - \frac{\mu}{2} \lVert \theta \rVert^2\) 是凸函数,则称 \(f\) 是 \(\mu\)-强凸函数。
由于联邦学习天然的分层以及可解耦的结构,更方便以及自然的做法,是将问题写成如下约束优化问题的格式:
我们很容易看出约束优化问题 (11) 与无约束优化问题 (2) 两种格式的等价性。格式 (11) 在分布式优化中被称作共识优化问题 (Consensus Problem) [Boyd et al.[6]]。约束格式 (11) 的好处是,目标函数变成了分块可分离的 (Block Separable),这对设计可并行化的算法是巨大的便利。
联邦平均算法#
联邦平均算法的核心思想,是充分利用子节点的计算能力,在以学习率 \(\eta\) 执行完一定轮数的随机梯度下降 (Stochastic Gradient Descent, SGD) 之后,由中心节点收集各子节点发送过来的模型参数,进行平均 (Averaging),之后再将平均之后的模型参数广播 (Broadcast) 给子节点进行下一轮迭代。这样规避了每一轮 SGD 都进行通信带来的巨大的通信开销,在加速模型训练的同时,数值上在某些情况下还有更好的收敛性。这实际上是一种比较朴素与简单的“跳步”的思想,这种思想在随后的研究 [Zhang et al.[3], Mishchenko et al.[7], Zhang and Loizou[8]] 中也得到了进一步的发展。 FedAvg 的伪代码如下:
\begin{algorithm}
\caption{Pseudo-code for \texttt{FedAvg}}
\begin{algorithmic}
\REQUIRE learning rate $\eta$, batch size $B$
\STATE {\bfseries Initiation:} global (server) model parameters $\theta^{(0)} \in \R^d$
\FOR{each round $t = 0, 1, \cdots, T-1$}
\STATE $\mathcal{S}^{(t)} \gets$ (random set of clients) $\subseteq [K]$
\STATE broadcast $\theta^{(t)}$ to clients $k \in \mathcal{S}^{(t)}$
\FOR{each client $k \in \mathcal{S}^{(t)}$ {\bfseries in parallel}}
\STATE $\theta_k^{(t)} \gets$ {\bfseries ClientUpdate}$(k, \theta^{(t)})$
\STATE send $\theta_k^{(t)}$ to server
\ENDFOR
\STATE {\bfseries Server Update:}
\STATE $\hspace{1.3em}$ $\theta^{(t+1)} \gets \frac{1}{\lvert \mathcal{S}^{(t)} \rvert} \sum\limits_{k\in \mathcal{S}^{(t)}} \theta_k^{(t)}$
\ENDFOR
\PROCEDURE{ClientUpdate}{$(k, \theta)$} \COMMENT{on client $k$}
\STATE $\mathcal{B} \gets$ (split $\mathcal{D}_k$ into batches of size $B$)
\FOR{local step $r = 0, 1, \cdots, R-1$}
\FOR{batch $b \in \mathcal{B}$}
\STATE $\theta \gets \theta - \eta \nabla \ell_k(\theta; b)$ \COMMENT{SGD}
\ENDFOR
\ENDFOR
\RETURN $\theta$
\ENDPROCEDURE
\end{algorithmic}
\end{algorithm}联邦平均算法 FedAvg 在数值上取得了一些不错的实验结果(见 [McMahan et al.[1]] 第 3 节),但是其收敛性,特别是在数据非独立同分布的情况下,并未得到很好的分析(见 [Khaled et al.[9], Khaled et al.[10]])。后续的文献(如 [Zhou and Cong[11], Li et al.[4]])处理了这一问题,但添加了诸如 \(f\) 强凸等额外假设。
最优化理论视角下的联邦平均算法#
我们从最优化理论的角度对联邦平均算法 FedAvg 进行分析。事实上, FedAvg 所处理的优化问题 (2) 可以等价地改写为如下的约束优化问题:
其中 \(\Theta = \col(\theta_1, \cdots, \theta_K) := \begin{pmatrix} \theta_1 \\ \vdots \\ \theta_K \end{pmatrix}, \theta_1, \ldots, \theta_K \in \mathbb{R}^d\) ,\(\mathcal{E} = \left\{ \Theta ~ \middle| ~ \theta_1 = \cdots = \theta_K \right\}\) 是 \(\mathbb{R}^{Kd}\) 中一个凸集。我们知道,投影梯度下降法 (Projected Gradient Descent, PGD) 是求解问题 (12) 的一个有效算法,其迭代格式为:
其中 \(\Pi_{\mathcal{E}}\) 是到集合 \(\mathcal{E}\) 的投影算子。容易看出,到集合 \(\mathcal{E} = \left\{ \Theta ~ \middle| ~ \theta_1 = \cdots = \theta_K \right\}\) 的投影映射就是“求平均”映射:
也就是说,联邦平均算法在数学上,实质上是一种随机投影梯度法:子节点执行的是梯度步(具体来说是用的随机梯度下降),中心节点执行的是投影步 (14) 。
联邦平均算法的改进#
因为联邦平均算法是以随机梯度下降法为基础的,那么一个自然的想法就是将随机梯度下降法的一些加速的技巧 [Duchi et al.[12], Kingma and Ba[13], Zaheer et al.[14], Reddi et al.[15]] 引入联邦学习整个算法体系内。由于联邦学习子节点与中心节点的计算相对独立、没有耦合,所以这种做法并不需要对联邦学习整个算法框架做大改动,是一种可行的方法。事实上,联邦平均算法的作者在随后发表的文章 [Reddi et al.[16]] 中实践了这一想法,提出了一个泛用性更强的自适应联邦学习算法框架 FedOpt ,其伪代码如下:
\begin{algorithm}
\caption{PseudoCode for \texttt{FedOpt}}
\begin{algorithmic}
\REQUIRE methods {\bfseries ServerOpt, ClientOpt}, learning rates (schedule) $\eta_g, \eta_l$
\STATE {\bfseries Initiation:} global (server) model parameters $\theta^{(0)} \in \mathbb{R}^d$
\FOR{each round $t = 0, 1, \cdots, T-1$}
\STATE $\mathcal{S}^{(t)} \gets$ (random set of clients) $\subseteq [K]$
\STATE broadcast $\theta^{(t)}$ to clients $k \in \mathcal{S}^{(t)}$
\FOR{each client $k \in \mathcal{S}^{(t)}$ {\bfseries in parallel}}
\STATE $\theta_k^{(t, 0)} \gets \theta^{(t)}$
\FOR{local step $r = 0, 1, \cdots, R-1$}
\STATE compute unbiased estimate $g_k^{(t, r)}$ of $\nabla f_k(\theta_k^{(t, r)})$
\STATE $\theta_k^{(t, r+1)} \gets$ {\bfseries ClientOpt}$(\theta_k^{(t, r)}, g_k^{(t, r)}, \eta_l, t)$
\ENDFOR
\STATE $\Delta_{k}^{(t)} \gets \theta_k^{(t, R)} - \theta^{(t)}$
\STATE send $\Delta_{k}^{(t)}$ to server
\ENDFOR
\STATE {\bfseries Server Update:}
\STATE $\hspace{1.3em}$ $\Delta^{(t)} \gets \text{aggregate} \left( \left\{ \Delta_{k}^{(t)} \right\}_{k \in \mathcal{S}^{(t)}} \right)$
\STATE $\hspace{1.3em}$ $\theta^{(t+1)} \gets$ {\bfseries ServerOpt}$(\theta^{(t)}, \Delta^{(t)}, \eta_g, t)$
\ENDFOR
\end{algorithmic}
\end{algorithm}这里的 \(\operatorname{aggregate} \left( \left\{ \Delta_{k}^{(t)} \right\}_{k \in \mathcal{S}^{(t)}} \right)\) 指的是将来自子节点的惯性项 \(\Delta_{k}^{(t)}\) 聚合为全局惯性量的方法,例如可以采用简单的均值
或者与上一步惯性量的线性组合
我们注意到,相比于联邦平均算法 FedAvg ,自适应联邦学习算法 FedOpt 在中心节点引入了带动量 (Momentum) 的项,即 ServerOpt ,用于加速。我们列举一些 ServerOpt 可供选择的方法 [Reddi et al.[16]]:
FedAdagrad:(17)#\[\begin{split}\begin{aligned} v^{(t)} & \gets v^{(t-1)} + ( \Delta^{(t)} )^2 \\ \theta^{(t+1)} & \gets \theta^{(t)} + \eta_g \Delta^{(t)} / (\sqrt{v^{(t)}}+\tau) \end{aligned}\end{split}\]FedYogi:(18)#\[\begin{split}\begin{aligned} v^{(t)} & \gets v^{(t-1)} - (1 - \beta_2) ( \Delta^{(t)} )^2 \operatorname{sign}(v^{(t-1)} - ( \Delta^{(t)} )^2) \\ \theta^{(t+1)} & \gets \theta^{(t)} + \eta_g \Delta^{(t)} / (\sqrt{v^{(t)}}+\tau) \end{aligned}\end{split}\]FedAdam:(19)#\[\begin{split}\begin{aligned} v^{(t)} & \gets \beta_2 v^{(t-1)} + (1 - \beta_2) ( \Delta^{(t)} )^2 \\ \theta^{(t+1)} & \gets \theta^{(t)} + \eta_g \Delta^{(t)} / (\sqrt{v^{(t)}}+\tau) \end{aligned}\end{split}\]
FedOpt 将机器学习领域内常用的一些加速的技巧应用于联邦学习的场景,是 FedAvg 较为平凡但又重要的推广。它另一个更重要的意义在于充分表明了联邦学习子节点与中心节点的计算的解耦合的性质。
联邦平均算法 FedAvg 与自适应联邦学习算法 FedOpt 考虑的主要是数据在各子节点之间独立同分布的场景。对于更具有实际意义的数据非独立同分布的场景,我们需要引入一些别的工具来处理这种情况。此时,各子节点上的梯度在分布上是有差异的,一个很自然的想法就是引入一些额外的参数,与模型参数一起更新,利用这些额外的参数对子节点的梯度进行修正,减小各子节点上的梯度在分布上的差异,进而达到使算法收敛更稳定以及加速收敛的目的。这种技术就是方差缩减 (Variance Reduction, VR) 技术 [Johnson and Zhang[17]],由 [Karimireddy et al.[2]] 以算法 SCAFFOLD (Stochastic Controlled Averaging algorithm) 的形式首次引入联邦学习中。 SCAFFOLD 的伪代码如下:
\begin{algorithm}
\caption{PseudoCode for \texttt{SCAFFOLD} (Stochastic Controlled Averaging)}
\begin{algorithmic}
\REQUIRE server learning rate $\eta_g,$ client learning rates $\eta_k,$ $\forall k \in [K]$
\STATE {\bfseries Initiation:}
\STATE $\hspace{1.3em}$ {\bfseries Server init:} global model parameters $\theta^{(0)} \in \mathbb{R}^d,$ control variates $c^{(0)} \in \mathbb{R}^d$
\STATE $\hspace{1.3em}$ {\bfseries Clients init:} control variates $c_k^{(0)} \in \mathbb{R}^d, ~ \forall k \in [K]$
\FOR{each round $t = 0, 1, \cdots, T-1$}
\STATE $\mathcal{S}^{(t)} \gets$ (random set of clients) $\subseteq [K]$
\STATE broadcast $(\theta^{(t)}, c^{(t)})$ to clients $k \in \mathcal{S}^{(t)}$
\FOR{each client $k \in \mathcal{S}^{(t)}$ {\bfseries in parallel}}
\STATE $\theta_k^{(t, 0)} \gets \theta^{(t)}$
\FOR{local step $r = 0, 1, \cdots, R-1$}
\COMMENT{$R$ iterates of SGD with variance reduction}
\STATE compute mini-batch gradient $g_k^{(t, r)}$ of $\nabla f_k(\theta_k^{(t, r)})$
\STATE $\theta_k^{(t, r+1)} \gets \theta_k^{(t, r)} - \eta_k \left( g_k^{(t, r)} - c_k^{(t)} + c^{(t)} \right)$
\ENDFOR
\STATE $c_k^{(t+\frac{1}{2})} \gets \begin{cases} \text{Option 1} & g_k^{(t, 0)} \\ \text{Option 2} & c_k^{(t)} - c^{(t)} + \frac{1}{R\eta_k} \left( \theta^{(t)} - \theta_k^{(t, R)} \right) \end{cases}$
\STATE $( \Delta \theta_k^{(t)}, \Delta c_k^{(t)} ) \gets ( \theta_k^{(t, R)} - \theta^{(t)}, c_k^{(t+\frac{1}{2})} - c_k^{(t)} )$
\STATE send $( \Delta \theta_k^{(t)}, \Delta c_k^{(t)} )$ to server
\STATE $c_k^{(t+1)} \gets c_k^{(t+\frac{1}{2})}$
\ENDFOR
\STATE {\bfseries Server Update:}
\STATE $\hspace{1.3em}$ $( \Delta \theta^{(t)}, \Delta c^{(t)} ) \gets \frac{1}{\lvert \mathcal{S}^{(t)} \rvert} \sum\limits_{k \in \mathcal{S}^{(t)}} ( \Delta \theta_k^{(t)}, \Delta c_k^{(t)} )$
\STATE $\hspace{1.3em}$ $\theta^{(t+1)} \gets \theta^{(t)} + \eta_g \Delta \theta^{(t)}$
\STATE $\hspace{1.3em}$ $c^{(t+1)} \gets c^{(t)} + \frac{\lvert \mathcal{S}^{(t)} \rvert}{K} \Delta c^{(t)}$
\ENDFOR
\end{algorithmic}
\end{algorithm}方差缩减是一种可以灵活地与大多数算法结合的技术,已在联邦学习中被广泛用于处理统计异质性。但要注意,在 SCAFFOLD 算法 中,服务器与客户端上都有需要维护的额外参数 \(c\) 与 \(c_k\) ,这可能增加通信开销。在对通信开销敏感的场景中,这可能会成为问题。因此,更好的方案可能是把方差缩减技术与某种 跳步 技巧相结合(如 [Zhang and Loizou[8]]),这将在后面几节介绍。
参考文献