我的隐私计算学习——差分隐私

此篇是我笔记目录里的安全保护技术(六),前篇可见:

隐私计算安全保护技术(一):我的隐私计算学习——混淆电路-CSDN博客

隐私计算安全保护技术(二):我的隐私计算学习——秘密共享-CSDN博客

隐私计算安全保护技术(三):我的隐私计算学习——门限签名-CSDN博客

隐私计算安全保护技术(四):我的隐私计算学习——同态加密-CSDN博客

隐私计算安全保护技术(五):我的隐私计算学习——零知识证明-CSDN博客

笔记内容来自多本书籍、学术资料、白皮书及ChatGPT等工具,经由自己阅读后整理而成。


(六)差分隐私

严格来说,差分隐私(Differential Privacy,DP)不算是密码学中的一种手段。首先,密码学方法是对明文数据进行加密处理以达到信息隐藏的目的。差分隐私与其他传统的隐私保护技术一样,未使用密码学方法处理数据,因此无法达到将数据完全随机化的效果。差分隐私和密码学算法是完全不同的两种隐私保护机制。差分隐私可以提高从统计数据库进行数据查询的准确性,同时帮助最大限度减少识别其具体记录的机会。差分隐私技术可以做到攻击者不会通过多次查询而获得新样本的隐私信息,其核心思想是对于任意两个相差一条记录的数据集 D 和 D' (D 和 D' 也被称为相邻数据集)以及任意输出 O,要求添加了随机扰动的查询机制 M(一般是一些统计信息的查询,比如均值、方差)都能满足以下这条式子:

image-20230320140852742

其中 P 是通过查询机制 M 获得输出 O 的概率,这意味着在数据集 D 中一条数据发生变化后通过 M 得到 O 的概率的变化会非常小,概率 P 的变化范围由公式中的 \epsilon 决定,这时称查询机制 M 满足 \epsilon- 差分隐私。在差分隐私的应用中,一般需要程序员设置 \epsilon 值。

在普通情况下,\epsilon 越小,数据可用性越低。\epsilon 越大,隐私保护越弱,但查询结果可以更精确。查询次数越多,隐私保护越弱,攻击者可以通过多次查询来分析结果的分布情况,从而推算真实数据。注意,差分隐私这个 \epsilon 参数具有可组合性的特性。

有些差分隐私机制还引入了 \sigma 参数来控制隐私保护级别。可以这么直观地理解,\epsilon 是单条数据对所有数据包含信息的影响的上界(即去掉这条信息会对原来数据库包含信息产生的最大影响),\sigma 则是这个上界不成立的概率(即有多大概率 \epsilon- 差分隐私失效,从而产生隐私泄露的风险)。显然,\sigma 越小,安全性越高。

按原始数据的存储位置分类按实现环境的交互方式分类
中心化差分隐私(CDP)交互式差分隐私
本地化差分隐私(LDP)非交互式差分隐私

在交互式环境下,用户向数据系统提出查询请求,数据系统根据查询请求对数据集执行差分隐私保护操作并将结果反馈给用户,用户看不到数据集全貌,从而保护数据集中的个体隐私。在非交互式环境下,差分隐私系统针对所有可能的查询,在满足差分隐私的条件下一次性发布所有查询结果,或者发布一个原始数据集的“净化”版本。这是一个不精确的数据集,用户可对该版本的数据集自行进行所需的查询操作。交互式和非交互式差分隐私的工作模式如下图所示:

image-20230421190857258

image-20230320225637599

