SCAFFOLD:用控制变量修正客户端漂移
FreeGuideOnline
最新
2026-06-28
服务器
初始化 w, c = 0, 所有客户端 c_k = 0 (或延迟初始化) for 每轮 t = 1 to T: S = 随机采样 m 个客户端 发送 w, c 给 S 中每个客户端 对每个客户端 k ∈ S: (w_k, Δc_k) = ClientUpdate(k, w, c) w = w + (η_g / m) Σ_{k∈S} (w_k - w) # 模型聚合 c = c + (1/K) Σ_{k∈S} Δc_k # 控制变量聚合
ClientUpdate(k, w, c):
w_k = w
for step = 1 to τ:
从本地数据采样 mini-batch B
g = ∇F_k(w_k; B) # 随机梯度
g_tilde = g - c_k + c # 修正梯度
w_k = w_k - η * g_tilde
计算全梯度 c_k_new = ∇F_k(w) (或用大batch近似)
Δc_k = c_k_new - c_k
c_k = c_k_new # 本地持久化
return w_k, Δc_k