实践中的差分隐私

计算唯一用户数

假设你有一个数据库,你想发布其中有多少人满足给定条件。比如,有多少人有一双绿眼睛?即使你的数据库中有很多人,你也不能直接发布真实答案。让我们花点时间理解为什么。

使用差分隐私,我们假设攻击者知道几乎所有元素。他们只对他们的目标有不确定性。假设他们想知道他们的目标是否有绿眼睛。如果你输出真实数字 \(k\),他们可以将他们认识的人中有绿眼睛的人数进行比较。如果是 \(k-1\),那么目标有绿眼睛。如果是 \(k\),那么目标没有。

那么,我们怎么做?我们计算精确答案,然后添加噪声。这种噪声将来自一个称为拉普拉斯分布的概率分布。这个分布有一个参数,它的尺度,决定了它有多"平坦"。它看起来像这样:

显示尺度为 1/ln(3)、中心为 0 的拉普拉斯分布的图表

所以,为了获得 \(\varepsilon\)-差分隐私,我们根据 \(\text{Laplace}(1/\varepsilon)\) 选择一个随机值,并将这个噪声添加到真实值中。为什么这样做有效?让我们看看我们返回的数字的分布,取决于真实计数是 \(k=1000\)(蓝线,目标没有绿眼睛)还是 \(k=1001\)(黄线,目标有绿眼睛)。

显示两个尺度为 1/ln(3)、中心分别为 1000 和 1001 的拉普拉斯分布的图表

假设真实数字是 \(k=1001\),添加噪声后,我们发布了 \(1003\)。让我们站在攻击者的角度。原始数字是 \(1001\) 与 \(1000\) 的可能性是多少?"\(k=1001\)"的假设更有可能:生成 \(2\) 的噪声比生成 \(3\) 的噪声更有可能。有多大可能?事实证明,这些可能性之间的比率是…… \(e^\varepsilon\)!所以差分隐私的概率比率得到了满足。

无论输出是什么,这都有效:比率将始终在 \(e^\varepsilon\) 和 \(e^{-\varepsilon}\) 之间。如果你想仔细检查,你可以在图表上验证它,或者做数学计算。

计算事物

好的,计算唯一用户非常简单。计算事物也一定很简单,对吧?假设你有一个数据库,其中包含人们使用反馈表单发送给公司的建议。你想发布你在某一天收到的建议数量。同时,攻击者想了解他们的目标发布了多少投诉。

与之前的场景有什么不同?我们不能只是添加从 \(\text{Laplace}(1/\varepsilon)\) 中抽取的噪声并获得 \(\varepsilon\)-差分隐私吗?有一个问题:如果一个人在一天内发送了多个投诉怎么办?假设有人非常不满意,发送了五个投诉。其他 1000 个客户各发送了一个投诉。这个不满意的客户的影响将比以前更大。两个分布现在看起来像这样:

显示两个尺度为 1/ln(3)、中心分别为 1000 和 1005 的拉普拉斯分布的图表

曲线之间的差异比以前大得多。它们的比率最多为 \(e^{5\varepsilon}\),所以使用参数 \(1/\varepsilon\) 只给出 \(5\varepsilon\)-差分隐私。为了解决这个问题,我们需要添加更多噪声。多少?这取决于一个个体的最大贡献。如果一天内投诉的最大数量是 5,你必须添加 5 倍的噪声。在这个例子中,使用 \(\text{Laplace}(5/\varepsilon)\) 会给你 \(\varepsilon\)-差分隐私。

显示两个尺度为 5/ln(3)、中心分别为 1000 和 1005 的拉普拉斯分布的图表

请注意,你不能完全自动化这个过程:你需要知道最大贡献可能是多少。一个对过程有一定了解的人必须做出判断。在我们的例子中,这可能是"用户每天不会发布超过五个投诉"。

如果那个判断是错误的,一个用户后来决定在一天内发布 10 个投诉,会发生什么?为了保持所需的隐私级别,你需要将所有值限制在估计的最大值。换句话说,对于这个异常用户,你只会在非噪声总和中计算 5 个投诉。

这个过程可能会在数据中引入意外的偏差。所以,在估计最大贡献时要小心!如果限制只发生在非常罕见的情况下,你应该没问题。

求和或平均数字

假设你的每个用户对你的客户服务进行评分,范围从 -10 到 10。你想发布平均评分。计算平均值与计算总和几乎相同——将所有评分相加,然后除以用户数。那么,我们对总和做什么以实现差分隐私?

在所有评分选项中,我们只需要考虑最坏的情况。两个噪声曲线可能相距多远?如果值都在 -10 和 10 之间,最大的可能差异是 \(10-(-10)=20\)。当攻击者试图确定一个用户是投了 -10 还是 10 时,就会发生这种情况。

