数据科学中的隐私保护(文字版)

点击这里收听本期节目音频版

编辑: 肖怡婷

本期嘉宾: 宋爽(UCSD 博士候选人) (G)

主播: 阿拉法特 (A), 舒晏 (S)

A
在 2006 年,美国的 Netflix 公司办了一个机器学习的比赛,想要提高自己的推荐系统的准确度。在这个比赛中,Netflix 公布了一个数据集,里面包含了一些真实用户的浏览数据,为了保护隐私,Netflix 把所有跟用户识别信息有关的,比如说用户的 ID 这样的信息都给抹去了,声称这样就可以保护用户的隐私。
S
他们的想法显然是太天真了,他们以为这样就可以完全做到匿名,但是在数据发布的短短一个月之后,就有研究者找到了这些数据中一些用户信息。所以在这期节目中我们就要和大家来讨论在数据科学中的隐私问题。

 00:50 
A
大家好,欢迎收听德塔赛,我是阿拉法特。
S
我是舒晏。今天我们请到的嘉宾是宋爽。
G
Hello,大家好。
S
宋爽是 UCSD 的博士候选人。她的研究方向主要是差分隐私以及一些其他的关于隐私的研究课题。在过去的暑假,宋爽在谷歌实习的时候所做的项目也是和我们今天要聊的内容非常接近,也是差分隐私的项目。
A
在今天这期节目中,我们也会讲到像谷歌这样的大公司在怎么用差分隐私的技术保护他们用户数据的安全。但是首先,让我们还是回到刚刚那个 Netflix 的故事,从那里继续说起。
宋爽,你能给大家介绍一下 为什么在 Netflix 这个比赛中,尽管数据集里面已经把用户名这样的识别信息给抹去了,但是还是有学者能够找到一些数据记录对应的用户是谁。
G
好,就是 Netflix 这个数据集它包含的是一些用户和他们看过并且打过分的一些电影以及他们的打分。其实这些研究者做的也是非常简单的一件事情。他们把 Netflix 这个数据集和另外一个数据集叫做 IMDB,IMDB 也是一个用户和电影评分的一个数据集。但是和 Netflix 不一样的是,它包含了一些用户的个人信息,然后他们做的其实就是把 Netflix 数据集里面的用户和 IMDB 数据集里面的用户给匹配了一下,比如说你看到一个用户他给某几部电影打分,他比如说喜欢某一部,不喜欢某一部,那你在 IMDB 里面也找到一个类似的用户,他也给这些电影打过分,也是喜欢相应的这一部,不喜欢相应的那一部,那你就可以比较大概率的确定,这两个人其实就是同一个人。
S
因为在这个 IMDB 中其实有很多的数据,它不是完全匿名的。所以他只要到这个 IMDB 里面去找出这些用户就可以了,是这样吗?
G
对。

 03:08 
A
在 Netflix 这个故事中,研究者是把 Netflix 给我们提供的数据和一些外界他们自己收集的数据给联系起来了。那么除了这种攻击方式之外,宋爽你知道还有哪些比较常见的,会导致隐私泄露的攻击方式吗?
G
比如说还有一种攻击,叫做 differencing attack。一个比较有名的例子就是 Target 之前造成的一些信息泄露。像 Target 这样的超市,他们会定期把一些优惠券寄给他们的顾客,他们选择优惠券会根据这个顾客之前的购物记录。有一次就发生了一个比较有意思的事情,就是 Target 给一家人寄了一些关于婴儿用品的优惠券。这家人就觉得很奇怪,因为他们家并没有婴儿,但是结果他们最后研究了一下,发现其实是他们家的女儿当时怀孕了,只是因为她还是一个青少年,她当时还没有敢跟她的父母说。那 Target 为什么要给他们家寄这个婴儿用品的优惠券呢?就是因为 Target 发现这个女孩的购物的模式发生了一些变化,她开始买一些没有香精,没有添加剂的护肤用品,然后 Target 根据他以前对于用户的这些了解,就是用户一般怀孕了之后,她肯定会开始买一些这样的东西,所以他就觉得应该是很大可能就是这个女孩她怀孕了,所以开始寄这样的优惠券。
A
那么在 Target 这个故事中,为什么我们把这种攻击叫做 differencing attack 呢?
G
那在 Target 这个例子里面,我们就可以看到 Target 使用的这个模型,它在持续的观测用户的购物模式。当用户的购物模式发生了一点改变的时候,它就判断出用户本身的生活可能发生了一些改变。在这样的例子里面,我们就可以看到这样的模型,它本身对于它使用的数据是非常敏感的。虽然在这个例子里面并不存在一个实际的 Attacker,但是我们可以考虑另外的一个情景,比如说一个公司在持续地发布自己的平均工资是多少,比如说它每个月发布了一次。假如说我作为一个 Attacker,知道有一个人他在这一个月加入了这个公司,这个时候我就可以看上一个月的平均工资和这一个月的平均工资之间的差距,根据这个差距我就可以精确地计算出来这一个人的工资是多少。这样的 Attacker 在观测这个模型在不同的数据上面的输出值的差距,所以我们把它叫做 differencing attack。
S
所以说这个里面的 difference 指的是我这个模型的输出的的 difference。我通过看模型输出的差别,我可以套出来在输入的数据集中的变化。

 06:22 
