近乎差分隐私

开放式调查问题

假设你在做一项调查,询问人们最喜欢的颜色。你不提供固定选项,而是让他们自由填写。多数答案会是常见颜色:蓝色、绿色、粉色……但现实世界的数据充满噪声,你肯定会收到各种意想不到的回答。有些可能是无效输入——有人误解了问题,有人在恶搞。还有些只是比较罕见的颜色。你想发布这些答案的直方图。

我们来试试之前的方法。如果在每个类别上添加尺度为 \(1/\varepsilon\) 的拉普拉斯噪声,会怎样?我们需要比较两个仅相差一条记录的数据库在该机制下的输出。有两种情况。

两个数据库有相同的类别

如果运气好,两个数据库包含的类别完全相同。例如:

  • 一个数据库有 10 个绿色、5 个红色、2 个黄色。
  • 另一个数据库有 10 个绿色、5 个红色、3 个黄色。

此时为每个类别添加噪声效果很好。差异仅出现在黄色类别中,噪声足以掩盖两个计数值之间的差别,和之前一样。

两个数据库没有相同的类别

问题出在这里。例如:

  • 一个数据库有 10 个绿色、5 个红色、2 个黄色。
  • 另一个数据库有 10 个绿色、5 个红色、2 个黄色,还多了一个群青色。

来看看对两者加噪后的结果。每列的数值都会与真实计数略有偏差,但有一个显而易见的问题:类别本身就不同!

带有噪声的三列颜色直方图 带有噪声的四列颜色直方图

不用仔细辨认数字就能看出两个直方图的区别!攻击者可以轻易根据输出类别的不同来判断哪个数据库是正确的。这就是区分事件:攻击者能够以 100% 的把握确定正确的数据库。因此,该过程不满足差分隐私。怎么解决?

也许我们可以穷举所有可能的类别,为每个类别都添加噪声,包括计数为零的类别。可惜事情没那么简单。在我们的例子中,用户可以输入任何内容——可能性是无限的。好消息是,只需轻微放松隐私保证,就能克服这一困难。

一个解决方案:阈值化

要彻底杜绝区分事件相当困难。退而求其次,我们可以让它在绝大多数情况下不发生。一种方法就是阈值化:不仅为每个类别添加噪声,还删除所有低计数的类别。假设阈值设为 5,那么在上面的例子中,最终只发布两个类别:

带有噪声的两列颜色直方图

代价是我们会丢失罕见类别。在上例中,不仅群青色被删除了,连黄色也没能幸免。任何计数接近 5 或更低的类别都有很大概率被过滤掉。不过通常这不是大问题——罕见答案更可能是无意义的。

从隐私角度看,这个方案并不完美。假如添加到群青色类别的噪声超过 4 呢?加噪后的总计数可能达到 5 以上,该类别就会被发布,从而破坏差分隐私。幸运的是,这种情况很少发生:对于参数为 \(1/\ln(3)\) 的拉普拉斯噪声,概率仅约 0.6%。

总结:\((\varepsilon,\delta)\)-差分隐私

我们的策略比之前复杂了一些,现在有两个参数。

  • 噪声量:和之前一样,若希望大部分时间实现 \(\varepsilon\)-差分隐私,需要添加尺度为 \(1/\varepsilon\) 的拉普拉斯噪声。
  • 阈值:用于在加噪后删除罕见类别。这带来了一个天然的权衡——阈值越大,丢失的数据越多;但阈值越大,区分事件发生的概率也越低。

我们来直观感受一下。对于每个阈值,一个真实计数为 1 的类别在加噪后超过阈值的概率是多少?下图假设使用参数为 \(1/\ln(3)\) 的拉普拉斯噪声。

显示区分事件概率取决于阈值的图表

在对数刻度下,图表是一条直线。这很合理:拉普拉斯噪声本身是双指数分布。

然而,合适的阈值取决于具体算法和噪声分布,直接用阈值来量化隐私并不理想。更好的做法是用区分事件的发生概率作为参数来修正定义。

形式化定义

由此我们得到 \((\varepsilon,\delta)\)-差分隐私。这一定义严格弱于原始定义,但形式相似。对于仅相差一条记录的任意两个数据库 \(D_1\) 和 \(D_2\),以及任意输出集合 \(S\):

\[\mathbb{P}[A(D_1)\in S] \le e^\varepsilon\cdot\mathbb{P}[A(D_2)\in S]+\delta. \]

\(\varepsilon\) 的含义不变。新增的 \(\delta\) 刻画了出错的可能性。在上例中,\(\delta\approx0.006=0.6\%\)。采用 \((\varepsilon,\delta)\)-差分隐私,意味着算法近乎满足 \(\varepsilon\)-差分隐私——以 \(1-\delta\) 的概率成立。\(\delta\) 越接近 0 越好。

对定义的批评

如前所述,\(\delta\) 可以理解为严重出错的概率。对于一个隐私定义而言,这似乎是个缺陷。考虑这样一个算法:输入一个数据库,以 \(1-\delta\) 的概率返回 42,以 \(\delta\) 的概率返回整个数据库。简直是严重的数据泄露!但它仍然满足 \((0,\delta)\)-差分隐私。

这说明 \(\delta\) 参数允许灾难性失败。面对这一事实,你有两个选择。

  1. 投入更多精力预定义类别,或采用更高级的技术,只使用"真正的"差分隐私。
  2. 接受小概率的灾难性失败,通过要求极小的 \(\delta\) 来控制风险。

我认为第二种选择并非不可接受。一个人一生中被闪电击中的概率约为 \(10^{-4}\)。你的内存中某个比特在一年内被宇宙射线翻转的概率约为 \(10^{-6}\)。许多场景下,将这些视为可忽略的风险是合理的。

数据保护的本质就是风险缓解,你永远无法将风险降为零。即便使用"真正的"差分隐私,实现中也可能存在严重漏洞。或者系统被黑客攻破,整套匿名化策略形同虚设。又或者有人给你下药,用 $5 扳手逼你交出数据库。这些概率有多大?如果你的 \(\delta\) 足够小,用它换取更多便利完全是值得的。

如何选择 \(\delta\)?

考虑到上述灾难性场景,0.6% 的 \(\delta\) 未免太大了。那合理的取值是多少?一种常见做法是选择远小于 \(1/n\) 的 \(\delta\),其中 \(n\) 为数据库中的总人数。推理如下:每个人在最坏情况下都有 \(\delta\) 的概率被泄露数据,因此至少一人数据泄露的总概率约为 \(n\delta\)——我们需要确保这个值足够小。

幸运的是,在实际问题中,不需要很大的阈值就能获得极小的 \(\delta\)。如果有一百万用户,且希望 \(n\delta<0.1\),阈值取 15 就够了。

很酷的属性

\((\varepsilon,\delta)\)-差分隐私保留了差分隐私的所有优良性质。

  • 组合性:若有两个 \((\varepsilon,\delta)\)-差分隐私机制,则同时发布两者的结果满足 \((2\varepsilon,2\delta)\)-差分隐私。
  • 后处理性:若有一个 \((\varepsilon,\delta)\)-差分隐私机制,对其输出施加任意固定变换后,仍满足 \((\varepsilon,\delta)\)-差分隐私。

这意味着我们在类别预定义的简单场景中学到的大部分结论依然适用。将噪声值四舍五入为整数没有风险。如果同一个人可以计入多个分箱,可以相应调整 \(\varepsilon\) 和 \(\delta\)。也可以求和,不过调整阈值时需要格外小心。

posted @ 2026-07-06 15:48  永是珞珈一恐龙  阅读(13)  评论(0)    收藏  举报