第二讲:差分隐私的基本定义
好,咱们直接进入正题。
上一章我聊了为什么需要差分隐私——说白了,就是防止“根据查询结果倒推出某个人在不在数据集里”。这一章我们来啃定义。我知道很多人一看到数学公式就头疼,但差分隐私的核心定义其实没那么复杂。
我个人习惯把形式化定义拆成两层来理解:纯ε-差分隐私和它的“兄弟”(ε,δ)-差分隐私。前者是理想标准,后者是现实工程中的妥协方案。
2.1 纯 ε-差分隐私:最干净的定义
我们先来看最原始、最严格的形式。
形式化定义(ε-差分隐私)
给定一个随机算法 M: D → R,对于任意两个相邻数据集 D 和 D'(相差一条记录),以及任意输出子集 S ⊆ R,如果满足:
Pr[M(D) ∈ S] ≤ e^ε · Pr[M(D') ∈ S]
则称算法 M 满足 ε-差分隐私。
这里面的几个关键词我得给你讲透。
- “相邻数据集”:D 和 D' 只有一条记录不同。这是我做项目时最容易搞混的地方——是“相差一条”,不是“完全不一样”。
- “随机算法 M”:为什么强调随机?如果算法是确定性的,比如直接输出“张三患病”,那改一条记录就能看出差异。差分隐私靠的是随机扰动,让输出“飘忽不定”。
- “隐私预算 ε”:这个参数决定隐私保护力度。ε 越小,保护越强——输出对单条记录变化越不敏感。反之,ε 越大,保护越弱。
我刚开始做差分隐私时,曾误解过 ε 的含义。以为 ε=0 才安全。后来才发现,ε=0 意味着输出完全独立于数据——那你还查什么?ε 是一个权衡参数。实际操作中,ε 在 0.1 到 10 之间比较常见,取决于场景敏感度。
速记技巧
你可以把 e^ε 理解成“隐私损失比”。比如 ε=ln2≈0.693,意味着任意两个人的查询结果概率差异不超过 2 倍。差异越小,攻击者越难区分。
2.2 插曲:为什么需要 (ε,δ)-差分隐私?
纯 ε-DP 很漂亮,但现实世界不给面子。
我遇到过这样一个场景:数据集统计量分布特别稀疏,某些查询的敏感度极高。如果用纯 ε-DP,噪声会大到结果毫无意义。另外,像高斯机制这种噪声分布——它有无穷支撑,理论上总有一个微小的概率会让隐私保护“失效”。
这时候,我们需要允许“一点点的失败概率”。这就是 δ 存在的意义。
2.3 (ε,δ)-差分隐私:工程视角的妥协
形式化定义((ε,δ)-差分隐私)
如果对于任意相邻数据集 D 和 D',以及任意输出子集 S ⊆ R,满足:
Pr[M(D) ∈ S] ≤ e^ε · Pr[M(D') ∈ S] + δ
则称算法 M 满足 (ε,δ)-差分隐私。
区别在哪?多了一个加项 δ。δ 表示“允许违反 ε-差分隐私的最大概率”。
你想想看,纯 ε-DP 要求对 所有可能的输出事件,概率比都严格不超过 e^ε。而 (ε,δ)-DP 允许有 δ 概率的输出事件,其概率比可以大于 e^ε,甚至无穷大。但这不是无限放纵——δ 必须足够小,通常取 1/n² 甚至更小,其中 n 是数据集大小。
| 特征 | ε-差分隐私 | (ε,δ)-差分隐私 |
|---|---|---|
| 保证强度 | ,零例外 | 概率性,允许 δ 概率例外 |
| 主要机制 | 拉普拉斯、指数 | 高斯、高效组合 |
| 适用场景 | 高敏感度、审计合规 | 高维数据、频繁查询 |
| δ 典型取值 | 无 | 1/n² 或 10⁻⁶ 以下 |
避坑指南:δ 不是廉价参数
我曾经在项目中看到有人把 δ 设为 0.01,觉得“就 1% 的风险,没事”。这是灾难。对于包含 10 万条记录的数据集,1% 意味着 1000 条记录可能被完全暴露。实际操作中,δ 必须远小于 1/n,这是个硬性规则。
2.4 两种定义的关系与实际选择
两种定义之间其实有个包含关系:
- ε-差分隐私 ⇔ (ε,0)-差分隐私(δ=0 的特例)
- 所有 ε-DP 算法自动满足 (ε,δ)-DP
- 但反过来不成立
我做实际系统时,会这样选:
- 优先尝试纯 ε-DP——如果噪声大小可以接受,直接用拉普拉斯机制。
- 如果噪声太大——改用高斯机制并引入 δ。嗯,这里要注意 δ 与组合次数有关,组合越多 δ 会迅速累积。
- 高维或复杂查询——考虑 (ε,δ)-DP 下的高级组合定理,比如 Rényi 差分隐私或集中差分隐私,但那是后面章节的内容。
2.5 代码实例:两种机制的伪代码对比
光说不练假把式。咱们写两段简化的伪代码,让你看看区别。
# ----- 纯 ε-差分隐私:拉普拉斯机制 -----
import random, math
def laplace_mechanism(true_count, epsilon):
# 敏感度:计数查询为 1
sensitivity = 1
scale = sensitivity / epsilon
noise = random.laplace(0, scale)
return true_count + noise
# ----- (ε,δ)-差分隐私:高斯机制 -----
def gaussian_mechanism(true_count, epsilon, delta):
sensitivity = 1
# 高斯噪声尺度,由 (ε,δ) 共同决定
sigma = math.sqrt(2 * math.log(1.25 / delta)) * sensitivity / epsilon
noise = random.gauss(0, sigma)
return true_count + noise
# 对比:同一数据集,同一 ε
true_val = 1000
print("拉普拉斯(ε=1.0):", laplace_mechanism(true_val, 1.0))
print("高斯(ε=1.0, δ=1e-6):", gaussian_mechanism(true_val, 1.0, 1e-6))
你看,拉普拉斯机制没有 δ,直接基于 ε 和敏感度。高斯机制多了一个 δ,噪声尺度公式里有一个 ln(1.25/δ) 项。δ 越小,ln(1.25/δ) 越大,噪声也越大。所以 δ 选太小,高斯噪声也会变大,这是工程上的权衡。
2.6 一个容易翻车的细节:δ 的累积
我曾经因为这个问题踩过坑,分享出来大家别重复。
假设你发布了 k 次 (ε,δ)-DP 查询,每次 δ=10⁻⁶,k=1000。你以为总 δ 还是 10⁻⁶?错,基本组合定理下,总 δ ≤ k·δ = 0.001。对于敏感数据集,0.1% 的概率泄露已经很高了。更可怕的是高级组合定理下,δ 会平方根增长,但绝不会消失。
实用经验
如果项目要求总隐私预算 ε=1, δ=10⁻⁶,分 100 次查询:
→ 简单组合:每次 ε=0.01, δ=10⁻⁸
→ 高级组合:每次 ε≈0.1, δ=10⁻⁶(但需验证)
我通常先按简单组合上界计算,再让安全审核团队按高级组合精算。
2.7 小结
这章讲完了两个核心定义。我帮你理一下思路:
- ε-DP:保证,最适合理论研究和高安全场景
- (ε,δ)-DP:概率保证,更灵活,适合实际工程部署
- δ 不是免费午餐——它是概率泄露的容忍度,需要严格控制
- 选择取决于:噪声可接受度、查询数量、合规要求