添加噪声的不同方法称为不同的“机制”:

  • 拉普拉斯机制

    差分隐私通常的做法是在查询结果中引入噪声,对于数值型的查询结果,通常是在查询结果中加入服从拉普拉斯分布的噪声,这种方法被称为拉普拉斯机制。拉普拉斯分布的概率密度函数为:

    image-20230321140053366

    ,其概率密度函数图如下所示:

    image-20230321140135803

    这张图中,横轴表示随机变量 x,纵轴表示对应的概率密度。加入噪声之后的查询结果将具备一定的随机性,一般而言,如果要发布一组数值型查询结果,我们可以为每个结果加入独立的拉普拉斯噪声来满足 \epsilon- 差分隐私。噪声参数 \lambda 取决于修改一条记录时查询结果总共改变多少。总共的“最大改变”被称为这组查询的敏感度,取 \lambda = 敏感度/\epsilon 即能满足 \epsilon- 差分隐私。差分隐私中定义了全局敏感度和局部敏感度,其中,局部敏感度是在固定了相邻数据中某个数据集(D 或者 D')的情况下,计算某算法输出结果的最大差异,而全局敏感度则是对所有相邻数据集的组合进行计算。

    image-20230504115640935

  • 指数机制

    对于输出域为数值类型的算法,可以使用拉普拉斯机制达到差分隐私的要求。但是对于输出域为枚举类型的算法,拉普拉斯机制就很难正常应用了,比如用于计算获得票数最多的候选者名称的算法,这种输出域为一些实体对象集合的算法,则需要使用指数机制来实现差分隐私。

    在指数机制的实现过程中使用可用性函数来代替算法进行敏感度的衡量。我们一般将可以区分不同结果之间优劣性的函数指定为可用性函数,其输出值一般为实数,代表着输出结果 res 的优劣程度。比如在班长选举活动中,需要输出得票数最多的候选者名称,指数机制并没有直接向输出结果添加具体的噪声,而是将算法修改成了随机化算法,其输出结果不是固定的,而是以某种固定的概率进行输出。数据的可用性要求正确结果总是能以较大概率输出,隐私预算越大,正确结果的输出概率就越大;安全性则要求输出结果不能是确定性的,必须存在一定的“出错”概率,隐私预算越小,“出错”的概率就越大。

  • 随机化回答机制

    如果要发布的数据不是数值型,那么需要用其他的方法引入噪声。这里介绍一种用于数据采集的简单机制:随机化回答。

    举例来说,假设一个男生想在互联网上问一个敏感的是非题,比如大家认为他和他的女朋友是否般配。由于问题比较敏感,有些网友可能会不愿意给出真实的答案,这对结果统计可能没有什么意义。为了解决这个问题,我们可以让每个人在他的答案中加入随机噪声。(1)假设他的真实答案是“是”,掷一次骰子,如果掷出来的是1,就回答真实答案是;如果掷出来是2~6,就以投硬币的方式回答是或者否。(2)假设他的真实答案是“否”,也掷一次骰子,如果掷出来的是1,就回答真实答案否;如果掷出来是2~6,就以投硬币的方式回答是或者否。

    由于回答存在随机性,因此攻击者并不能从一个回答者的答案中反推出他的真实答案。只要根据 \epsilon 来调整随机化的概率,即可满足 \epsilon- 差分隐私。那如何从随机化回答中获得统计信息呢?假设有 60000 人按上面的规则进行了回复,其中有 28000 个“是”,32000 个“否”。可知,每个人以 5/6 的概率给的是假回复,即约有 50000人给出假回复,其中约有 25000 个假“是”和 25000 个假“否”。据此可以推算出来剩下的真实回复里约有 3000 个“是和 7000 个“否,即约有 70% 的人的答案为“否”。

    开源框架 SmartNoise

    主要的开发语言是 Python 和 Rust,其在对差分隐私应用的语言支持中以 Python 最为全面。相关代码在 GitHub 上开源:OpenDP · GitHub.

    SmartNoise 使用“分析”这一概念来描述任意的数据分析和计算,比如计算平均值或者方差。为了使数据能通过程序的验证并最终生成满足差分隐私的结果,通常还需要限定数据集的一些属性,比如 upper(上界)、lower(下界)、nullity、n等。最终通过 analysis.release 函数来完成差分隐私的计算。下面简单介绍这些属性的用法:

    ------------------------ upper 和 lower 属性?---------------------------

    用于精确校准干扰以确保差分隐私。在一些需要处理离群值或缺失值的情况下,我们也会使用这组属性。比如,如果需要查询数据的平均值且满足差分隐私,验证程序就会要求为输入数据定义好上下界。定义数据的上下界可以使用钳位组件(包含在核心库的实用程序组件中)来限定数据的范围。

    with sn.Analysis() as analysis: #使用分析来描述计算
     data = sn.Dataset(path = data_path, column_names = var_names)
     age_dt = sn.to_float(data['age'])
     # 使用钳位组件来限定数据范围 
     age_dt = sn.clamp(age_dt, lower = 0., upper = 100.)
    analysis.release()

    ------------------------ nullity 属性?---------------------------

    用于表示数据集是否包含 null,在某些计算中我们要确保数据不是 null。如果数据集的确存在值为 null 的数据,我们可以使用 impose 方法来替换 null 值的数据,并且使替换的值服从指定的分布。

    # 使用impose方法来替换null
    age_dt = sn.impute(data = age_dt, 
                    distribution = 'Gaussian', lower = 0., upper = 100., shift = 45., scale = 10.)

    ------------------------ n 属性?---------------------------

    用来评估相关数据的数量,通常情况下,其值可以是真实数据的数量、经验评估值或者差分隐私流程中生成的值。比如计算数据的平均值时,验证程序也会要求定义好数据的数量。

    # 使用resize来设置数据数量为1000
    age_dt = sn.resize(data = age_dt, number_rows = 1000, distribution = 'Gaussian', lower = 0., upper = 100., 
                    shift = 45., scale = 10.)

    这个时候不用担心设置的数量和真实的数量不符,resize 会根据 n 和真实数据的数量生成一个新的数据集。如果 n 小于等于真实数据的数量,resize 会从真实数据中选出 n 条数据生成新的数据集。如果 n 大于真实数据的数量,resize 会使用全部的真实数据,同时会根据真实数据的情况按数据缺失处理数据的填充。

    ------------------------ 实在不了解数据集的大小?---------------------------

    在有些特殊场景下,数据集的真实大小本身就是隐私信息,比如某个社区里患有艾滋病的总人数。因此,SmartNoise 并不要求提供真实数据的数量。那么,如果确实不了解数据集的真实大小,该怎么设置呢?我们还是可以使用差分隐私的办法来获取数据的数量。

    # 使用差分隐私的方法来获取数据的数量
    dp_num_records = sn.dp_count(data = age_dt, privacy_usage = {'epsilon': .05}, low = 0, upper = 10000)
    # 注意最后一个变量,使用差分隐私获取到的数据数量
    age_mean = sn.dp_mean(data = age_dt, privacy_usage = {'epsilon': .1}, data_lower = 0., data_upper = 100.,
                           data_rows = dp_num_records)

    上述的这些属性可以静态确定,无须接触真实数据,并且分析的每一步都将被更新。但是在调用 analysis.release 之前,用户是无法知道本次分析是否能通过差分隐私的程序验证的,因此需要特别注意每一步处理后的数据是否能满足验证程序的要求。

    SmartNoise 的核心库提供了一系列差分隐私机制、统计工具和一些实用程序。差分隐私机制包括高斯机制、简单几何机制(默认使用)、指数机制和拉普拉斯机制等,统计工具包括计数、直方图、平均值、方差等,实用程序包括强制转换、过滤器、钳位等。来看一个“拉普拉斯机制的直方图分析”示例:

    import os
    import opendp.smartnoise.core as sn
    data_path = os.path.join('.', 'data', 'PUMS.csv')
    var_names = ["age", "sex", "educ", "race", "income", "married"]             #字段名称
    income_edges = list(range(0, 100000, 10000))                                #收入分成10段
    education_categories = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", 
                            "11", "12", "13", "14", "15", "16"]
    # 拉普拉斯机制在添加服从拉普拉斯分布的噪声时使用了浮点数运算,在某些特殊情况下可能泄露隐私
    # 使用拉普拉斯机制需要关闭protect_floating_point,否则运行会报错
    with sn.Analysis(protect_floating_point=False) as analysis:
        data = sn.Dataset(path = data_path, column_names = var_names)
        nsize = 1000
        # 数据分箱
        income_prep = sn.histogram(sn.to_int(data['income'], lower=0, upper=100000), edges=income_edges)
        # delta越小,安全性越高
        income_histogram = sn.laplace_mechanism(income_prep, privacy_usage={"epsilon": 0.5, "delta": .000001})
        sex_prep = sn.histogram(sn.to_bool(data['sex'], true_label="0"))
        sex_histogram = sn.laplace_mechanism(sex_prep, privacy_usage={"epsilon": 0.5, "delta": .000001})
        # 如果数据不再categories范围则设为-1
        education_prep = sn.histogram(data['educ'], categories = education_categories,  null_value = "-1")
        education_histogram = sn.laplace_mechanism(education_prep, privacy_usage={"epsilon": 0.5, "delta": .000001})
    analysis.release()
    ​
    print("Income histogram Laplace DP release:     " + str(income_histogram.value))
    print("Sex histogram Laplace DP release:        " + str(sex_histogram.value))
    print("Education histogram Laplace DP release:  " + str(education_histogram.value))

