跳转到内容

DP-SGD 2016 — 给深度学习训练加上差分隐私保护

待复核

你去医院体检,医院想用你的数据训练一个 AI 模型来帮未来的病人。你担心模型”记住”了你的检查结果——别人用特殊手段问模型几个问题,就能反推出你得过什么病。DP-SGD 就是解决这个问题的:它在训练过程中给每一步梯度更新加上精心计算的噪声,让最终模型”学到了群体规律,却记不住任何一个人的数据”。

技术定义:DP-SGD(Differentially Private Stochastic Gradient Descent)是 Abadi 等人 2016 年在 CCS 会议上提出的算法。它在标准 SGD 的基础上加入两步操作——逐样本梯度裁剪(per-sample gradient clipping)和高斯噪声注入(Gaussian noise addition),使得整个训练过程满足 (epsilon, delta)-差分隐私。论文同时提出了 moments accountant(矩会计)方法,能比经典组合定理更紧地追踪多轮迭代的隐私损失。

不理解 DP-SGD,下面这些事都没法解释:

  • 为什么 Apple、Google、Meta 能声称”用了你的数据训练模型但没有泄漏你的隐私”——他们的训练管线里嵌入了 DP-SGD 或其变体
  • 为什么 pytorch 的 Opacus 库和 tensorflow 的 TF Privacy 库存在——它们就是 DP-SGD 的工程实现,用一行代码把普通训练变成差分隐私训练
  • 为什么差分隐私模型的精度总是比普通模型低几个点——裁剪和加噪不可避免地丢掉信息,这是隐私保护的代价
  • 为什么训练轮数越多隐私预算消耗越快——每轮都会”花掉”一点 epsilon,moments accountant 就是帮你精确记账的工具
  • 为什么 mironov-renyi-dp-2017 的 Renyi 差分隐私后来取代了 moments accountant 成为主流隐私会计——因为 Renyi DP 给出了更紧的组合界,本质思路却一脉相承

读这篇论文需要先理解三个概念:

  • 差分隐私(DP)dwork-dp-2006 提出的隐私定义——对数据集增删一个人,算法输出的概率分布变化不超过 e^epsilon 倍。DP-SGD 把这个保证应用到深度学习训练过程上。
  • 随机梯度下降(SGD):深度学习最基础的优化算法。每次从数据里抽一小批(mini-batch),算梯度,更新模型参数。DP-SGD 在”算梯度”和”更新参数”之间插入了裁剪和加噪两步。
  • 组合定理:差分隐私有一条核心规则——如果你对同一份数据做了 k 次隐私查询,总隐私损失会随 k 增长。经典组合定理说总损失线性增长(k * epsilon),高级组合定理改善到 O(epsilon * sqrt(k))。DP-SGD 的 moments accountant 进一步收紧了这个增长。

DP-SGD 的整个算法可以拆成 四步

  1. 抽样(Poisson 子采样):每轮训练不是固定取一个 mini-batch,而是对每条数据独立地以概率 q 决定”这轮选不选你”。类比:不是老师点名叫 32 个同学回答,而是每个同学自己掷骰子决定这轮举不举手。子采样本身就带来一层隐私放大——因为攻击者不知道你这轮有没有被选中。

  2. 逐样本梯度裁剪:对被选中的每条数据,单独算它对模型参数的梯度 g_i,然后把 g_i 的 L2 范数限制在阈值 C 以内。如果 ||g_i|| > C,就把 g_i 等比例缩小到长度 C。类比:每个人的嗓门有大有小,裁剪就是给每个人发一个固定音量的话筒——不管你本来声音多大,最终输出不会超过话筒的最大音量。这一步的作用是限制单条数据对模型更新的最大影响(sensitivity)。

  3. 高斯噪声注入:把裁剪后的所有梯度求和,再加上标准差为 sigma * C 的高斯噪声。噪声量与裁剪阈值 C 成正比——C 越大每个人影响越大,就需要更多噪声来掩盖。类比:全班掷了骰子举手的同学把限了音量的答案加在一起,老师再往总和里倒入一勺”杂音粉”,确保任何一个人的声音都淹没在噪声里。

  4. 隐私会计(moments accountant):每轮训练消耗一点隐私预算,论文提出用矩生成函数(moment generating function)来追踪 T 轮训练后的总隐私损失。比经典的高级组合定理更紧,在实际参数下能省 2-10 倍的隐私预算。后来被 mironov-renyi-dp-2017 的 Renyi DP 进一步统一和简化。

一句话总结:裁剪限制单人影响 → 加噪掩盖个体信号 → 会计精确记账 → 三者协作让深度学习训练满足差分隐私。