与之前的例子一样,你必须添加 \(\text{Laplace}(20/\varepsilon)\) 的噪声以获得 \(\varepsilon\)-差分隐私。就像之前一样,你需要检查每个值是否在你的理论最小值和最大值之间。如果你发现一个异常值,例如低于最小值,你需要在将其添加到总和之前将其限制到最小值。

在某些情况下,估计这些最小值或最大值很困难。例如,如果你在计算一大群人的平均工资,你应该如何估计工资上限?我不认为这是差分隐私的可用性缺陷。相反,它表明在存在异常值的情况下,平均值不是有意义的指标。去除这些异常值对于准确性和隐私都是一个好主意 😃

一次发布多个事物

好的。如果你不想只发布一个统计信息,而是多个呢?你可以为每个添加噪声并没问题吗?嗯……这取决于。你要问自己的主要问题是:一个个体的最大影响是什么?有两种不同的可能性。

统计信息是关于不同的人

假设你想根据用户的年龄范围发布用户数量:20-29、30-39、40-49 等。

每个用户最多只会在这些类别中的一个中产生影响。要么某人在某个年龄范围内,要么他们在另一个范围内。当你试图发布一个直方图时,这种情况经常出现:

显示按年龄范围划分的人数的假数据直方图

当你处于这种情况时,你可以安全地为每个桶计数添加尺度为 \(1/\varepsilon\) 的拉普拉斯噪声。桶之间没有问题交互。发布整个直方图仍然是 \(\varepsilon\)-差分隐私的。

之前直方图的加噪声版本,一些条形略有变化

很简单,对吧?请注意,这个直方图看起来有点奇怪:计数不是整数,一个计数最终是负数!我们可以通过将所有计数四舍五入并将所有负数替换为 0 来使其看起来不那么可疑。

之前直方图的"清理"版本,所有值现在都是正整数

这种类型的后处理是允许的,这要归功于差分隐私的一个巧妙属性。如果你获取差分隐私数据,并使其通过固定转换,你仍然会得到差分隐私。方便!

一个人在多个统计信息中

好的,如果你发布多个统计信息,但这次,它们可能都是关于同一个用户呢?假设你想发布你的用户中有多少……

  • 年龄小于 35 岁;
  • 使用 iOS 设备;
  • 是色盲;
  • 在不到一个月前开始使用你的应用。

同一个用户可能属于所有这些类别!在这种情况下,你不能为每个计数添加尺度为 \(1/\varepsilon\) 的拉普拉斯噪声并获得 \(\varepsilon\)-差分隐私。相反,你必须将每个计数视为单独的数据发布。因此,如果你有 \(C\) 个不同的计数,你必须为每个添加尺度为 \(C/\varepsilon\) 的拉普拉斯噪声。每个独立发布将是 \(\varepsilon/C\)-差分隐私的。现在我们可以使用差分隐私的组合属性了!这允许我们得出结论,整个发布是 \(\varepsilon\)-差分隐私的。

这适用于任何类型的统计信息,而不仅仅是唯一计数。想发布多条信息?计算一个人的最大影响,并在每个数据发布之间"分割"你的 \(\varepsilon\)。这个 \(\varepsilon\) 被称为你的隐私预算:你选择 \(\varepsilon_1\),…,\(\varepsilon_C\),它们的总和为 \(\varepsilon\),你用 \(\varepsilon_i\)-差分隐私发布第 \(i\) 个统计信息。这个解决方案比简单地为每个统计信息使用 \(\varepsilon/C\)-差分隐私更灵活。如果一个统计信息更重要,或对噪声更敏感,你可以为其分配更多预算。预算部分越大,噪声越低。当然,你将不得不为其他值添加更多噪声。

要避免的陷阱

我们今天看到的机制非常简单。但匿名化充满了陷阱:仍然有一些事情可能出错。

  • 当求和或平均数字时,将它们限制在最小值和最大值是至关重要的。否则,所有的保证都会失效。
  • 注意你在实践中如何实现这个限制。像 NaN 这样的特殊值可能会导致令人惊讶的行为。
  • 当然,你不允许作弊。你必须提前选择你的隐私策略,然后应用它,并发布噪声数据。你不能仔细检查它是否足够准确。否则,你会扭曲随机性,并失去隐私保证。
  • 发布直方图时,提前选择每个类别很重要。如果你必须查看数据才能知道你的类别是什么,你必须使用更微妙的方法。

最后一个点在实践中经常是一个问题。例如,假设你想计算客户投诉中每个单词被使用的次数。你不能制定一个明确的单词列表:人们可能使用你没有预测到的单词,或者拼写错误。在这种情况下,我为直方图描述的技术不起作用。


  1. 如果你想特别迂腐,你可能还想为你的用户总数添加噪声。这取决于你选择的定义风格。我不会在这里深入到那个细节,你也不应该。

  2. 如果你想知道为什么这是真的,这里有一个超短的证明。如果存在一个会破坏差分隐私属性的后处理函数……攻击者也可以运行它,并区分两个结果。但这是不可能的,因为差分隐私禁止它 😃

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