联邦学习基础:基本原理、训练流程、聚合算法
说起联邦学习,我先讲个小故事。几年前我参与一个医疗影像项目,数据在几家医院里,隐私法不让传出来。传统做法是把数据搬到一起训练,可这条路走不通。后来我们换了思路——数据不动,模型动。这就是联邦学习的核心。
说白了,就是让模型“出差”到每个客户端去学习,然后把学到的“心得”带回服务器汇总。客户端只传梯度或模型参数,原始数据始终不出本地。我刚开始接触时觉得这太理想了,直到亲手搭了一套才相信,真的可行。
基本原理:数据不动模型动
传统机器学习是“数据集中→模型训练→部署”。联邦学习反过来:模型分发→本地训练→参数聚合→模型更新。服务器维护一个全局模型,把它下发给参与方;每个参与方用自己的本地数据训练几轮,然后把更新后的参数(或梯度)加密上传;服务器用聚合算法把这些参数合并,生成新的全局模型。重复这个过程直到收敛。
这里有个关键点——通信代价。我在项目中遇到过,如果每轮都传完整模型,带宽根本扛不住。所以实际中常用梯度压缩、稀疏化或量化,我在后面的章节会详细讲。
联邦优化目标:minw Σk=1 (nk / N) · Fk(w)
其中 Fk(w) 是第k个客户端上的本地损失,nk/N 是数据量权重。
标准训练流程
我用一个典型的联邦学习循环来帮你梳理。下图是我画的流程图,建议你跟着走一遍。
流程不难理解:下发→训练→上传→聚合→下发,形成一个闭环。我建议你在纸上也画一遍,脑子里的印象会更深。
常见聚合算法
聚合算法是整个联邦学习的“大脑”。不同的算法决定了参数怎么合并、权重怎么分配。我用一张表总结一下主流算法,都是我实际用过或调研过的。
| 算法 | 核心思路 | 适用场景 | 缺点 |
|---|---|---|---|
| FedAvg | 按客户端数据量比例加权平均 | 数据分布均匀时效果很好 | 对Non-IID敏感,容易发散 |
| FedProx | 加一个近端项限制本地模型漂移 | 数据异构严重(Non-IID) | 需要调超参数μ |
| SCAFFOLD | 用控制变量纠正客户端漂移 | 高异构性、通信带宽有限 | 增加了计算和存储开销 |
| FedMA | 基于匹配层参数进行融合 | 模型结构异构(如不同网络层数) | 实现复杂,速度较慢 |
我个人最常用的是FedAvg,简单稳定。但如果你遇到数据分布差异很大的场景(比如不同医院的患者特征完全不同),FedProx会更可靠。我记得有一次在跨地域风控项目中,数据分布天差地别,直接用FedAvg精度掉了10个点,换成FedProx后才稳住。
代码示例:FedAvg聚合核心逻辑
下面是一段Python伪代码,我习惯用它快速验证聚合逻辑。注意这里只展示了服务器端的聚合,客户端的本地训练大家应该都会。
def fed_avg_aggregate(global_model, client_models, client_sizes):
"""
global_model: 全局模型(只保持结构,参数会被覆盖)
client_models: 各客户端更新后的模型参数列表
client_sizes: 各客户端本地数据样本数
"""
total_data = sum(client_sizes)
# 初始化全局梯度为零
global_params = {name: torch.zeros_like(param)
for name, param in global_model.named_parameters()}
for model, size in zip(client_models, client_sizes):
weight = size / total_data
for name, param in model.named_parameters():
global_params[name] += weight * param.data
# 把聚合后的参数加载回全局模型
with torch.no_grad():
for name, param in global_model.named_parameters():
param.data = global_params[name]
return global_model
实践中的坑
另外,数据量权重是个双刃剑。你想想看,如果某个客户端只有10条数据,但另一个有10万条,加权后小客户端的贡献几乎被淹没了。我一般会设置一个最小权重阈值,让每个客户端至少贡献1%的影响力,防止模型过度偏向大盘数据。
- 不要假设所有客户端都同步响应,用异步聚合策略更鲁棒。
- 检查客户端上传的参数是否损坏(比如NaN),我习惯在聚合前做一次数值校验。
- 通信压缩(如Top-K梯度)可以大幅提速,但要注意压缩比和收敛性之间的平衡。
- 如果客户端数量少(比如少于10),每一轮的随机性会很大,建议多跑几轮或使用外推技巧。
好了,以上就是联邦学习的核心基础。从原理到流程再到算法,我尽量把关键点都戳到了。下一节我们会深入讲如何在跨组织场景下做审计日志的联邦查询,到时候会用到这里的聚合思想。记住这些概念,后面会反复遇到。