案例 1:用 PyTorch Opacus 训练隐私 MNIST 分类器

Section titled “案例 1:用 PyTorch Opacus 训练隐私 MNIST 分类器”

pytorch 的 Opacus 库把 DP-SGD 封装成了三行代码的改动:

from opacus import PrivacyEngine
# 原来的训练代码不变,只加这几行
privacy_engine = PrivacyEngine()
model, optimizer, data_loader = privacy_engine.make_private(
module=model,
optimizer=optimizer,
data_loader=train_loader,
noise_multiplier=1.1, # sigma,噪声倍数
max_grad_norm=1.0, # C,裁剪阈值
)
# 训练循环和以前一样,只是每个 batch 要拆出输入和标签
for inputs, labels in data_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step() # 内部自动做裁剪+加噪
# 训练完查看花了多少隐私预算
epsilon = privacy_engine.get_epsilon(delta=1e-5)
print(f"训练完成,epsilon = {epsilon:.2f}")

Opacus 在 optimizer.step() 内部自动完成”逐样本裁剪 → 求和 → 加噪 → 更新”四步。inputs, labels 来自普通 PyTorch dataloader,先清空上一轮梯度再反传;noise_multiplier 对应论文的 sigma,max_grad_norm 对应裁剪阈值 C。训练完后用 get_epsilon 查看实际消耗的隐私预算。

C 太小——有用的梯度信息被截断太多,模型学不到东西。C 太大——sensitivity 高,需要加的噪声更多,照样学不好。实践中的经验法则:

  1. 先不加噪声训练几轮,统计每个样本梯度的 L2 范数分布
  2. 取分位数(通常是中位数或 75% 分位数)作为 C
  3. 上线后在 epsilon 和精度之间微调

这就像调话筒音量——太低什么都听不见,太高杂音太大。论文实验中 C = 1.0 是一个常用起点。

案例 3:CIFAR-10 上的隐私-精度权衡

Section titled “案例 3:CIFAR-10 上的隐私-精度权衡”

论文在 CIFAR-10 上的实验结果:

  • 不加隐私保护:测试准确率约 86%
  • epsilon = 8(较宽松隐私):准确率约 73%
  • epsilon = 2(较强隐私):准确率约 67%

隐私越强(epsilon 越小),精度损失越大。但即使 epsilon = 8,模型仍然”有用”——这在 2016 年是突破性的,因为之前大家普遍认为差分隐私会让深度学习模型完全不可用。

案例 4:为什么不能用 batch 梯度代替逐样本梯度

Section titled “案例 4:为什么不能用 batch 梯度代替逐样本梯度”

普通 SGD 算的是 mini-batch 里所有样本梯度的平均。但 DP-SGD 需要先对每个样本单独裁剪,再求和加噪。如果直接对 batch 平均梯度裁剪,无法限制单个样本的贡献——一个极端样本可能主导整个 batch 的梯度方向,隐私保证就失效了。

这也是 Opacus 和 TF Privacy 实现中最大的工程挑战之一:标准深度学习框架不支持高效计算逐样本梯度。Opacus 用了梯度钩子(per-sample gradient hooks)来解决,但训练速度通常比普通 SGD 慢 2-5 倍。

  1. 混淆”模型加噪”和”梯度加噪”:DP-SGD 不是训练完了往模型参数上撒一层噪声——那没有隐私保证。它是在每一步梯度更新时加噪,让整个训练轨迹都满足差分隐私。前者像给照片加滤镜糊住隐私,后者像在拍照时就对着毛玻璃拍。

  2. 忘了逐样本裁剪直接对 batch 裁剪:这会让 sensitivity 计算错误。单个异常样本可能贡献巨大梯度,如果只限制 batch 总梯度,那个异常样本的隐私就没被保护。必须先裁剪每个人的,再加总。

  3. epsilon 和 delta 选多少没概念:epsilon 通常在 1-10 之间算”合理”,delta 应远小于 1/n(n 是训练样本数)。epsilon = 100 基本没有实质隐私保护,epsilon < 1 则需要大量数据和训练技巧才能维持模型可用性。

  4. 以为 DP-SGD 能防所有攻击:DP-SGD 保证的是差分隐私定义下的隐私——即增删一个人对输出分布影响有限。它不能防止模型学到数据中的统计规律被利用(比如模型学到”癌症与年龄正相关”),也不能防止训练数据本身的偏见被模型继承。

  5. 忽略超参数也会泄漏隐私:如果你用验证集来调 C 和 sigma,验证集上的信息也可能泄漏。严格来说,超参数选择过程也需要被纳入隐私预算。实践中常用公开数据集预选超参数,或把调参过程的隐私消耗也计入 epsilon。