目前,差分隐私在机器学习领域的应用较为广泛,先来看看机器学习中主要存在的几类隐私攻击:

  1. 成员推断攻击

攻击者试图判断某条记录是否存在于目标模型的训练数据集中。当训练数据包含交易数据或者医疗数据等敏感信息时,个人隐私数据是否存在于特定训练集中是不能泄露的。然而,成员推断攻击可能导致此类隐私信息泄露。其原理可以类比为学生参加考试,学生在碰到之前做过的题目和没做过的题目的反应是完全不一样的,监考老师可以从学生做题的反应反推出学生是否碰到过这个考试题目。

  1. 模型倒推攻击

模型倒推是指通过模型的输出反推训练集中某条目标数据的部分或全部属性值。有研究者将患者的人口统计数据作为辅助信息,以预测药物剂量的线性回归模型作为目标模型,根据模型输出成功地恢复出患者的部分基因组信息。这项研究说明,即使攻击者仅有对模型预测接口的访问能力,也可以通过反复请求目标模型得到训练集中用户的敏感数据。

  1. 参数提取攻击

在目标模型参数不公开的情况下,攻击已知模型的部分结构信息以及标签信息,试图通过访问目标模型反推出模型参数。一般而言, 避免向模型训练服务商付费、期望在掌握模型参数后提高对模型训练集的攻击成功率以及规避恶意邮件识别模型的检测等都是攻击者发起模型参数提取攻击的动机。

