高级组合定理:提高隐私预算利用率
原文课程: Lecture 6 — Advanced Composition (Gautam Kamath, CS 860, Fall 2020)
隐私预算就像钱包里的钱——你希望每笔"查询"花的钱越少越好。纯 DP 的基本组合定理告诉我们:运行 k 个 ε-DP 算法,整体是 kε-DP。隐私预算线性增长,这太奢侈了!
高级组合定理(Advanced Composition Theorem)改变了游戏规则:它允许隐私预算按 O(√k) 增长而非 k——这是数量级上的提升。
1. 基本组合 vs 高级组合
假设你要回答 10,000 个查询,每个查询使用 ε=0.01 的隐私预算:
| 组合方式 | 总隐私损失 | 可用性 |
|---|---|---|
| 基本组合 | ε_total = 10,000 × 0.01 = 100 | ❌ 隐私完全崩溃 |
| 高级组合 | ε_total ≈ 0.01 × √(2×10,000×log(1/δ)) ≈ 1.4 | ✅ 仍然可接受 |
这是 70 倍的差距!
2. 高级组合定理的正式表述
定理(高级组合):对于所有 ε, δ, δ’ > 0,设 M = (M₁, …, Mₖ) 是一系列 自适应选择 的 (ε, δ)-差分隐私算法。那么整体算法满足 (ε̃, δ̃)-差分隐私,其中:
ε̃ = ε·√(2k·ln(1/δ’)) + k·ε·(e^ε - 1)/(e^ε + 1)
δ̃ = kδ + δ’
看起来很复杂?让我们拆解一下:
三项的含义
- 主导项: ε·√(2k·ln(1/δ’)) —— 从 k 变为 √k 的核心
- 当 k 很大时,这一项主导
- δ’ 是一个"调优参数"——让它越大,√k 前的系数就越小
- 二阶项: k·ε·(e^ε - 1)/(e^ε + 1)
- 当 ε 很小时(高隐私区),(e^ε - 1)/(e^ε + 1) ≈ ε/2
- 此时二阶项 ≈ k·ε²/2 —— 对很小的 ε 可以忽略
- δ 累积: δ̃ = kδ + δ’
- k 个算法各自的 δ 累积
- δ’ 是额外的调优参数
简化版本(高隐私区)
当 ε 很小(比如 ε ≤ 1)且忽略常数因子时:
(ε̃, δ̃)-DP,其中 ε̃ ≈ O(ε·√(k·log(1/δ)))
3. 直观理解:为什么能从 O(k) 变成 O(√k)?
关键直觉在于隐私损失变量的随机性。
基本组合的错误假设
基本组合假设最坏情况:每次查询的隐私损失方向都相同(每次都是"坏"方向)。就像连续抛硬币总是正面——概率极低,但基本组合保守地考虑了这种情况。
高级组合的正确洞察
高级组合认识到:隐私损失变量是一个均值为 0 的随机变量。就像抛硬币一样,大多数时候正面和反面会互相抵消。
- 平均总隐私损失 ≈ 0(中心极限定理)
- 总隐私损失 ≥ t 的概率 ≈ exp(-t²/2kε²)
- 所以 t ≈ ε·√k 就能使这个概率很小
4. 一个实际例子
假设你要用 DP 训练一个深度学习模型,每轮梯度更新(SGD step)使用 ε=1, δ=10⁻⁵。如果你训练 1,000 轮:
| 组合方式 | 总 ε | 可用性评估 |
|---|---|---|
| 基本组合 | ε_total = 1,000 | ❌ 完全不可用 |
| 高级组合 | ε_total ≈ 1·√(2·1000·ln(1/0.01)) ≈ 30 | ⚠️ 还可以 |
| 高级组合(调优到 δ’=0.1) | 更小的 ε̃ | ✅ 实用 |
这就是 DP-SGD(差分隐私随机梯度下降)的核心——通过高级组合定理来摊销隐私成本,使得在成千上万轮迭代后仍然保持有意义的隐私保障。
5. 自适应查询 vs 非自适应查询
高级组合定理的一个强大特性是支持自适应查询。
| 查询类型 | 含义 | 高级组合支持? |
|---|---|---|
| 非自适应 | 所有查询事先确定 | ✅ |
| 自适应 | 下一个查询可依赖于前面的答案 | ✅ |
这意味着研究者可以根据之前的结果动态选择下一个分析方向,而不必提前决定所有问题——这更符合现实的数据分析流程。
6. 用代码计算高级组合隐私预算
下面这个 Python 函数可以帮你计算任意场景下的总隐私预算,非常适合实际部署时使用:
import numpy as np
import math
def basic_composition(epsilon, k):
"""基本组合:总隐私 = k × ε(线性)"""
return k * epsilon
def advanced_composition(epsilon, delta, k, delta_prime=1e-6):
"""
高级组合定理:总隐私预算计算
参数:
epsilon: 每次查询的隐私预算
delta: 每次查询的δ
k: 查询次数
delta_prime: 调优参数(越小ε̃越小,但δ̃略增)
返回:
(epsilon_total, delta_total)
"""
term1 = epsilon * math.sqrt(2 * k * math.log(1 / delta_prime))
term2 = k * epsilon * (math.exp(epsilon) - 1) / (math.exp(epsilon) + 1)
epsilon_total = term1 + term2
delta_total = k * delta + delta_prime
return epsilon_total, delta_total
# ===== 场景对比 =====
print("=== 基本组合 vs 高级组合 ===\n")
scenarios = [
("少量精确查询", 10, 0.5, 1e-5),
("中等规模查询", 100, 0.1, 1e-5),
("DP-SGD 100轮", 100, 0.1, 1e-5),
("DP-SGD 1000轮", 1000, 0.1, 1e-5),
("普查级大规模", 10000, 0.01, 1e-6),
]
for name, k, eps, d in scenarios:
basic = basic_composition(eps, k)
adv_eps, adv_delta = advanced_composition(eps, d, k)
print(f"场景: {name}")
print(f" k={k}, ε={eps}, δ={d}")
print(f" 基本组合: ε_total = {basic:.2f} {'❌' if basic > 5 else '⚠️' if basic > 1 else '✅'}")
print(f" 高级组合: ε_total = {adv_eps:.2f}, δ_total = {adv_delta:.2e} {'❌' if adv_eps > 5 else '⚠️' if adv_eps > 1 else '✅'}")
print()
# ===== 关键可视化:增长趋势对比 =====
print("--- k从1到10000的ε_total增长对比 ---")
ks = [1, 10, 50, 100, 500, 1000, 5000, 10000]
for k in ks:
basic = basic_composition(0.1, k)
adv, _ = advanced_composition(0.1, 1e-5, k)
print(f" k={k:5d}: 基本={basic:.1f} 高级={adv:.2f} (比值={basic/adv:.0f}x)")
运行这段代码,你会看到在 k=10000 时基本组合的 ε=1000(完全不可用),而高级组合仅约 9.2(仍可接受),差距超过 100 倍。
7. 与基本组合的对比总结
| 特性 | 基本组合 | 高级组合 |
|---|---|---|
| 增长方式 | O(k) | O(√k) |
| 隐私定义 | ε-DP 或 (ε,δ)-DP | (ε,δ)-DP |
| 是否支持自适应 | ✅ | ✅ |
| 数学复杂度 | 简单 | 中等 |
| k=10, ε=0.1 的结果 | ε_total = 1.0 | ε_total ≈ 0.4 |
| k=100, ε=0.1 的结果 | ε_total = 10.0 ❌ | ε_total ≈ 1.3 ✅ |
小结
高级组合定理是差分隐私走向实用化的关键里程碑之一。它解决了基本组合中隐私预算线性增长这一致命缺陷,使得在大规模查询场景(如机器学习多轮训练、普查数据发布)中使用差分隐私变得可行。
| 概念 | 要点 |
|---|---|
| 基本组合 | 总隐私 = k × ε(线性) |
| 高级组合 | 总隐私 ≈ O(√k) × ε(次线性) |
| 实现机制 | 识别隐私损失变量的随机性,利用抵消效应 |
| δ 调优 | 通过 δ’ 参数控制 ε̃ 和 δ̃ 的权衡 |
| 实践意义 | DP-SGD、普查数据发布等大规模应用的基础 |
下一讲,我们将介绍指数机制——当要输出的不是数值而是一个"对象"时(如选择最佳价格或最佳模型参数),我们该如何保护隐私?
下一篇: 指数机制:从数值到对象的隐私保护

419

被折叠的 条评论
为什么被折叠?



