趋近智
除了压缩本地训练期间计算得到的梯度,另一种有效方法则针对本地训练的产物:模型更新本身。客户端并非在每个本地步骤后发送压缩梯度,而是先进行本地训练(通常是多个周期),然后压缩模型权重 (weight)产生的变化 ,有时甚至是整个更新后的本地模型 ,再进行传输。当客户端在通信轮次之间执行大量本地计算时,此方法尤其适用。
压缩模型更新 直接解决了上行通信瓶颈。所采用的方法通常与梯度压缩中使用的相似,但应用于累积更新向量 (vector)或张量。下面介绍几种主要方法。
与梯度量化类似,模型更新可以进行量化,以减少表示每个参数 (parameter)变化所需的位数。我们将 中的高精度浮点值替换为低精度表示。
常见方法包括:
服务器接收到量化后的更新(),需要在聚合前对其进行反量化。虽然简单,但量化会引入误差(),这可能会影响收敛。后面讨论的误差补偿等方法有助于缓解此问题。
稀疏化的目标是只发送模型更新向量 (vector) 中的一部分参数 (parameter),将其余参数设为零。这直接减少了传输的数据量,尤其在使用稀疏数据格式时。
以下是模型更新向量的 Top-k 稀疏化示例:
# 模型更新 Top-k 稀疏化的伪代码
def top_k_sparsify(delta_w, k):
"""
通过保留绝对值最大的前 k 个元素来稀疏化模型更新 delta_w。
参数:
delta_w: 模型更新向量(例如,NumPy 数组)。
k: 要保留的元素数量。
返回:
前 k 个元素的稀疏表示(例如,索引和值)。
"""
if k >= len(delta_w):
# 如果 k 大于或等于向量大小,则无需稀疏化
indices = np.arange(len(delta_w))
values = delta_w
return indices, values
# 计算幅度并找到第 k 大值的阈值
magnitudes = np.abs(delta_w)
threshold = np.sort(magnitudes)[-k] # 找到第 k 大的幅度
# 选择幅度大于或等于阈值的索引
# 仔细处理可能出现的平局,以确保正好 k 个(如果在阈值处有平局则略多)
mask = magnitudes >= threshold
indices = np.where(mask)[0]
values = delta_w[mask]
# 如果平局导致超过 k 个值,则取其中的前 k 个
if len(indices) > k:
top_indices_within_mask = np.argsort(np.abs(values))[::-1][:k]
indices = indices[top_indices_within_mask]
values = values[top_indices_within_mask]
return indices, values
# --- 客户端 ---
# 假设 delta_w 是计算出的模型更新向量
# 假设 k 是稀疏性参数
k = int(0.1 * len(delta_w)) # 示例:保留前 10%
sparse_indices, sparse_values = top_k_sparsify(delta_w, k)
# 将 sparse_indices 和 sparse_values 传输到服务器
# --- 服务器 ---
# 从客户端接收 sparse_indices 和 sparse_values
# 重构(稀疏)更新向量以进行聚合
reconstructed_delta_w = np.zeros_like(global_model_weights) # 或合适的形状
reconstructed_delta_w[sparse_indices] = sparse_values
# 将 reconstructed_delta_w 与其他客户端的更新进行聚合
稀疏化在聚合期间需要仔细处理。服务器需要将稀疏向量重构到公共维度(通常初始化为零),然后才能对它们进行平均或求和。发送索引会增加开销,但这通常远小于发送稠密非零值所需的开销。
对于大型模型,特别是具有大型权重 (weight)矩阵的神经网络 (neural network),更新 (现在是矩阵或张量)可以使用结构化表示进行近似。一种常见方法是低秩近似。
客户端并非传输完整的 更新矩阵 ,而是计算并发送两个较小的矩阵 () 和 (),使得 。此处 是近似的秩,选择时使 。传输的参数 (parameter)数量从 减少到 。当 很小时,这可以带来显著节省。
服务器从每个客户端接收 和 ,重构近似的 (或直接使用低秩因子进行聚合,这可能更高效),然后应用聚合后的更新。选择秩 涉及到压缩和更新近似精确度之间的权衡。
这些方法并非互斥。通常可以有效结合使用。例如:
这种分层方法可以实现非常高的压缩比。
如前所述,量化 (quantization)和稀疏化(特别是 Top-k 以外的方法)会引入误差。如果忽略,这些误差会累积多轮,减缓甚至阻止收敛。可以应用类似于梯度压缩中使用的误差补偿或误差反馈机制。
基本思想是客户端记住当前轮次产生的压缩误差,并在下一轮次再次应用压缩之前,将其加回到模型更新中。
令 为第 轮的真实更新。 令 为压缩操作(例如,量化 + 稀疏化)。 令 为累积误差。
这确保了在一轮中产生的误差在后续轮次中得到纠正,防止了系统性漂移,并通常能恢复接近未压缩情况的收敛特性,尽管有时收敛速度会略慢。
选择模型更新压缩方法需要权衡多个因素:
通信成本降低与不同压缩方法对最终模型精度的潜在影响之间的关系。确切的权衡很大程度上取决于具体任务、模型、数据异构性以及选择的超参数 (parameter) (hyperparameter)。
模型更新压缩与梯度压缩一道,提供了一套强大的工具,使联邦学习在通信受限环境中变得实用。最优选择通常取决于具体的系统特性、模型架构以及对计算开销和潜在精度权衡的容忍度。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•