G
是的。其实还有另外一种很常见的 Attack,叫做 Reconstruction Attack。比如说有一篇论文它就攻击了一个人脸识别的模型。这个模型是说里面比如说有 N 个人,然后每个人有几张关于他的脸的图片。这个模型想实现的就是说,给一个图片,然后我能告诉你是它是 1 到 N 里面的哪一个人。这篇论文他们做的重构攻击就是他们重构出来了在训练集里出现过的一个人的人脸的这样一张图片,这张图片跟那个人实际的长相差距其实还挺小的。
A
在这个例子中,攻击者是可以接触到这个模型,他可以给这个模型发一个查询,比如说我给这个模型发一张我的照片,然后这个模型会判断我是这 N 个人中的哪一个,是这样吗?
G
对的,它不仅知道模型认为这是 N 里面的哪一个人,它也知道模型在整个 N 个人上面的一个分布。但是它并不假定它需要知道模型本身是怎么做到的,比如说它不需要知道那个模型具体是哪一个机器学习的模型。
S
也就是说,它做的事情是它不停的给很多图片的输入,然后让这个人脸识别的模型去给 1 到 N 这几个人在这个概率上的一个分布。只根据这个分布,它就可以重新还原出来图片本身。
G
对的,它其实就是把这个问题转化成了一个优化问题,就是说我怎么找到一张图片,使得这个模型给我返回的这个分布在我想要的那个人,那一个 class 上面的值最高。
A
也就是说攻击者是从随便的一张人脸出发,靠观察这个模型,对这张人脸属于哪一个人的一个概率分布来不停地调整这个脸的长相,最终达到了这个模型说这个人脸一定是比如说第三个人的人脸,让他就恢复出了这第三个人实际长什么样子。
G
对的。

 08:41 
G
好,比如说一个流行了很多年的方法,叫做 k-anonymity。k-anonymity 说的就是我们在公开这个数据集的时候,我们希望每一个人的每一个特征都不能被用来识别这个个体。比如说有一个数据集,里面有一个人,她的年龄是 27 岁。那如果作为一个攻击者,我们知道某一个人她年龄是 27 岁,她的数据就在这个数据集里面,那我就可以明确地知道哪一条数据是她的。现在如果我把所有的年龄改成 10 到 20 之间的,我就说 10 到 20,而不说具体的某一个年龄。那这样的话,可能这个数据集里一下就出现了比如说 50 个 20 到 30 岁之间的人。那作为一个攻击者,我就不能知道具体哪条数据对应的是我想要攻击的这个人的信息了。
S
这个方法非常简单,但是其实它也有它的问题。比如说它只是对于某一个特征进行了匿名化,但是,比如说我知道这个 27 岁的用户更多的信息,比如说我们知道她是 20 到 30 岁,并且她是女性,来自于中国。那如果满足这些条件,在这个数据集中又只有一个人的话,那其实我们还是可以通过不同的特征来锁定某一个人,从而获得他其他的信息的。那么近几年有什么其他的方法可以更好地解决这样的问题吗?
G
其实目前在机器学习和数据科学领域最常用的保护隐私的方法叫做 Differential Privacy,中文叫做差分隐私。这个概念是 2006 年一篇发表在 TCC 上面的论文里面提出的,而且他们得了 2017 年的哥德尔奖。Privacy 跟以前常用的比如说 k-anonymity 之类的隐私定义比较起来,差分隐私是一个更加严格的要求。

 10:54 