适用

  • 用敏感数据训练模型——医疗记录、金融交易、位置轨迹等个人数据
  • 需要对外发布模型或模型 API 的场景——差分隐私保证即使攻击者完全访问模型也无法反推个体数据
  • 联邦学习中保护用户梯度——每个客户端用 DP-SGD 裁剪加噪后再上传梯度,防止服务端窥探个体信息
  • 合规需求——GDPR/CCPA 等法规要求的数据保护,差分隐私提供可量化的隐私保证
  • 大规模数据集——样本越多,噪声的相对影响越小,模型精度越接近非隐私版本

不适用

  • 小数据集(< 1000 条)——噪声会淹没有用信号,模型基本学不到东西
  • 需要记住个体特征的任务——比如人脸识别想让模型认出”张三的脸”,这本身就和差分隐私矛盾
  • 数据已经是公开的——公开数据没有隐私可保护,加噪只会白白降低精度
  • 推理阶段(inference only)——DP-SGD 保护的是训练过程;如果模型已经训练好且没用 DP-SGD,事后加噪无法弥补
  • 需要极高精度的安全关键系统——如自动驾驶的感知模型,隐私保护带来的精度损失可能不可接受
  • 2006 年:Dwork 等人在 TCC 和 ICALP 上定义了差分隐私。此时大家主要讨论的是统计查询和简单函数,没人认真考虑过”深度学习 + 差分隐私”——因为深度学习本身还没火。
  • 2013 年duchi-local-dp-2013 证明了本地差分隐私的统计极限。同年 Dwork 和 Roth 出版了差分隐私的教科书,但里面没有一章是关于深度学习的。
  • 2014 年erlingsson-rappor-2014 在 Chrome 里部署了本地差分隐私。此时隐私保护还局限在简单的频率统计,和深度学习不搭界。
  • 2016 年:Abadi 带领 Google Brain 和 Google 隐私团队的合作,在 CCS 上发表了 DP-SGD 论文。关键贡献是证明了”差分隐私深度学习不是空谈”——MNIST 和 CIFAR-10 上的实验表明精度损失在可接受范围内。论文同时开源了 TensorFlow Privacy 的前身代码。
  • 2017 年:Mironov 提出 Renyi 差分隐私,统一了 moments accountant 的分析框架。此后 DP-SGD 的隐私会计逐渐从 moments accountant 迁移到 RDP。
  • 2019 年:Facebook(Meta)开源 Opacus 库,让 PyTorch 用户也能用上 DP-SGD。从此”给训练加隐私保护”变成了一行代码的事。
  • 2020s 年:DP-SGD 成为隐私 ML 的标准方法,Apple、Google、Microsoft 的生产系统中广泛使用。研究重点转向降低精度损失(如 DP-FTRL、pre-training with public data 后 DP fine-tuning)。
  1. 差分隐私深度学习是可行的——2016 年前这被很多人怀疑,Abadi 用实验证明了在合理的 epsilon 下模型仍然有用。

  2. 裁剪 + 加噪 = 限制影响 + 掩盖个体——这个两步范式不仅用于 SGD,后来扩展到了 Adam、联邦学习、强化学习等场景。核心思想是一样的:先限制单个样本能施加的最大影响,再用噪声淹没这点影响。

  3. 隐私会计是实用化的关键——如果用简单组合定理,训练 1000 步后 epsilon 就爆炸了。moments accountant 和后来的 Renyi DP 把预算控制在合理范围内,才让大模型训练成为可能。

  4. 精度 vs 隐私是工程决策——没有”正确的 epsilon”,只有”适合场景的 epsilon”。epsilon = 1 不一定比 epsilon = 8 好——取决于数据敏感度、攻击模型、和你能接受多少精度损失。

  5. 基础设施先行——论文配套开源了 TF Privacy 前身代码,后来 Opacus 跟进,降低了使用门槛。好的隐私算法如果没有好的工具库支撑,工业界不会采用。

  • dwork-dp-2006 —— 差分隐私定义的源头,DP-SGD 把它从统计查询扩展到深度学习训练
  • duchi-local-dp-2013 —— 本地差分隐私的理论极限;DP-SGD 是中心化模型的方案,与 LDP 互补
  • mironov-renyi-dp-2017 —— 统一了 moments accountant 的隐私分析框架,让 DP-SGD 的隐私追踪更精确
  • erlingsson-rappor-2014 —— Google 的本地 DP 系统,和 DP-SGD 分别解决数据收集和模型训练两个阶段的隐私
  • pytorch —— Opacus 库将 DP-SGD 封装为 PyTorch 原生组件
  • tensorflow —— TF Privacy 库是 DP-SGD 最早的工程实现