而差分隐私的应用场景有以下几类:

  1. 差分隐私数据库,这类数据库只回答聚合查询的结果,通过在查询结果中加人噪声来满足 \epsilon- 差分隐私。

  2. 差分隐私数据合成,基本原理是先对源数据进行建模,得到一个统计模型,然后在统计模型中加人适当的噪声来合成满足 \epsilon- 差分隐私的虚拟数据。

  3. 差分隐私的数据采集,一种典型的应用场景是从移动设备中采集用户数据,如应用程序的使用时长等。比较著名的有苹果公司利用差分隐私技术在 iOS 输人法中找出群体语言趋势,在联想词汇中给出预判;它还能对表情进行排序,优先展示常用表情,避免用户反复查找。

  4. 差分隐私机器学习,在机器学习算法中引入噪声,比如在训练过程中添加噪声、在模型训练中对目标函数添加噪声、对参数或梯度添加噪声、在输出结果上添加噪声,总之使得算法生成的模型能满足 \epsilon- 差分隐私,以防范通过模型反推出源数据记录的问题。

更具体来说,差分隐私可以应用于推荐系统、网络踪迹分析、运输信息保护、搜索日志保护等领域。

(1)推荐系统 推荐系统可帮助用户从大量数据中寻找他们可能需要的信息,需要利用大量用户数据进行协同过滤。在推荐系统中,企业或机构可以在本地直接进行本地差分隐私,将处理之后的数据集上传到数据中心进行聚合计算,并在不知道用户数据的情况下对数据进行计算,最终将获得相同计算结果的数据信息反馈给用户。

