写在前面

机器学习系统越来越依赖真实用户数据:医疗图像、位置轨迹、搜索日志、推荐行为、设备传感器和文本交互都可能进入训练流程。数据越细,模型越容易学到有用模式,也越可能记住个体信息。攻击者不一定需要拿到原始数据,只要能访问模型输出、梯度更新或模型参数,就可能推断某个样本是否参与训练,甚至重构训练样本的部分特征。

差分隐私(Differential Privacy, DP)提供了一种可证明的隐私保护框架。它的核心目标不是让数据“绝对不可见”,而是限制单个个体对算法输出的影响:无论某个人的数据是否出现在数据集中,外部观察者看到输出后都不应显著改变对这个人的判断。

本文按“定义、机制、组合、机器学习实践”的顺序展开。重点不是堆概念,而是回答三个实践问题:

  1. $\epsilon,\delta$ 到底控制什么?
  2. 噪声为什么要按敏感度来加?
  3. 在深度学习中如何使用 DP-SGD,并避免常见误区?

1. 隐私风险从哪里来

1.1 成员推断攻击

成员推断攻击(membership inference attack)试图判断某条记录是否在训练集中出现过。若模型对训练样本的置信度系统性高于未见样本,攻击者就可以利用输出概率、损失值或预测排名进行判断。

例如,一个疾病风险预测模型若对某个病人的记录表现出异常高的确定性,攻击者可能推断该病人曾参与某个敏感医疗数据集。即便模型没有直接输出训练数据,这种参与关系本身也可能是隐私信息。

1.2 模型反演与梯度泄露

模型反演攻击(model inversion)尝试根据模型输出恢复输入特征;梯度泄露攻击则利用联邦学习或分布式训练中的梯度更新重构训练样本。研究表明,在小批量训练、过参数化模型和高维输入场景中,梯度可能携带大量样本信息。

联邦学习只能减少原始数据离开本地设备的风险,并不自动保证隐私。如果上传的梯度或模型更新没有额外保护,攻击者仍然可能从更新中推断本地数据。因此,联邦学习常与安全聚合、差分隐私和可信执行环境组合使用。

2. 差分隐私的形式化定义

2.1 相邻数据集

差分隐私比较的是两个相邻数据集 $D$ 和 $D^{\prime}$。常见定义有两种:

  • add/remove 邻接:$D^{\prime}$ 比 $D$ 多或少一条记录。
  • replace-one 邻接:$D$ 和 $D^{\prime}$ 记录数相同,但其中一条记录不同。

不同邻接定义会影响敏感度和隐私预算解释。阅读论文或工具文档时,需要确认使用的是哪一种。

2.2 $(\epsilon,\delta)$-差分隐私

随机算法 $M$ 满足 $(\epsilon,\delta)$-差分隐私,若对任意相邻数据集 $D,D^{\prime}$ 和任意输出集合 $S$,都有

$$ \Pr[M(D)\in S]\le e^\epsilon \Pr[M(D^{\prime})\in S]+\delta. $$

其中:

  • $\epsilon$ 控制输出分布的最大可区分程度。越小,隐私越强,噪声通常越大。
  • $\delta$ 是允许极小概率失败的松弛项。实际中通常要求 $\delta$ 小于数据集规模倒数,例如 $\delta < 1/n$ 或更严格。

当 $\delta=0$ 时,称为纯差分隐私(pure DP);当 $\delta>0$ 时,称为近似差分隐私(approximate DP)。深度学习中常用的是近似 DP,因为高斯机制和 DP-SGD 更自然地落在 $(\epsilon,\delta)$ 框架下。

2.3 隐私损失随机变量

为了理解 $\epsilon$,可以定义隐私损失:

$$ L(o)=\log\frac{\Pr[M(D)=o]}{\Pr[M(D^{\prime})=o]}. $$

差分隐私要求这个比值不要太大。也就是说,观察到输出 $o$ 后,攻击者不能非常确定地区分数据来自 $D$ 还是 $D^{\prime}$。这就是“保护个体参与”的数学形式。

DP Concept Graph
DP Concept Graph

3. 差分隐私的三个基本性质

3.1 后处理不损害隐私

如果 $M(D)$ 已经满足差分隐私,那么对输出再做任意不访问原始数据的函数处理 $f(M(D))$,仍然满足同样的差分隐私。这叫后处理性质(post-processing)。