A
那么差分隐私它具体是怎么定义的呢?
G
差分隐私是一个对于算法本身的要求,所以我们会说一个算法本身它满足不满足差分隐私。
那什么叫做满足差分隐私呢?直观的来说,就是我们需要这个算法做到一件事,就是一个人的数据,它在或者不在这个数据集里,算法的结果不会有显著的差别。那具体来说,给定一个数据集 D,一个随机的算法 M,它的输出会服从某一个分布。差分隐私要求的就是,如果我们把这个数据集 D 里面的其中一条数据给替换掉,那 M 的随机分布它不会产生很大的变化。
A
为什么有了这个做法就可以保证单个用户的隐私不被泄露呢?
G
我们刚才说到当 D 里面的其中一条数据被替换掉的时候,M 的输出分布不会产生很大的变化。那你可以想象被替换掉的这条数据就是你的数据,所以差分隐私的要求可以被解释为:你的数据在或者不在数据集里面,不会对算法的输出造成很大的影响。
S
就是说我光看这个算法的输出是无法对这个输入的数据做任何的推断的。
G
对,就是说我不能通过看这个输出,来判断你的数据是不是在数据集里面。

 12:14 
A
差分隐私的定义听起来非常抽象。宋爽你能给我们举一个具体的例子,怎么做能够让一个算法满足差分隐私的要求吗?
G
其实这样一个算法满足差分隐私的要求也挺简单的。大家最常用的一个办法就是在我实际的输出上面加一种噪声。然后这个噪声也是服从 Laplace 分布的。比如说我有一个数据集,它包含了一个公司里面所有人的工资,然后我现在想输出一个大家的平均工资。如果不考虑隐私的话,我们就可以直接算出来平均工资,然后直接把平均工资输出出去。但是现在我们需要保证差分隐私,所以我们就在实际的平均工资上面加一个 Laplace noise,然后把这个加完噪声之后的平均工资给发布出去,这样就可以保证差分隐私。
还有另外一个方法叫做 Exponential Mechanism。这种方法主要的应用场景就是,当我们的算法的输出不是一个连续的值,而是一个离散的值的时候。比如说我们有一个数据集,里面包含了很多患某一种病的人的一些资料。我们都知道一个疾病它可能有很多种不同的症状,比如说我们想根据这个数据集知道这种疾病最常见的症状是什么。那这个时候我们的输出就是某一个症状,因为这个值是一个离散的值,所以我们再往上面加 Laplace noise 就没有意义了,所以 exponential mechanism 它做的就是我先给这些不同的症状,每个症状一个分值,这个分值就是有多少人出现了这个症状。有了这个分值之后,我们可以把这些分数都归一化,然后就形成了一个随机分布。现在我们就从这个随机分布里面随机的抽取一个症状。那这样的话,虽然我们知道我们并不是每次都会抽到实际上最常见的症状,但是实际最常见的症状是最有可能被选取到的症状。
S
不管是加噪声的方法还是 Exponential Mechanism,它其实都是通过给我的输出加了一些随机性从而达到保护隐私的作用的。
G
对的。差分隐私它非常需要算法本身存在一个随机性,所以我们就需要以某种方式往我们的算法里面弄一些随机的东西,比如说我们这个随机可以是通过加噪声来的,也可以是通过从某一个分布里面随机抽样得来的。

 14:45 
A
我感觉这会对算法的性能产生一定的影响。比如说在你刚刚提到的这个例子中,我们的算法本来就是要告诉我们最常见的一个症状,但是现在为了保护隐私,我们要给算法加入一点随机的噪声,那么算法返还的症状虽然在期望上还是最常见的那个症状,但实际上如果每次看单次算法返回的症状,它并不一定保证绝对是最常见的那个症状,所以我们需要考虑我们让算法的性能受到了多大程度的一个下降吗?
G
对的,我们需要考虑到这一点。但是我们首先应该明确的一点就是:在性能和隐私之间是存在一个权衡。所以通常来讲,当我们需要保护隐私的时候,我们就一定会牺牲掉某种程度的性能。但是在现实中,我们当然希望在保证同样程度的隐私的前提下,我们牺牲的性能越少越好。所以实际上我们做就是说 Private 的机器学习或者数据挖掘的时候,我们就想要找到一些更加聪明的加噪声的方式,我们想要在保证同样隐私的情况下,最小程度的影响算法最后的结果。
S
是说对于每一个机器学习的算法,我们都会有一个不同的这种加噪声的方法,我们都需要有不同的考虑吗?
G
通常来讲是,但是一般来说,我们把一个机器学习的算法变成 Differentially Private 的时候,都是在使用刚才我提到那两种基本的算法,就是 Laplace noise 和 Exponential Mechanism 作为最基本的基石,但是我们会根据不同的机器学习的算法选择在某些不同的步骤上面加噪声或者引入随机的抽样。
A
我们刚提到了一些加噪声的算法,但更多是针对一些统计的信息,比如说我想知道平均值或者最常见的症状。那么具体到一个机器学习算法,人们一般是怎么样通过加入噪声让一个算法满足差分隐私的要求的呢?
G
我们以随机梯度下降 (Stochastic Gradient Descent) 为例。一个最简单的办法就是我们把 SGD 的每一步都加一个 Laplace noise。但这样的话你可以想见,虽然我们每一步加的噪声本身是一个平均值为零的噪声,但是我们这样一步一步的加下来,很可能就会对最后的结果造成非常大的影响。那大家就可能会考虑到一些更加聪明的方法,比如说我们如果做一些 Convex Optimization 的问题,那我们就可以在这个目标函数上面加一个随机向,然后再优化加完随机向之后的目标函数。还有一些论文,它们就会考虑到当这个目标函数本身有一些比较好的性质,比如说它是 convex 的,它是 smooth 的,那这样的情况下他们就证明了如果我们在 SGD 的最后这一步加某一种噪声的话,也是可以保证差分隐私的。
A
你是说在最后一步 SGD 迭代的时候加噪声,但是之前都不加。
G
对的,但这样的情况下我们假设的是我们最后只是公布最后一步,中间的步骤是不公布的。
A
毕竟 SGD 的输出常常就是最后一步迭代的输出,比如说要让被优化的函数的值达到最小的一个参数向量,所以我们只要在最后一步加噪声就已经能够满足我们的实际需求了,是吗?
G
对,当我们只输出最后一步的时候,我们就只往最后这一步上面加一些噪声。但是如果你在 SGD 的每一个步骤上面都加上噪声之后,你就可以把 SGD这个过程中产生的每一个 classifier 都输出出来,这整个也是满足差分隐私。

 18:25 
