当我们应用量化或稀疏化等压缩技术时,我们实质上是在传输真实梯度或模型更新的一个近似值。设 g 是客户端计算出的原始梯度向量,Q(g) 是其压缩版本(例如,量化或稀疏化)。差值 e=g−Q(g) 代表了在该通信轮次中引入的压缩误差。
在每一轮简单地丢弃这个误差 e 会导致问题。设想一个使用 Top-k 稀疏化的场景,其中只发送对应于参数更新中最大 10% 的梯度。如果某些参数的梯度持续低于这个阈值,它们的更新可能永远无法有效传递,导致模型参数漂移或收敛非常缓慢。类似地,量化会引入噪声;如果这种噪声存在偏差(例如,总是向下取整),累积效应会使优化过程严重偏离轨道。这种现象被称为误差累积。经过多轮通信,这些微小而持续的误差会累积,严重降低模型精度,甚至导致发散。
误差补偿原理
为了抵消误差累积,我们可以采用**误差补偿(EC)**技术。基本思路很简单:客户端不丢弃压缩误差,而是每个客户端在本地“记住”误差,并将其并入下一通信轮次的计算中。
可以这样理解:如果压缩 g 导致发送 Q(g),客户端“欠”了差值 e=g−Q(g)。在下一轮中,在压缩新梯度 gnext 之前,客户端首先加上上一轮的“欠债”:gnext′=gnext+e。然后它压缩这个调整后的值 gnext′,得到 Q(gnext′) 用于传输。这一轮的误差随后计算为 enext=gnext′−Q(gnext′),并本地存储以备下一轮使用。
这个过程确保了一轮中因压缩而丢失的信息有机会在未来的轮次中传输。它防止了某些压缩方案引入的系统性偏差,并有助于随着时间的推移,使聚合更新更接近真实的(未压缩的)全局梯度方向。
误差反馈机制
这个原理最广泛的应用被称为误差反馈(EF)。让我们概述客户端 k 在通信轮次 t 的过程:
- 初始化误差: 对于第一轮 (t=1),局部误差累加器 ek,0 被初始化为与模型参数同维度的零向量。
- 计算局部梯度: 根据客户端的本地数据和当前全局模型 wt 计算梯度 gk,t。
- 加入先前误差: 将上一轮 (t−1) 的累积误差加到当前梯度中:
gk,t′=gk,t+ek,t−1
- 压缩调整后的梯度: 对调整后的梯度 gk,t′ 应用选定的压缩算子 Q(例如,量化、稀疏化):
δk,t=Q(gk,t′)
客户端将此压缩更新 δk,t 发送给服务器。
- 更新局部误差: 计算当前轮次的新压缩误差,并本地存储以备下一轮 (t+1) 使用:
ek,t=gk,t′−δk,t
这个 ek,t 有效地捕获了由于压缩而在 δk,t 中计算但未发送的信息。
服务器随后聚合来自参与客户端的已接收压缩更新 δk,t(可能使用类似 FedAvg 的加权平均),以更新全局模型。
影响与考量
实施误差反馈可以显著减轻梯度压缩的负面影响:
- 提升收敛性: 对于有偏压缩器,例如 Top-k 稀疏化或简单的确定性量化,EF 通常是确保收敛所必需的。它纠正了由于系统性忽略某些梯度分量或引入有偏噪声而导致的漂移。即使对于无偏压缩器(如随机量化),EF 也能降低更新的方差,可能导致更快的收敛。理论分析常表明,带有压缩和误差反馈的 SGD 可以达到与未压缩 SGD 相似的收敛速度,尽管可能取决于压缩比而存在一个更大的常数因子。
- 兼容性: EF 与各种压缩策略兼容良好,包括量化和稀疏化。
- 内存开销: EF 的主要缺点是每个客户端都需要存储误差向量 ek,t。这个向量与模型参数维度相同,有效地使训练期间客户端的梯度相关内存需求翻倍。对于非常大的模型,这可能对资源受限设备造成显著制约。
- 与局部更新的交互: 在诸如 FedAvg 等算法中,客户端在通信前执行多个局部 SGD 步骤,误差反馈通常只应用于通信的聚合更新,而非每个单独的局部梯度步骤。误差 ek,t 会在通信轮次中累积。
这里是收敛性比较:
图示训练损失如何随通信轮次减少。未压缩训练通常收敛最快。无误差补偿的压缩训练可能收敛缓慢或停滞。带有误差反馈的压缩训练通常能恢复大部分收敛速度,略滞后于未压缩训练,但显著优于朴素压缩。
误差补偿,尤其是通过误差反馈机制,是联邦学习中与梯度压缩结合使用的标准技术。尽管它在客户端引入了内存开销,但在保持模型精度和确保收敛方面的优势通常超过了这一成本,使得激进的压缩策略在实践中可行。