这个性质很实用。例如模型训练时加入 DP 噪声后,后续把模型转换格式、压缩、部署、做推理接口封装,都不会额外消耗隐私预算。前提是这些步骤不再次访问未保护的训练数据。

3.2 组合会消耗隐私预算

如果对同一数据集重复运行多个 DP 算法,总隐私损失会累积。最简单的顺序组合为:

$$ \epsilon_{\text{total}}=\sum_i \epsilon_i. $$

实际机器学习中,训练会迭代很多步,因此不能简单地每一步都用很大的 $\epsilon$。DP-SGD 需要使用隐私会计(privacy accountant)来累计多轮采样、裁剪和加噪后的总隐私预算。常见会计方法包括 moments accountant、Rényi Differential Privacy (RDP) 和 Gaussian DP 等。

3.3 并行组合可以节省预算

如果不同 DP 查询作用在互不重叠的数据子集上,总隐私预算可以取最大值而不是求和。这叫并行组合。它在分组统计、分区查询和某些联邦学习场景中有用。

4. 敏感度:噪声尺度的来源

4.1 全局敏感度

对查询函数 $f:D\to \mathbb{R}^k$,其 $L_1$ 全局敏感度定义为

$$ \Delta_1 f=\max_{D,D^{\prime}}\lVert f(D)-f(D^{\prime})\rVert_1. $$

它表示改变一条记录时,查询结果最多会变化多少。差分隐私的噪声尺度不是随便选的,而是由敏感度和隐私预算共同决定。

例如,统计数据库中满足某条件的人数。改变一条记录最多让计数变化 1,因此敏感度为 1。若统计平均值,则必须先限制每个样本的取值范围,否则单个异常值可能让平均值变化非常大,敏感度无法控制。

4.2 裁剪是机器学习中的敏感度控制

深度学习中,单个样本的梯度范数可能很大。如果直接对梯度加噪,敏感度没有上界,无法给出有效 DP 保证。DP-SGD 的第一步就是对每个样本的梯度进行裁剪:

$$ \bar{g}_i = g_i \cdot \min\left(1,\frac{C}{\|g_i\|_2}\right), $$

其中 $C$ 是裁剪阈值。裁剪后每个样本对 batch 平均梯度的贡献被限制住,后续加高斯噪声才有意义。

5. 基本机制

5.1 拉普拉斯机制

对数值查询 $f(D)$,拉普拉斯机制输出

$$ M(D)=f(D)+\eta,\qquad \eta\sim \operatorname{Laplace}\left(0,\frac{\Delta_1 f}{\epsilon}\right). $$

噪声尺度为 $\Delta_1 f/\epsilon$。敏感度越大,需要的噪声越大;$\epsilon$ 越小,隐私越强,噪声也越大。

下面的代码可视化不同尺度的拉普拉斯分布:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import numpy as np
import matplotlib.pyplot as plt

def laplace_pdf(x, mu, b):
    return 0.5 / b * np.exp(-np.abs(x - mu) / b)

x = np.linspace(-10, 10, 1000)

for b in [0.5, 1.0, 2.0]:
    plt.plot(x, laplace_pdf(x, 0, b), label=f"b={b}")

plt.title("Laplace distribution with different scales")
plt.xlabel("noise")
plt.ylabel("density")
plt.legend()
plt.show()

实践建议:拉普拉斯机制适合简单统计查询,如计数、求和、直方图。用于均值时必须先裁剪或限制取值范围。

5.2 高斯机制

高斯机制输出

$$ M(D)=f(D)+\mathcal{N}(0,\sigma^2 I). $$

它通常用于 $(\epsilon,\delta)$-DP。与拉普拉斯机制相比,高斯噪声更适合 $L_2$ 敏感度和高维向量场景,因此在 DP-SGD 中更常见。

在机器学习中,加噪对象不是最终模型输出,而是每一步的裁剪后平均梯度:

$$ \tilde{g}=\frac1B\left(\sum_{i=1}^{B}\bar{g}_i+\mathcal{N}(0,\sigma^2 C^2 I)\right), $$

其中 $B$ 是 batch size,$C$ 是裁剪阈值,$\sigma$ 是 noise multiplier。

5.3 指数机制

当输出不是数值,而是类别、候选项或离散选择时,可以使用指数机制。设效用函数为 $q(D,r)$,衡量输出候选 $r$ 的好坏;其敏感度为 $\Delta q$。指数机制按如下概率采样:

$$ \Pr[M(D)=r]\propto \exp\left(\frac{\epsilon q(D,r)}{2\Delta q}\right). $$

