0. 差分隐私简介
随着GDPR法规的实施,各大公司为了避免罚款,开始重视用户个人隐私的保护。差分隐私是近年新兴的一个研究领域,主要研究如何使用数学方法保护数据中的用户个人隐私。
简单而言,差分隐私主要通过给数据增加随机噪音来污染数据,来达到保护隐私的作用。但噪音的多少至关重要,如果噪音太少不足以达到隐私保护的目的,如果噪音太多就会掩盖有价值信息。而具体往数据中增加多少噪音,就是差分隐私需要讨论的问题
1. 问题背景
我们假设一个企业想要发布自己用户的统计信息,例如:T宝计划发布用户每个城市的用户每年平均消费金额,作为某个活动的宣传文案。直观来看,公布城市的统计数据(比如平均值)并不会泄漏任何人的隐私。但在最坏的可能下,少数人的数据会因此而暴露。
具体情景如下:
假设X城市总人数为100人,T宝公布的该城市2018年人均消费金额是1万元,2019年人均消费金额暴增到2万元。
同时你从其他信息渠道得知,某知名富二代Y在2019年搬入X城市。X城市现在的人口是101人。
那么根据平均值的定义,我们可以推算出,客户Y的年消费金额是 2万*101-1万*100=102万
虽然该公司只是公布了X城市两年的人居消费数据,但在不经意间暴露了一位新来客户的信息。这就是差分隐私要解决的问题之一
2. -差分隐私
开始之前,需要先量化需要解决的问题。在上面的例子中,主要的问题来自于连续公布的两个统计量(1万和2万)相差太大,带来了隐私泄露。
此类问题的解决方案称为
这个公式中,右侧的参数
在公式的左边,
式子左边则表达的是,在
这个约束条件能够保证个体数据的差异给总体统计量带来的影响在有限范围内,确保了个体的隐私安全。
在
请注意,
以上仅仅定义了我们的隐私保护目标,但没有提及如何实现这一隐私保护目标。具体的实现手段有很多,最常用的是接下来介绍的拉普拉斯机制
3. 拉普拉斯机制(The Laplace mechanism)
拉普拉斯机制,也称为噪音增加机制,通过给数据增加噪音来保护隐私。噪音的本质是一个符合拉普拉斯分布的随机数:
这个随机噪音的随机程度(方差)取决于它的规模(scale)参数
这个过程需要引入一个新的概念:敏感度(sensitivity)。
4. 敏感度
在差分隐私中,我们把两个相邻样本集(上文中的
敏感度的具体值通过实际所使用的样本集
import numpy as np def sensitivity(data, agg_func): max_diff = 0 for i in range(len(data)): max_diff = max(max_diff, abs( agg_func(data) - agg_func(data[:i] + data[(i+1):]) )) return max_diff sensitivity( [1,2,3,4,5], np.mean) # output is 0.5
当然这种蛮力法计算敏感度非常低效,我们也可以根据具体的统计函数来进行优化。例如,如果我们需要保护的统计量是平均值,那么可以其敏感度往往取决于数据集中最大和最小的元素。
此外这种计算只考虑到了移除一条数据的敏感度,增加一条新数据的敏感度同样应该考虑在内。比如原数据集是
5. 拉普拉斯参数估计
计算得到了上一节中的敏感度
根据以上参数,在数据集
其中敏感度
只要使用以上参数生成噪音,就能够保证所得到的统计量能够满足
具体证明过程如下(太复杂可以跳过)
考虑到
6. 小结
总结以上内容,在实践中公布敏感数据集的统计量时,可以遵循以下步骤:
- 根据数据的敏感程度确定
的取值,如果不知道取多少的话 1 是一个比较中间的选项。更敏感的数据可以选择小于1的值,不那么敏感的数据可以选择更大的 - 根据具体的数据计算数据集
的敏感度 ,其中 与 仅相差一条数据 - 计算拉普拉斯随机数的尺度(Scale)参数
- 最后在公布的数据集统计量上增加对应的拉普拉斯随机数
这样就能保证所公布的数据有足够的隐私保护。
当然这套流程仅适用于数据的一次性静态发布。如果有用户反复查询同一个数据集上的统计量,每次都得到了使用不同噪音保护的结果,那么通过大量的查询依旧可以估计出无噪音的真实结果。在这种场景下则需要引入隐私预算(privacy budget)的概念来进一步保护数据隐私。