pFedMe
基于 Moreau Envelope 的个性化联邦学习框架,为每个用户学习专属模型参数,同时保护数据
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
基于 Moreau Envelope 的个性化联邦学习框架,为每个用户学习专属模型参数,同时保护数据
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
—— NeurIPS 2020 论文复现项目技术深度解析
在医疗影像诊断、金融风控建模等真实场景中,数据天然分布在不同的医院、银行终端——由于隐私法规和商业竞争,这些数据无法被集中到一处。联邦学习(Federated Learning, FL)应运而生:各终端在本地训练模型,仅上传梯度而非原始数据,由中央服务器聚合全局模型。
然而,经典联邦学习算法(如 FedAvg)学到的只是一个平均模型——它对所有客户端一视同仁,却忽视了每个终端用户数据分布的独特性。一位使用手写输入法的主力用户,与一位习惯拼音输入法的用户,他们贡献的训练数据模式截然不同,强行用同一个全局模型服务所有人,效果必然打折扣。
pFedMe(Personalized Federated Learning with Moreau Envelopes) 正是为解决这一矛盾而生:它不追求一个放之四海而皆准的全局模型,而是为每个用户学习一套个性化的模型参数,同时仍然利用联邦架构保护数据隐私。该项目由新加坡国立大学(NUS)研究团队实现,发表于人工智能顶级会议 NeurIPS 2020,GitHub 累计获得 311 颗星、90 次分叉。