效用越高的候选越容易被选中,但采样仍有随机性,从而限制单条记录对最终选择的影响。

典型应用包括:隐私保护的投票、选择最优模型、选择特征、选择聚类中心等。它的关键是设计效用函数,并控制该函数对单条记录的敏感度。

6. DP-SGD:深度学习中的差分隐私

6.1 标准 SGD 为什么不够

标准 SGD 每次用一个 batch 的梯度更新参数:

$$ \theta_{t+1}=\theta_t-\eta \frac1B\sum_{i=1}^{B}g_i. $$

如果某个样本梯度非常特殊,它可能显著影响更新方向。模型经过多轮训练后,可能记住该样本的模式。过拟合越严重,成员推断攻击通常越容易成功。

Model Inversion Attack
Model Inversion Attack

6.2 DP-SGD 的步骤

DP-SGD 每轮训练通常包含四步:

  1. 对 batch 中每个样本计算 per-sample gradient。
  2. 将每个样本梯度裁剪到范数不超过 $C$。
  3. 对裁剪后的梯度和加入高斯噪声。
  4. 用加噪后的平均梯度更新模型参数。

伪代码如下:

1
2
3
4
5
6
7
8
for each training step:
    sample a mini-batch
    for each example i:
        compute gradient g_i
        clip g_i to norm C
    add Gaussian noise to summed gradients
    average noisy gradients
    update model parameters

DP-SGD 的核心代价来自两部分:裁剪会改变真实梯度方向,噪声会增加优化方差。因此它通常会降低模型精度,尤其在数据量小、模型大、任务难或隐私预算很严格时更明显。

7. 用 Opacus 训练一个 DP 模型

7.1 最小代码结构

Opacus 是 PyTorch 生态中常用的 DP-SGD 工具。典型流程是先定义模型、优化器和 dataloader,然后用 PrivacyEngine 包装训练过程。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import torch
import torch.nn as nn
import torch.optim as optim
from opacus import PrivacyEngine

model = nn.Sequential(
    nn.Flatten(),
    nn.Linear(28 * 28, 128),
    nn.ReLU(),
    nn.Linear(128, 10),
)

optimizer = optim.SGD(model.parameters(), lr=0.05, momentum=0.9)
criterion = nn.CrossEntropyLoss()

privacy_engine = PrivacyEngine()
model, optimizer, train_loader = privacy_engine.make_private(
    module=model,
    optimizer=optimizer,
    data_loader=train_loader,
    noise_multiplier=1.1,
    max_grad_norm=1.0,
)

for epoch in range(epochs):
    model.train()
    for x, y in train_loader:
        optimizer.zero_grad()
        logits = model(x)
        loss = criterion(logits, y)
        loss.backward()
        optimizer.step()

    epsilon = privacy_engine.get_epsilon(delta=1e-5)
    print(f"epoch={epoch}, epsilon={epsilon:.2f}")

7.2 关键参数如何理解

参数 作用 调大后的影响 调小后的影响
noise_multiplier 高斯噪声强度 隐私更强,精度可能下降 精度可能更好,隐私变弱
max_grad_norm 梯度裁剪阈值 裁剪更少,但需要更大噪声 裁剪更强,可能欠拟合
batch size 每步样本数 梯度更稳定,但采样率变化会影响会计 噪声影响更明显
epochs 训练轮数 精度可能提升,但隐私预算消耗增加 隐私消耗少,但可能未收敛
learning rate 更新步长 收敛快但不稳定 稳定但可能慢

实践中不要只调 epsilon。更常见的流程是先设定隐私目标,再搜索 noise_multipliermax_grad_norm、batch size 和学习率。

7.3 一个可执行的调参顺序

  1. 先训练非 DP baseline,确认模型和数据管道正常。
  2. 固定模型结构和 batch size,加入 DP-SGD。
  3. max_grad_norm=1.0noise_multiplier=1.0 附近开始。
  4. 若训练 loss 不下降,先调学习率和裁剪阈值,不要马上降低噪声。
  5. 若 epsilon 太大,提高 noise multiplier 或减少 epochs。
  6. 若精度下降过多,尝试更小模型、更强正则、更好预训练或更大数据量。

8. 结果解释:精度下降不是失败

假设在 MNIST 上比较标准 SGD 和 DP-SGD,可能得到类似结果:

