想象你把所有隐私数据存进一家“隐私银行”:你的病历、购物记录、运动轨迹都锁在保险柜里。银行对每一位来访的分析师承诺——您可以查询统计结果,但绝无法准确认出任何一位储户。可承诺凭什么可信?靠合同上两个数字:ε 和 δ。ε 像你每个月能花的零花钱,是“允许泄露多少信息”的额度,每笔查询都从里面扣;δ 像银行保险柜本身的瑕疵概率,指系统级事故(雷击、停电、内部泄漏)造成承诺彻底失效的极小可能。本文就用这家“隐私银行”的视角,带你搞懂 ε/δ 是什么、怎么算、怎么花、怎么在真实训练中落地。
职业价值:读懂 ε/δ,你才能设计出既满足合规要求、又不牺牲模型效果的隐私保护方案——这是隐私计算时代算法工程师和数据科学家的必备基本功。
可视化演示
展示差分隐私中ε和δ参数如何控制隐私保护强度、隐私预算的组合定理,以及多阶段训练中的预算分配策略。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+captions.epsilon+'
隐私预算基础概念
你第一次走进“隐私银行”开户时,柜员递来一份《保密承诺书》。上面写着:无论谁来查询,银行保证他无法在输出结果中准确认出任何一个储户。可这句话太空了——到底“无法认出”到什么程度?合同上真正有约束力的,是两个冷冰冰的数字:ε 和 δ。ε 是“泄密额度”,像你每个月给孩子的零花钱,有上限;δ 是“保险瑕疵”,指保险柜系统本身有极小概率发生灾难性故障,让上面的承诺一夜作废。
这两个数字共同出现在差分隐私的正式定义里。设想一对“双胞胎数据集” D₁ 和 D₂:它们只差一条记录——比如 1000 份病历里,只有张先生的记录不同。银行用某个随机算法 $\mathcal{M}$ 回答查询。定义要求:对任意可能的输出集合 $S$,算法在 D₁ 上输出落在 $S$ 里的概率,至多是 D₂ 上的 $e^{\varepsilon}$ 倍,再加上一个微小的 $\delta$。
回到开户那一刻:柜员把《保密承诺书》念给你听时,你真正该关注的,就是 ε 这位“额度管理员”和 δ 这位“保险精算师”。之后每一次查询,都像是在这份合同上盖章扣款,直到额度耗尽。
- 概率表达式左边是算法 $\mathcal{M}$ 在数据集 $D_1$ 上输出落在集合 $S$ 的概率,$S$ 可以理解为“分析师观察到的任意答案区间”。
- e 的 ε 次方倍右边允许 $D_2$ 的输出概率最多放大 $e^{\varepsilon}$ 倍。ε 越小,放大倍数越接近 1,两条概率曲线越难区分,隐私保护越强。
- 乘号连接整个乘法项表示“正常情况下输出分布至多有这么点偏差”。
- 加 δ 兜底最后加上 δ,相当于给承诺买个免责保险:就算上面的倍数关系被极端事件打破,这种坏情况发生的总概率也不会超过 δ。
敏感度分析
银行给每笔查询定“手续费”之前,得先回答一个问题:这笔查询有多“挑人”?同样是统计,“全体患者的平均血压”谁也对不上号,便宜;“张先生上个月住院了吗”简直是指名道姓,贵。贵不贵,取决于如果把数据集里一个人的记录换掉,查询结果最多会变多少——这个变化的极限,就是敏感度,记作 $\Delta f$。
先明确“换掉一个人”的数学说法。两个数据集 $D_1$ 和 $D_2$ 如果互为相邻数据集(只相差一条记录),那么对任意查询函数 $f$,敏感度就是它在所有相邻数据集对上输出差异的最大值:
现在你再听柜员报价就有数了:平均类查询的敏感度是 $1/n$(n 为样本数),人越多越便宜;计数查询敏感度恒为 1,永远一个价。敏感度越高,手续费越贵,后面要花的 ε 越多——所以聪明的银行会劝你把“指名道姓”的查询改成“群体平均”,把贵的问题翻译成便宜的问题。
- 取最大$\max$ 表示遍历所有相邻数据集对,找出最坏情况下输出差多少——银行按最坏的客人定价,不按普通客人定价。
- 相邻数据集对$D_1 \sim D_2$ 表示二者互为相邻数据集,即仅相差一条记录,这是差分的“差分”二字的来历。
- 向量差的 1 范数$\lVert \cdot \rVert_1$ 把多维输出的各分量差的绝对值求和,L1 敏感度常用于计数、求和类查询;L2 敏感度则用平方和开根,常用于高斯机制。
噪声机制
柜员收了手续费,就得干事。但银行从不说真话——它总在真答案上“念得含糊一点”,这就是噪声机制:把答案悄悄扰动一下,让你知道个大概,却永远抠不出某个具体的人。马赛克糊多厚?由敏感度 Δf 和这笔查询分到的 ε 共同决定。
最经典的是拉普拉斯机制:在真答案上加一个服从拉普拉斯分布的随机数,噪声尺度正好是 $\Delta f / \varepsilon$。它满足纯 (ε, 0)-差分隐私,适合计数、求和等 L1 敏感度场景:
拉普拉斯是“纯马赛克”,但它有个兄弟叫高斯机制,噪声服从正态分布,尺度 $\sigma = \Delta f \cdot \sqrt{2\ln(1.25/\delta)} / \varepsilon$。高斯分布算不出 $\delta = 0$ 的严格承诺,所以它必须搭配一个正数 δ 使用——这正是 (ε, δ)-差分隐私存在的意义。此外还有指数机制,用于在离散选项里“带偏好地随机挑一个”,比如挑选推荐商品时既照顾效用又不泄露个人口味。三种机制共用同一本账:花多少 ε,就糊多厚的马赛克。
- 真答案$f(D)$ 是数据集上的真实统计结果,比如“平均住院天数 = 5.3 天”,这是扰动前的基础值。
- 拉普拉斯噪声$\mathrm{Lap}(b)$ 表示从以 0 为中心、尺度为 $b$ 的拉普拉斯分布中抽一个随机数——它两端拖尾较厚,偶尔给出离谱偏移,正好掩盖单个人的影响。
- 尺度公式$\Delta f / \varepsilon$ 表明噪声尺度与敏感度成正比、与 ε 成反比:敏感度翻倍,马赛克翻倍;ε 减半,马赛克也翻倍。
组合性质
一个季度里,分析师不会只来一次。他可能周一查平均血压、周二查患病比例、周三查通勤距离……银行得回答一个扎心的问题:这么多笔查询加在一起,隐私承诺还成立吗?答案是“成立,但额度要记账”。串行组合定理说:对同一份数据依次做 k 次互不影响的查询,总预算直接相加,每一笔都在同一张额度卡上扣款:
不过银行也有个“免单”条款:并行组合定理。如果把数据拆成互不重叠的几组,分别回答关于各组的查询,那么总隐私消耗只由单组里最贵的一次决定,而不是各组相加——因为任何人只可能“暴露”在恰好一组数据里。这就好比把钱分装在几个独立口袋里,每个口袋各花各的,互不牵连。实际工程里,训练集的批次切分、联邦学习的分片用户,都在悄悄利用并行组合省预算。
- 总预算$\varepsilon_{\text{total}}$ 是 k 次查询累计消耗的隐私预算总额,训练模型时它由隐私会计逐轮累加而来。
- 求和符号$\sum_{i=1}^{k}$ 表示从第 1 次到第 k 次,把每次的 ε_i 全部加起来——隐私像流水一样只增不减。
- 等号含义串行组合的结论是“和”,不是“最大值”也不是“平均值”,所以同样的总预算下,查询次数越少,每笔能分的额度越宽裕。
预算分配策略
既然总预算有限,怎么花就成了理财问题。最朴素也最稳的策略是均匀分配:总共 ε_total,k 笔查询,每笔分到:
均匀分配之外,还有自适应分配:训练早期模型还没学会,噪声大点无所谓;后期收敛阶段需要精细更新,就多分点额度、少加点噪声。这就像学期初省着花、考试周多买咖啡的理财法。但理财一定有代价:预算与效果的权衡是隐私保护的永恒主题——ε 给得越多,噪声越小、模型越准,但隐私承诺越弱;ε 压得越低,隐私越漂亮,模型可能直接“糊到没法用”。
实际调参时,业界有个经验区间可参考:常规统计查询常用 ε 在 0.1 到 1 之间;DP 模型训练常在 1 到 10 之间;若 ε 超过 10,隐私保护基本名存实亡,需要重新审视方案设计。δ 则一般设成小于 $1/N$(N 为样本数),比如 $10^{-5}$ 量级,确保“单个人被兜底暴露”的概率小于随机猜中他的概率。
- 单次份额$\varepsilon_i$ 表示第 i 笔查询偷偷摸摸能用的最大额度,所有份额加起来严格等于总额。
- 除法运算$\varepsilon_{\text{total}} / k$ 把总额除以查询次数,得到每笔的平均额度——这是串行组合定理直接推出来的必要约束。
工程实践应用
把上面的理论搬进模型训练,主角自然登场:DP-SGD(差分隐私随机梯度下降)。传统训练里,模型每看一批数据就更新一次参数,几十万次更新里任何一次都可能泄露训练样本;DP-SGD 给这个过程装了一条“自动取款 + 马赛克流水线”:先给每个样本的梯度戴上面具(裁剪),再往聚合梯度里统一倒噪声(加噪),最后在隐私账本上记一笔(会计)。
第 t 轮迭代的更新梯度约等于:
每完成一轮,隐私会计就把本轮消耗的 ε 累加进总账,用强化组合(如 Rényi DP)算出比朴素相加更紧的累计界,让训练几千轮后总额度仍在可接受范围。于是,隐私银行的全套业务在训练闭环里跑通了:裁剪是控制敏感度,加噪是掩盖个体,会计是记账限额——三者缺一不可。
- 逐样本裁剪$\mathrm{clip}(g_i, C)$ 把每个样本梯度的范数限制在半径 C 的球内,让单个人的梯度影响力被“铐住”,从而把敏感度压到 C 级别。
- 批量求和$\sum_{i \in \mathcal{B}_t}$ 累加当前批次里所有裁剪后的梯度,只有“大家一起的贡献”被保留,“你单独长什么样”被抹掉。
- 高斯噪声项$\mathcal{N}(0, \sigma^2 C^2 \mathbf{I})$ 是均值为零、协方差 $\sigma^2 C^2$ 的高斯噪声,σ 由高斯机制公式从 ε、δ 反解出来——δ 越小,噪声越大。
- 平均与缩放前面的 $\frac{1}{B}$ 把加噪后的梯度除以批次大小,保证更新量级与普通 SGD 可比,模型照样能收敛。
AI 应用场景
医疗数据统计查询平台
阶段:数据可信层 / 隐私保护查询
解决的问题:医院想对外开放统计数据(如某种疾病的区域发病率),帮助科研机构做流行病学研究;但直接给原始数据等于把病人的隐私拱手奉上。传统做法是“脱敏后发布”,可攻击者用背景知识一关联就破功。差分隐私方案给每个统计口径加一层拉普拉斯噪声,并把 ε 预算切成多份,按查询次数逐笔扣除,超限立即停止服务。
具体案例:某三甲医院上线“统计查询开放平台”,研究者可查“近三年糖尿病患者占比”等指标,平台按每次查询消耗 0.1 ε 记账,日总预算 1.0 ε。查询 10 次后平台自动拒绝新请求,管理员重置预算后才恢复。医院既拿出了数据价值,又守住了“无法反推任何一位病人”的承诺。
大模型 DP-SGD 训练中的隐私预算监测
阶段:模型训练 / 差分隐私训练
解决的问题:用用户对话数据微调大语言模型时,模型可能“背下”个别用户的敏感句子。DP-SGD 在每轮参数更新前裁剪梯度并加高斯噪声,同时用隐私会计动态累加 ε;训练到预算上限就自动提前终止,防止模型在过多轮次后把个体记忆“背熟”。
具体案例:某公司用 100 万条客服对话微调对话模型,设总预算 ε = 3、δ = 1e-6,每轮按 subsampling 后的实际贡献记账,训练 12 轮后会计显示已用 2.71 ε,接近上限。团队据此决定只训 10 轮微调版上线,并对外公布模型满足 (3, 1e-6)-差分隐私,审计通过。
Python 演示
import mathimport random def lap_sample(scale): """生成服从 Laplace(0, scale) 的随机噪声""" v = 1.0 - random.random() u = random.random() return -scale * math.copysign(1.0, u - 0.5) * math.log(v) def gauss_sample(sigma): """生成服从 N(0, sigma^2) 的随机噪声""" return random.gauss(0.0, sigma) class PrivacyBudget: """隐私账本:记录已消耗的 eps,超出总预算则拒绝查询""" def __init__(self, total_eps, delta=0.01): self.total_eps = total_eps self.delta = delta self.spent_eps = 0.0 self.query_count = 0 def spend(self, eps, query_name): if self.spent_eps + eps > self.total_eps: raise RuntimeError( "预算不足:已用 %.3f,想用 %.3f,总额 %.3f" % (self.spent_eps, eps, self.total_eps) ) self.spent_eps += eps self.query_count += 1 return self.spent_eps def laplace_query(budget, data, sensitivity, eps, query_name): """用拉普拉斯机制回答一次统计并扣除预算""" budget.spend(eps, query_name) true_value = sum(data) / len(data) return true_value + lap_sample(sensitivity / eps) def gauss_query(budget, data, sensitivity, eps, query_name): """用高斯机制回答一次统计并扣除预算""" budget.spend(eps, query_name) true_value = sum(data) / len(data) sigma = sensitivity * math.sqrt(2.0 * math.log(1.25 / budget.delta)) / eps return true_value + gauss_sample(sigma) def main(): random.seed(42) data = [1 if random.random() < 0.3 else 0 for _ in range(1000)] budget = PrivacyBudget(total_eps=1.0, delta=1e-5) eps_each = 0.2 queries = ["平均收入", "患病比例", "居住面积", "通勤距离", "运动时长", "睡眠小时"] for i, name in enumerate(queries): try: answer = laplace_query(budget, data, 0.001, eps_each, name) except RuntimeError as exc: print("第 %d 笔查询 %s 被拒绝:%s" % (i + 1, name, exc)) break print( "第 %d 笔查询 %s:答案为 %.4f,已用预算 %.3f / %.3f" % (i + 1, name, answer, budget.spent_eps, budget.total_eps) ) return 0 if __name__ == "__main__": main()
class PrivacyBudget:定义隐私账本类,spent_eps记录已消耗额度,总余额由total_eps硬约束。budget.spend(eps, query_name)每次查询前先检查余额,够则记账,不够则抛异常拒绝,体现“预算只减不增”。lap_sample(sensitivity / eps)生成尺度为 Δf/ε 的拉普拉斯噪声,敏感度越高或单笔 ε 越小,马赛克越厚。def gauss_query(...)高斯机制示例,σ 由 ε、δ 联合反推:δ 设置得越小,ln(1.25/δ) 越大,噪声越大。data = [1 if random.random() < 0.3 else 0 ...]模拟 1000 位“储户”的敏感属性,mean 查询的敏感度正好是 1/1000。except RuntimeError as exc:捕获预算不足异常,打印拒绝原因,模拟真实平台上“超限即熔断”的工程行为。
常见误区
误区反正 δ 也是隐私参数,那我把它设成 0 或者 $10^{-30}$,隐私保护不就无敌了吗?ε 再小我都不怕。
正解δ 不是免费的“加强剂”。高斯机制的噪声尺度正比于 $\sqrt{2\ln(1.25/\delta)}$,δ 每降一个数量级,噪声就要明显增大;δ 设为 0 时高斯机制直接失去有限 ε 的保证。现实中 δ 一般取 $\le 1/N$(N 为样本数),追求更小的 δ 只会让模型精度崩溃,属于“花钱买了个用不上的极致安全”。
为何常见:人们容易把 ε 和 δ 都理解成“越小越好”的旋钮,却没意识到 δ 是高斯机制的入门票——它用一点点失败概率换来了实用噪声,二者是联动关系而非独立旋钮。
误区我给每次查询都设 ε = 0.1,那总共查了 100 次,隐私保护还是 0.1 吧?反正每次都这么小。
正解串行组合定理说了,同一份数据上多次查询的 ε 会相加,100 次 × 0.1 = 10.0,隐私承诺早已名存实亡。正确的做法是用隐私会计把每次消耗累加起来,总预算超限就停止查询。很多人栽跟头,就是把“单次 ε”和“累计 ε”混为一谈。
为何常见:因为 ε 的定义在形式上只约束“一次算法调用”,初学者默认它天然每次独立,忽略了组合定理这条“记账铁律”。
误区那我干脆设 ε = 0,一点信息都不泄露,总该完美了吧?模型或者查询结果应该照样能用。
正解ε = 0 意味着输出分布完全与数据无关,等价于抛弃数据随机瞎猜——统计答案彻底失真,模型训练也学不到任何东西。差分隐私的目标从来不是“零泄露”,而是“把泄露控制在可接受的 ε 内”,在隐私与效用之间找平衡。设置 ε = 0 不是安全,是摆烂。
为何常见:“越小越安全”的直觉没错,但忽略了隐私保护的本质是“有限度地提供价值”,而不是“完全拒绝服务”。
误区δ 就是给隐私开的后门,是拉普拉斯机制不争气才需要的东西,实际应该永远用 δ = 0 的纯差分隐私。
正解δ > 0 不是作弊,而是工程必然。纯 (ε, 0)-差分隐私只有拉普拉斯这类重尾机制能实现,但深度学习中更自然的是高斯噪声,它在小批量反复采样下统计效率高得多。高斯机制以 δ 为代价换取实用噪声,只要 δ 严格控制在上限之内,就是学术界和工业界都认可的严格保证。
为何常见:教材通常先讲纯 DP 再讲近似 DP,给人“纯的才正宗”的错觉;实际上现代大规模 DP 训练几乎全部依赖 (ε, δ) 框架和 RDP 会计。
误区训练跑着跑着发现 ε 快超了,那我把后面几轮的噪声调大一点,把预算“省回来”不就行了?
正解已经消耗的预算无法通过事后加噪回退——隐私损失是单调累积的,过去每轮已真实地见过数据,账本上记下的 ε 不会因为你后面变谨慎而抹掉。正确做法是在训练前就把总预算、轮数和噪声超参一并规划好,或采用自适应提前终止:预算快耗尽时直接停训,而不是临时改噪声尺度。
为何常见:因为“加噪”看起来像是实时调节的保护旋钮,让人误以为它和预算记录之间可以互相抵消;实际上它是“事前设计”,不是“事后补救”。
面试题
Q1. 在(ε,δ)-差分隐私中,ε 的主要作用是什么?
- A.控制输出噪声的分布形状
- B.限定查询的信息泄露额度← 正确答案
- C.决定数据集的采样数量
- D.指定模型训练的总轮数
答案:B。ε 是隐私预算本身,像零花钱总额,限定单次或累计查询最多泄露多少信息。A 描述的是噪声机制的结果(ε 影响噪声尺度从而影响分布形状),并不反映 ε 的本职角色;C、D 与 ε 无直接关系。
Q2. δ 在(ε,δ)-差分隐私中的正确含义是?
- A.攻击者掌握的背景知识量
- B.数据集中的样本总数
- C.ε 隐私保证失效的概率上界← 正确答案
- D.每次查询消耗的预算量
答案:C。δ 是“保险瑕疵”,指差分隐私不等式整体失效的概率上限,对应保险柜系统故障的极小可能。A 是攻击模型里的背景知识假设,B 是样本量 N,D 是单次 ε_i,三者都与 δ 定义无关。
Q3. 两个数据集互为“相邻数据集”是指?
- A.二者存储在同一台服务器上
- B.二者拥有完全相同的记录
- C.二者仅相差一条记录← 正确答案
- D.二者的属性列数完全一致
答案:C。相邻数据集定义为只差一条记录,这是“差分”的由来,也是敏感度计算的前提。A、D 只关乎存储和结构,与个体隐私无关;B 是相等数据集,不会产生任何差分。
Q4. 拉普拉斯机制的噪声尺度为 Δf/ε,这说明?
- A.敏感度越高噪声越大,预算越多噪声越小← 正确答案
- B.敏感度越高噪声越小,预算越多噪声越大
- C.噪声与敏感度和预算均没有关系
- D.只要增大 δ 噪声就必然降至零
答案:A。噪声尺度正比于敏感度 Δf、反比于 ε。查询越“挑人”(Δf 大)或额度越紧(ε 小),马赛克越厚。B 把两个方向都说反了;C 无视公式;拉普拉斯是纯 DP 机制,D 中 δ 不参与其噪声定价。
Q5. 使用高斯机制时,若固定 ε 而把 δ 调小(如从 1e-3 调到 1e-6),会?
- A.噪声标准差变小,结果更精确
- B.噪声标准差变大,结果更模糊← 正确答案
- C.噪声标准差不变,仅影响计算速度
- D.机制自动改用拉普拉斯噪声
答案:B。高斯机制 σ 正比于 $\sqrt{2\ln(1.25/\delta)}$,δ 越小 ln 项越大,噪声越大。你坚持“失败概率更低”,就得付出更糊的答案。A 方向相反;C 与速度无关;D 无中生有。
Q6. 对同一份数据连续执行 k 次独立查询,串行组合公式是?
- A.ε_total 取各 ε_i 中的最大值
- B.ε_total 为各 ε_i 之乘积
- C.ε_total 为各 ε_i 之和← 正确答案
- D.ε_total 取各 ε_i 的平均值
答案:C。串行组合是同一个口袋花钱,隐私损失单调相加,$\varepsilon_{\text{total}} = \sum \varepsilon_i$。取最大值会严重低估风险,乘积和平均值更是没有对应定理支撑。
Q7. 全局敏感度 Δf 的数学定义是?
- A.所有查询结果的最大值
- B.相邻数据集结果的最大距离← 正确答案
- C.数据集中敏感属性数量
- D.噪声分布的标准差大小
答案:B。Δf 是遍历所有相邻数据集对,查询函数输出差的范数最大值。它是查询函数自身的属性,与具体数据无关。A 没提“相邻数据集”这一关键前提;C 混淆了“敏感属性”与“敏感度”;D 是噪声尺度,是 Δf 与 ε 组合后的产物。
Q8. 下列哪些措施可以降低隐私预算消耗?
- A.拆分数据集分别查询以并行组合← 正确答案
- B.对梯度裁剪以限制敏感度大小← 正确答案
- C.减少总查询次数只留关键统计← 正确答案
- D.将 ε 设为零并以 δ 代替保护
答案:ABC。并行组合让不同分组的查询互不叠加预算;裁剪限制敏感度直接压低噪声成本;减少查询次数则因串行组合的加法性而节省总额。D 中 ε=0 使查询结果失去可用性,δ 无法替代 ε 完成信息度量。
Q9. 关于(ε,δ)-差分隐私,正确的说法包括?
- A.δ 必须大于 0 时高斯机制才能实现← 正确答案
- B.δ 可以任意取值以换取更小噪声
- C.隐私会计用于追踪训练累计预算← 正确答案
- D.ε 越小说明隐私保护强度越高← 正确答案
答案:ACD。高斯机制只能提供 (ε,δ)-DP 且要求 δ>0,这是它与拉普拉斯机制的关键区别;隐私会计(如 RDP)正是为累计预算而设计;ε 越小输出分布越难区分,保护越强。B 错在 δ 越小噪声越大而非越小,δ 还与样本数 N 有约束关系,不能任意取。
Q10. DP-SGD 的隐私保护流程包括?
- A.对梯度按裁剪阈值 C 进行逐样本裁剪← 正确答案
- B.聚合梯度后加入高斯噪声再更新参数← 正确答案
- C.用隐私会计累计每次迭代的 ε 消耗← 正确答案
- D.将整个模型参数直接替换为零向量
答案:ABC。DP-SGD 三段式:逐样本裁剪把敏感度压到 C,加高斯噪声掩盖个体贡献,隐私会计把每轮 ε 累加并严格控制总预算。D 是“重置模型”不是隐私保护手段,做了等于不训练。