S
那我们知道其实绝大部分的深度学习的模型都是用 SGD 训练的。那鉴于刚才你说了 SGD 它是可以做到 Differentially Private 的,那么有没有一些这个差分隐私在深度学习上的应用呢?
G
有的。我觉得一个比较有名的文章就是谷歌最近发了一篇文章叫做 Deep Learning with Differential Privacy。他们在文章里就是在用 SGD 来训练一个神经网络。因为一个神经网络它本身并不是凸的,所以在他们这样的情况下,他们其实只能用我们刚才提到的第一种办法,就是在 SGD 的每一步都加一个 Laplace noise。但是他们稍微做了一点改进,就是它们在加完这个了 Laplace noise 之后做了一个投影,就像我们通常做 SGD 的时候也会做一个投影,他用这个 projection 就稍微降低了一下加 Laplace noise 对它本身算法的影响。他们也研究了一下怎么根据神经网络不同的 layer 的特点来做这个投影。
S
其实刚才宋爽说的这种投影的方法,在深度学习中我们叫 Gradient clipping,它也是在深度学习中非常常见的一种方法。它是为了避免在做 SGD 的时候,某一步的更新用力过猛,以至于最后它整个训练过程无法收敛了。

 19:46 
A
那差分隐私这种做法,在工业界,比如说在公司实际的产品中有在使用吗?
G
的确有些公司已经开始在用差分隐私了,比如说谷歌在 Chrome 里面,当它在收集用户数据的时候,它就采用了 Differentially Private 的一个算法,它那个项目叫做 RAPPOR。还有另外一个比较有名的就是 Apple,它在收集统计很多数据的时候也是用了差分隐私,比如说它在统计哪一种 Emoji 被用户用得最多的时候也是用到了差分隐私这个概念。
A
像我们在使用 iPhone 输入法的时候,苹果为了收集我们的输入习惯等信息,它有在使用差分隐私来保护用户输入的这些隐私信息不要被泄露出去。
G
对的,其实还有一些其他的公司,比如说像 Uber 和 Amazon,他们也是开始了在差分隐私这个领域的研究。
A
看来差分隐私不只是一个纯粹的理论研究,它在工业界也是已经被比较广泛的使用了。
S
是的,这期节目我们和大家聊的内容有点不同,之前的节目我们一直都在聊机器学习的算法怎么能更高更快更强,而这一期我们是更偏重于怎么样能够做到更安全。
A
就现阶段来说,隐私保护并不是大家最关注的一个领域。大多数人更关注的还是怎么样实现一个系统,怎么样提高一个算法的准确率。但是在我们把机器学习算法集成到身边越来越多的设备中之后,如果我们不能够保护我们的私人信息,不会因为和这些算法的交互而被泄露出去,可能也就很难放心的去使用这些设备了。
S
那我们今天也很感谢宋爽参与到我们的节目中来。
G
也非常谢谢你们,能让我来这个节目和大家分享一下我做的这个研究,也希望大家能更多地了解一下差分隐私。
A
那么今天这期节目就到这里了,非常感谢大家的收听。我们下期节目再见。
S
再见。