设置 测试准确率 隐私说明
标准 SGD 96% 左右 没有显式 DP 保证
DP-SGD 88% 到 92% 取决于 $\epsilon,\delta$ 和噪声强度

这种差距并不意外。DP 的目标不是免费提升泛化,而是在可接受性能下给出可审计的个体隐私保护。对于医疗、金融和用户行为数据,牺牲少量精度换取明确隐私边界通常是合理的工程选择。

需要避免一种错误表达:不能只说“我们加了噪声,所以保护隐私”。严谨表述应包含邻接定义、机制、$\epsilon,\delta$、隐私会计方法、训练轮数、采样率和裁剪阈值。

9. 常见误区

9.1 只对最终模型参数加噪

训练完成后再给模型参数加一点噪声,通常不能提供可靠 DP 保证。因为模型在训练过程中已经充分接触原始数据,可能已经记住敏感样本。DP-SGD 的关键是在每一步优化时控制单样本贡献并加噪。

9.2 不裁剪梯度就加噪

没有裁剪就没有稳定敏感度上界。噪声尺度无法校准,隐私保证也不成立。

9.3 只报告 epsilon,不报告 delta

$(\epsilon,\delta)$ 是一组参数。只报告 $\epsilon$ 会隐藏失败概率假设。还应报告数据集规模和 $\delta$ 的选取理由。

9.4 把 DP 当成防御所有攻击的方法

差分隐私主要限制个体参与信息泄露,不等于防止模型被盗、不等于防止提示注入、不等于防止训练数据本身被系统管理员看到。完整隐私系统通常还需要访问控制、加密、安全审计、数据最小化和合规流程。

10. 实践清单

如果要在项目中使用差分隐私,可以按下面清单推进:

  1. 明确保护对象:保护用户是否参与训练,还是保护具体属性值?
  2. 明确数据边界:一条 record 是一个样本、一个用户,还是一个用户的所有样本?
  3. 选择邻接定义:add/remove 还是 replace-one。
  4. 对输入做裁剪或范围限制,确保敏感度可控。
  5. 选择机制:简单统计用拉普拉斯或高斯机制;模型训练用 DP-SGD;离散选择用指数机制。
  6. 记录隐私会计方法和最终 $\epsilon,\delta$。
  7. 与非 DP baseline 对比,报告精度、训练稳定性和隐私预算。
  8. 做成员推断攻击评估,验证 DP 是否降低攻击成功率。
  9. 保留实验配置,确保隐私声明可复现。

11. 小结

差分隐私的核心思想是限制单条记录对输出分布的影响。敏感度决定噪声尺度,隐私预算控制可区分程度,组合定理解释多次查询或多轮训练时隐私如何累积。对于机器学习,DP-SGD 通过 per-sample gradient clipping 和 Gaussian noise 把这个思想嵌入优化过程。

实际使用 DP 时,最重要的是完整报告:数据邻接定义、裁剪阈值、噪声强度、采样率、训练轮数、会计方法和最终 $\epsilon,\delta$。只有这些信息齐全,隐私保证才是可解释、可复现、可审计的。

参考文献

[1] Cynthia Dwork. Differential Privacy. ICALP, 2006.

[2] Cynthia Dwork, Aaron Roth. The Algorithmic Foundations of Differential Privacy. Now Publishers, 2014.

[3] Frank McSherry, Kunal Talwar. Mechanism Design via Differential Privacy. FOCS, 2007.

[4] Martin Abadi, Andy Chu, Ian Goodfellow, H. Brendan McMahan, Ilya Mironov, Kunal Talwar, Li Zhang. Deep Learning with Differential Privacy. ACM CCS, 2016.

[5] Ilya Mironov. Rényi Differential Privacy. IEEE CSF, 2017.

[6] H. Brendan McMahan, Daniel Ramage, Kunal Talwar, Li Zhang. Learning Differentially Private Recurrent Language Models. ICLR, 2018.

[7] Nicholas Carlini, Chang Liu, Úlfar Erlingsson, Jernej Kos, Dawn Song. The Secret Sharer: Evaluating and Testing Unintended Memorization in Neural Networks. USENIX Security, 2019.

[8] Opacus Team. Opacus: User-Friendly Differential Privacy Library in PyTorch. Meta AI.

[9] Bangzhou Xin. Research on Differential Privacy Techniques in Machine Learning. University of Science and Technology of China, 2022.

[10] Xiaoguang Li, Hui Li, et al. A Survey on Differential Privacy. Journal of Information Security, 2018.