(2)网络踪迹分析 通过测量和分析网络流量来获取有用的信息,网络数据和流量记录往往能够给一些企业或研究机构提供研究分析的数据,但由于这类分析数据有可能泄露隐私,所以在共享这类数据之前需要对其进行净化。差分隐私技术可以将用户的网络踪迹,包括但不限于浏览记录、用户习惯、使用时长、下载记录等进行保护处理,使得这些信息不会泄露。

(3)运输信息保护 在公共交通系统中,通过分析车辆及乘客的乘车、行车及换乘等信息,可以促进城市交通系统内和零售行业的知识发现,但由于这些信息包含乘客、车主等多项隐私数据,所以在获取和分析时需要通过差分隐私来进行数据保护。

(4)搜索日志保护 用户在使用搜索引擎进行查询、记录等操作的时候,通常会留下历史记录。搜索引擎公司会阶段性地对外发布高频关键词、查询和点击记录等,这其中也包含用户的个人信息、设备信息等隐私数据,因此需要通过差分隐私来进行数据保护。

以下是结合 TensorFlow 和 Pytorch 这两大深度学习框架的差分隐私开源库:

  • TensorFlow

    谷歌的开源项目 TensorFlow Privacy 、PyDP。

  • Pytorch

    Facebook的开源库 Opacus,使用差分隐私技术来训练 PyTorch 模型。Opacus 库支持以最少代码更改来训练模型,且不会影响训练性能,并允许在线跟踪任意给定时刻的隐私预算。具体来说,Opacus 库重点是利用了差分隐私随机梯度下降( DP-SGD)。该算法的核心思想是通过干预权重更新的梯度来保护训练集的隐私,而不是直接获取数据。通过在每次迭代中向梯度添加噪声,Opacus 可以防止模型记住训练样本。

总结:

差分隐私的优点在于,它严格定义了攻击者的背景知识。除了目标记录,攻击者知晓原数据中的所有信息,这样的攻击者几乎是最强大的,而差分隐私在这个强大的假设下依然能有效保护隐私信息。它拥有严谨的统计学模型,极大地方便了数学工具的使用以及定量分析和证明,且不需要特殊的攻击假设,不关心攻击者拥有的背景知识,量化分析隐私泄露的风险。差分隐私的弱点也很明显,不管发布的数据是否是数值型,噪声的引人会导致数据的可用性下降。特别是对于那些复杂的查询,有时候随机结果几乎掩盖了真实结果。因此,差分隐私需要在隐私和可用性之间寻找平衡。开源框架 SmartNoise 提供了一系列支持中心化差分隐私的组件和工具,为快速搭建差分隐私系统提供了很好的帮助。它还全面支持Python,比较适合用于机器学习场景。

目前在联邦学习领域中,差分隐私主要应用在横向联邦学习中,以抵抗多个客户端和服务器之间的推理攻击;在纵向联邦学习中,则更多地使用密码学的方法保护数据隐私。


10月份新开了一个GitHub账号,里面已放了一些密码学,隐私计算电子书资料了,之后会整理一些我做过的、或是我觉得不错的论文复现、代码项目也放上去,欢迎一起交流!Ataraxia-github (Ataraxia-github) / Repositories · GitHub

  • 18
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值