Differential-Privacy-Based-Federated-Learning
用 PyTorch 完整实现差分隐私与联邦学习的交叉领域,复现 Laplace/Gaussian/M
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用 PyTorch 完整实现差分隐私与联邦学习的交叉领域,复现 Laplace/Gaussian/M
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一个医院集团:每家医院都有大量疑难病例数据,单独来看价值有限,但汇总起来足以训练出精准的疾病预测模型。传统做法是把数据汇总到中心服务器——但这触碰了患者隐私红线。联邦学习(Federated Learning)的出现让医院可以在不出让原始数据的前提下,共同训练一个共享模型。然而,这还远远不够:攻击者可以通过分析模型参数的梯度更新,反向推断出训练数据的敏感信息。这就是差分隐私联邦学习(DP-FL)要解决的问题。
wenzhu23333/Differential-Privacy-Based-Federated-Learning 是一个聚焦于差分隐私与联邦学习交叉领域的开源实现项目,由独立研究者 wenzhu23333 于 2022 年 3 月创建,目前拥有 423 颗 GitHub Stars 和 67 个 Fork。该项目用 PyTorch 完整复现了 DP-FL 的核心机制,被广泛应用于学术研究和教学场景。

图1:MNIST 数据集上,高斯机制(Simple Composition)在不同隐私预算 ε 下的训练准确率随轮次变化曲线。可以看到隐私预算越大(ε 值越大),模型准确率越高,这直观地反映了隐私与效用之间的权衡关系。
差分隐私的核心理念来自密码学家 Cynthia Dwork 在 2006 年提出的理论框架:即使攻击者掌握了某条数据以外的所有信息,也无法判断这条数据是否存在于数据集中。这听起来像哲学命题,但可以用一个精确的数学不等式来定义。
差分隐私的正式定义是:对于两个只差一条数据的相邻数据集 D 和 D',一个随机化算法 M 对它们产生相同输出的概率比值被控制在 exp(ε) 以内,即:
Pr[M(D) ∈ S] ≤ exp(ε) · Pr[M(D') ∈ S]
其中 ε(epsilon)是隐私预算,控制隐私泄露的上界;δ(delta)是松弛项,处理概率极小的"灾难性泄露"。ε 越小,隐私保护越强,但可用性越低——这是一个根本性的权衡(Trade-off)。
在实际机器学习中,差分隐私通常通过向梯度或参数注入精心校准的噪声来实现。项目实现了两种经典噪声注入机制:
1. 拉普拉斯机制(Laplace Mechanism):向模型参数添加服从拉普拉斯分布的噪声,噪声的尺度参数由敏感度(sensitivity)和隐私预算共同决定。代码实现简洁:
def Laplace(epsilon):
return 1 / epsilon
项目使用 L1 范数裁剪,适用于需要强隐私保障的场景。
2. 高斯机制(Gaussian Mechanism):添加高斯分布噪声,配合更精细的隐私会计(Privacy Accountant)来追踪累积隐私消耗。项目实现了两种高斯机制变体:
def Gaussian_Simple(epsilon, delta):
return sqrt(2 * log(1.25 / delta)) / epsilon
def Gaussian_MA(epsilon, delta, q, epoch):
return compute_noise(1, q, epsilon, epoch, delta, 1e-5)
后者调用了 TensorFlow Privacy 库中的 compute_noise_from_budget_lib,实现上借助了 Google 的成熟方案。

图2:Moment Accountant 机制下的 MNIST 准确率曲线。相比 Simple Composition,Moments Accountant 能够更紧凑地追踪隐私消耗,在相同隐私预算下通常能获得更高的模型效用。
联邦学习的核心循环由三个角色组成:中央服务器(Server)、多个客户端(Client)、以及共享模型(Global Model)。本项目的工程实现遵循这个范式:
项目提供了完整的 PyTorch 模型定义:
class CNNMnist(nn.Module):
def __init__(self, args):
super(CNNMnist, self).__init__()
self.conv1 = nn.Conv2d(args.num_channels, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.conv2_drop = nn.Dropout2d()
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, args.num_classes)
支持的模型涵盖图像分类(CNN)和文本处理(LSTM),覆盖了联邦学习的主流应用场景。
项目支持的训练数据集包括:MNIST(手写数字,IID 和 Non-IID 两种划分)、CIFAR-10(彩色图像,IID 和 Non-IID 划分)、FEMNIST(手写字母/数字,含大量子群体异质性,是联邦学习的经典 Non-IID 数据集)、Fashion-MNIST(服饰图像)、Shakespeare(莎士比亚作品文本,用于 LSTM 下一字符预测)。
这种多数据集覆盖的设计非常有教学价值:研究者可以通过控制数据集类型、采样策略(IID vs Non-IID)、DP 机制类型和隐私预算参数,系统性地观察不同条件下的收敛行为和精度-隐私权衡曲线。run.sh 脚本预先配置了数十组实验参数组合,开箱即可复现论文级别的结果。

图3:拉普拉斯机制下的 MNIST 准确率实验。拉普拉斯噪声的尺度与隐私预算 ε 直接相关,ε=10 时噪声最强,准确率明显下降;ε=100 时接近无噪声联邦学习的性能。
DP-FL 中最容易被忽视但又至关重要的概念是隐私会计(Privacy Accounting):每次模型更新都会消耗隐私预算,而这个消耗是不可逆的。Moments Accountant 是目前学术界最流行的会计方法,它通过追踪噪声分布的矩(moments)来获得比 Naive 组合定理更紧凑的隐私损失上界。
本项目的 LocalUpdateDP 类在训练循环中精确实现了这一逻辑:
def calculate_noise_scale(self):
if self.args.dp_mechanism == 'MA':
return Gaussian_MA(epsilon=self.args.dp_epsilon, delta=self.args.dp_delta,
q=self.args.dp_sample, epoch=self.times)
其中 q = dp_sample 是每轮的采样比例(通常是 1%~10%),epoch 是本地更新轮数(必须为1)。这些参数共同决定了最终噪声规模。
1. 隐私预算的有限生命周期:一旦隐私预算耗尽,模型就无法继续训练。对于需要持续更新的生产系统,需要在隐私预算耗尽前规划数据刷新策略。
2. Non-IID 数据的挑战:在真实世界的联邦学习中,各客户端数据分布往往差异极大(Non-IID)。项目虽然支持 Non-IID 划分,但高异质性会导致收敛不稳定,需要更复杂的聚合策略(如 FedProx、 SCAFFOLD)来缓解。
3. 通信效率:每次通信都需要传输完整的模型梯度或参数更新,对于超大模型(如 LLM)开销巨大。后续工作如 FedNova、FedKD 等专注于减少通信量。
4. 个性化与隐私的两难:用户个性化模型(Personalized FL)虽然能提升各端体验,但每个用户的个性化参数本身也可能泄露隐私,当前项目的实现尚未覆盖这一方向。
5. 代码版本维护:项目依赖较旧的 PyTorch 1.12.1 和 Python 3.6,与最新生态存在兼容差距,GPU 支持依赖 CUDA 11.6 的 wheel 包,新硬件兼容性受限。
差分隐私联邦学习正处于从学术研究走向工业落地的关键阶段。Google 在 Android 键盘预测模型中率先大规模部署了 DP-FL;Apple 将差分隐私用于改善 QuickType 建议和 emoji 推荐;医疗领域如多家医院联盟尝试用 DP-FL 训练疾病预测模型,在保护患者隐私的同时实现跨机构协作。
本项目作为教学与研究工具的价值在于:它是少数能够一键跑通从隐私预算设定→梯度裁剪→噪声注入→模型聚合完整链路的开源实现,对于想要理解 DP-FL 内部机制的研究者和工程师来说,是一个不可多得的起点。423 颗 Stars 印证了社区对这一交叉领域工具的强烈需求。
核心技术栈:Python 3.6 / PyTorch 1.12.1 / Opacus(差分隐私训练库)/ TensorFlow Privacy(隐私会计)/ NumPy / Matplotlib
支持的 DP 机制:Laplace / Gaussian (Simple Composition) / Gaussian (Moments Accountant)
支持的数据集:MNIST / CIFAR-10 / FEMNIST / Fashion-MNIST / Shakespeare
许可证:GPL-3.0