FedOpt 自适应联邦优化
FedOpt 将自适应优化器(如 Adam、Yogi)引入联邦学习的服务端聚合步骤,提升收敛速度和最终性能。
FedOpt 框架
FedOpt 将 FedAvg 的聚合步骤替换为自适应优化器更新:
FedAvg: w_(t+1) = Σ n_k/n × w_k^(t+1) # 简单加权平均
FedOpt: w_(t+1) = w_t - η_s × ServerOptimizer(Δ_t) # 自适应更新
其中 Δ_t = w_t - Σ n_k/n × w_k^(t+1) 是伪梯度服务端优化器
FedAdam
python
class FedAdamServer:
def __init__(self, model, lr=0.01, beta1=0.9, beta2=0.999, epsilon=1e-8, tau=1e-3):
self.global_model = model
self.lr = lr
self.beta1 = beta1
self.beta2 = beta2
self.epsilon = epsilon
self.tau = tau # 适配率
self.m = None # 一阶矩
self.v = None # 二阶矩
def aggregate(self, pseudo_gradient, round_num):
"""FedAdam 聚合"""
if self.m is None:
self.m = torch.zeros_like(pseudo_gradient)
self.v = torch.zeros_like(pseudo_gradient)
# 更新一阶矩和二阶矩
self.m = self.beta1 * self.m + (1 - self.beta1) * pseudo_gradient
self.v = self.beta2 * self.v + (1 - self.beta2) * pseudo_gradient ** 2
# 偏差修正
m_hat = self.m / (1 - self.beta1 ** round_num)
v_hat = self.v / (1 - self.beta2 ** round_num)
# 自适应更新
update = self.lr * m_hat / (torch.sqrt(v_hat) + self.tau)
for param, delta in zip(self.global_model.parameters(), update):
param.data += deltaFedYogi
python
# FedYogi 使用不同的二阶矩更新公式
self.v = self.v - (1 - self.beta2) * pseudo_gradient ** 2 * torch.sign(
self.v - pseudo_gradient ** 2
)优化器对比
| 优化器 | 自适应学习率 | 收敛速度 | 鲁棒性 | 推荐 |
|---|---|---|---|---|
| FedAvg (SGD) | 否 | 慢 | 中 | IID 基线 |
| FedAdam | 是 | 快 | 好 | 通用推荐 |
| FedYogi | 是 | 快 | 最好 | Non-IID 推荐 |
| FedAdagrad | 是 | 中 | 差 | 不推荐 |
超参数选择
python
# FedOpt 推荐配置
fedopt_config = {
"server_lr": 0.01, # 服务端学习率
"client_lr": 0.01, # 客户端学习率
"beta1": 0.9, # Adam 一阶矩系数
"beta2": 0.999, # Adam 二阶矩系数
"tau": 1e-3, # 适配率(防除零)
"client_epochs": 5, # 本地训练轮数
}双层学习率
FedOpt 有两个学习率:服务端学习率(控制聚合步长)和客户端学习率(控制本地训练步长)。通常服务端学习率较客户端大 1-10 倍。
tau 参数
tau 是 FedAdam 的关键超参数。tau 过小会导致自适应学习率过于激进,训练不稳定;tau 过大则退化为 FedAvg。建议从 1e-3 开始调参。