图1:pFedMe 在 MNIST 数据集上的性能对比(来源:项目 README 原始实验图)
pFedMe 的技术核心在于将个性化问题建模为一个双层优化(bi-level optimization)问题,并用 Moreau Envelope(莫罗包络)来高效求解。
传统 FedAvg 的目标是直接最小化所有客户端的全局损失函数。而 pFedMe 引入了一个巧妙的分解:
内层优化(客户端本地):每个客户端在本地数据上,针对自己的个性化参数 theta_i 做 K 步梯度下降。这里的 theta_i 不是直接上传到服务器的参数,而是一个个性化模型的表现。
外层优化(服务器聚合):服务器聚合的并非各客户端的最终个性化参数,而是通过 Moreau Envelope 定义的邻近算子对所有客户端的个性化参数做加权平均,生成一个更稳定的全局参考点。
Moreau Envelope 的物理含义可以这样理解:它就像一块弹性垫,每个客户端的个性化参数 theta_i 在上面振动,最终会被这个弹性力拉回到一个兼顾全局一致性和局部适应性的平衡位置。这避免了客户端过于特立独行(过拟合本地数据),也避免了模型过于随波逐流(失去个性化能力)。
在 FLAlgorithms/users/userpFedMe.py 的 train() 方法中,双层优化的内层循环被实现得非常直观:
# K = 30, 即内层做 30 步个性化梯度下降
for i in range(self.K):
self.optimizer.zero_grad()
output = self.model(X)
loss = self.loss(output, y)
loss.backward()
# pFedMeOptimizer 内部使用 Moreau Envelope 邻近算子
self.persionalized_model_bar, _ = self.optimizer.step(self.local_model)
# 用学习率 eta 和正则化参数 lambda 将个性化模型拉回全局参考
for new_param, localweight in zip(self.persionalized_model_bar, self.local_model):
localweight.data = localweight.data - self.lamda * self.learning_rate * (localweight.data - new_param.data)
这段代码的精髓在于 self.lamda(正则化系数 lambda):它控制了每个用户的个性化程度与全局一致性之间的平衡。当 lambda 很大时,Moreau Envelope 的效应更强,个性化参数被强力拉向全局均值;当 lambda 较小时,每个用户可以更自由地偏离全局模型,形成更激进的个性化。
项目同时实现了三种算法进行横向对比:
| 算法 | 个性化策略 | 核心机制 |
|---|---|---|
| FedAvg | 无个性化 | 简单加权平均本地模型 |
| Per-FedAvg | 近端梯度 | 借助 FedProx 的正则项实现个性化 |
| pFedMe | Moreau Envelope | 通过 Moreau Envelope 的邻近算子实现更平滑、更稳定的个性化 |
从实验结果来看,pFedMe 在 MNIST 和 Synthetic 数据集的非独立同分布(Non-IID)场景下,相比 FedAvg 取得了显著的精度提升,验证了 Moreau Envelope 机制的有效性。
项目采用经典的联邦学习三层架构:Server(服务器端)-> User(客户端)-> Model(模型层),结构清晰,易于扩展。
CharlieDinh/pFedMe/
├── main.py # 实验入口,支持多算法/多数据集对比
├── main_plot.py # 实验结果可视化
├── requirements.txt # 依赖清单
├── FLAlgorithms/
│ ├── optimizers/
│ │ └── fedoptimizer.py # pFedMe 专用优化器(Moreau Envelope 实现)
│ ├── servers/
│ │ ├── serverbase.py # 服务器基类(参数广播、聚合)
│ │ ├── serverpFedMe.py # pFedMe 服务器(个性化聚合逻辑)
│ │ ├── serveravg.py # FedAvg 服务器
│ │ └── serverperavg.py # Per-FedAvg 服务器
│ ├── users/
│ │ ├── userbase.py # 客户端基类
│ │ ├── userpFedMe.py # pFedMe 客户端(个性化训练循环)
│ │ ├── useravg.py # FedAvg 客户端
│ │ └── userperavg.py # Per-FedAvg 客户端
│ └── trainmodel/
│ └── models.py # 模型定义(CNN/Logistic/DNN/VGG)
├── data/ # 数据集目录(MNIST/Synthetic/CIFAR-10)
├── utils/
│ ├── model_utils.py # 数据加载、Non-IID 分区生成
│ └── plot_utils.py # Matplotlib 可视化工具
└── results/ # 实验结果(.h5 格式)
项目内置了多种神经网络模型,覆盖从轻量逻辑回归到 VGG 家族:
联邦学习的核心挑战是 Non-IID(非独立同分布)数据——各客户端数据分布不同。项目实现了完整的数据分区逻辑:
数据分区通过 utils/model_utils.py 中的 read_cifa_data() 和 generate_niid_* 脚本完成,无需手动预处理。
git clone https://github.com/CharlieDinh/pFedMe.git
cd pFedMe
pip3 install -r requirements.txt
依赖包含:numpy、scipy、torch、torchvision、Pillow、matplotlib、tqdm,均为常见科学计算库,无特殊 C 扩展依赖。
cd data/Mnist
python3 generate_niid_20users.py # 生成非独立同分布 MNIST
这会在 data/Mnist/ 下生成 20 个用户的分区数据,每个用户只有部分数字类别。
# 强凸场景(MNIST + 逻辑回归)
python3 main.py \
--dataset Mnist --model mclr \
--batch_size 20 --learning_rate 0.005 \
--personal_learning_rate 0.1 --beta 1 --lamda 15 \
--num_global_iters 800 --local_epochs 20 \
--algorithm pFedMe --numusers 5 --times 10
其中关键参数 --lamda(lambda)和 --personal_learning_rate 控制 Moreau Envelope 的强度和个性化学习率。项目建议每个配置至少跑 10 次(--times 10)取平均以消除随机性。
修改 main_plot.py 中的参数配置(与实验参数对应),然后运行:
python3 main_plot.py
结果将绘制各算法在训练精度、测试精度、损失曲线上的对比图。
虽然这是一个研究性质的项目而非生产级部署,但其 GPU 训练需求值得关注:
由于每个全局轮次需要所有客户端依次训练,加上 Non-IID 数据需要生成和加载,项目整体属于计算密集型研究工具。
作为 2020 年的工作,pFedMe 为后续研究提供了多个可扩展点:
pFedMe 项目的核心价值在于:它用 Moreau Envelope 为联邦学习中的个性化与全局一致性提供了一个优雅的数学框架,并通过 PyTorch 实现得简洁易读。对于想深入理解联邦学习个性化机制的学者和工程师,这个项目提供了从论文算法到可运行代码的完整映射。
虽然它是一个学术研究代码库而非工程级产品,但在数据隐私日益受到重视的背景下,pFedMe 所探索的如何在保护隐私的同时实现个性化服务这一命题,正变得越来越重要。项目同时提供了 FedAvg 和 Per-FedAvg 的完整实现,便于研究者进行横向对比,是联邦学习入门和进阶的优质学习资源。