基于推理嵌入和安全的双方计算的保护隐私的句子语义相似度

隐私保护计算

隐私保护计算或安全计算是密码学的一个子领域,其中两个(两方,或2PC)或多个(多方,或MPC)方可以一起评估一个函数,而不向对方透露有关各方的私有输入数据的信息。这个问题和它的第一个解决方案是在1982年由Andrew Yao的一个惊人的突破提出的,这个突破后来被称为姚明的百万富翁”的问题”。

姚的百万富翁问题是两个百万富翁,爱丽丝和鲍勃,他们想知道他们谁更富有不透露他们的真正财富。换句话说,他们想要的可以被概括为:Alice和Bob想要共同安全地计算一个函数,除了输入数据的计算结果(对他们来说是私有的)之外不知道其他任何东西。

为了使问题具体,Alice有量的,如$ 10和Bob拥有量B,如$ 50,他们想知道的是哪一个是较大的,没有鲍勃揭示量B给Alice或翘透露出什么量的给Bob。这是要注意同样重要的是,我们也不想在第三方信任,否则问题将只是向可信方信息交换的一个简单的协议。

形式上我们想要的是联合求以下函数的值:

r = f(A, B)

比如私有值一个B举行私人到它的唯一拥有者,并在结果r只有一方或双方知道。

这样的问题是可以解亚洲金博宝决的,这似乎很违反直觉,但是让许多人吃惊的是,在某些安全需求上是可以解决它的。由于FHE等技术的发展(完全同态加密),不经意传输,的电路这样的问题开始在现实生活中得到应用,现在许多公司都在使用这些问题,如信息交换、安全定位、广告、卫星轨道防撞等。

我不打算进入这些技术细节,但如果你有兴趣在OT(不经意传输)背后的直觉,你一定要读由Craig Gidney完成了惊人的解释在这里。当然,也有许多不同的协议用于执行2PC或MPC,其中每个协议都假定有一些安全需求(半诚实的、恶意的等等),我不打算详细说明,以使这篇文章专注于目标,但您应该知道这一点。

问题是句子相似度

我们要实现什么是使用隐私保护的计算来计算句子之间的相似性,但不透露句子的内容。只是为了给一个具体的例子:鲍勃拥有一家公司,拥有许多不同的项目的句子,如描述:“这个项目是关于建立一个深度学习的情绪分析框架,将用于推文Alice拥有另一家竞争公司,她也用类似的句子描述了不同的项目。他们想要做的是,共同计算项目之间的相似性为了找到他们是否应该做合作项目,然而,这是重要的一点:鲍勃不希望爱丽丝知道项目描述和爱丽丝都希望鲍勃是意识到自己的项目,他们想知道最接近的匹配不同项目之间的运行,但是没有披露项目理念(项目描述)。

句子相似度的比较

现在,我们怎么能没有透露关于该项目的描述信息,交换有关Alice和Bob的项目句子的信息?

一个简单的方法就是计算句子的哈希值然后只比较哈希值来检查它们是否匹配。然而,这将假定描述是完全相同的,除此之外,如果句子的熵很小(比如小句子),具有合理计算能力的人可以尝试恢复句子。

解决这个问题的另一种方法(就是我们将要使用的方法),是比较句子嵌入空间中的句子。我们只需要使用机器学习模型(我们将使用InferSent然后比较句子的嵌入。然而,这种方法也引发了另一个担忧:如果Bob或Alice训练一个Seq2Seq模型,该模型将从另一方的嵌入中返回到对项目的大致描述中,那会怎么样?

考虑到句子的嵌入,我们可以找到对句子的大致描述,这并非不合理。这就是为什么我们将使用双方安全计算来计算嵌入的相似性,以一种Bob和Alice计算嵌入的相似性的方式而不透露他们的嵌入,确保他们的项目理念的安全。

整个流程如下图所示,Bob和Alice使用相同的机器学习模型,然后使用这个模型从句子到嵌入,再安全计算嵌入空间的相似性。

整个过程的概览图。

用InferSent生成句子嵌入

Bi-LSTM max-pooling网络。来源:来自自然语言推理数据的通用句子表示的监督学习。Alexis Conneau等人。

InferSent是Facebook开发的万能句表示的NLP技术,用途监督培训,生产出高转让交涉。

他们使用了双向LSTM,其注意力始终超过了许多无监督的训练方法,如SkipThought vector。他们还提供了Pytorch实现我们将用它来生成句子的嵌入。

注意:即使你没有GPU,做几句嵌入也可以有合理的性能。

生成句子嵌入的第一步是下载并加载一个预先训练好的推断模型:

进口numpy的从NP进口火炬#训练模型:https://github.com/facebookresearch/Infer金宝博游戏网址Sent GLOVE_EMBS = '../dataset/GloVe/glove.840B.300d.txt' INFERSENT_MODEL = 'infersent.allnli.pickle' #负荷训练InferSent模型模型= torch.load(INFERSENT_MODEL,map_location =拉姆达存储,在上述:存储)model.set_glove_path(GLOVE_EMBS)model.build_vocab_k_words(K = 100000)

现在,我们需要定义一个相似性度量来比较两个向量,并为实现这一目标,我会余弦相似性(188betcom网页版),因为它是非常简单的:

因为(\ pmb x \ pmb y) = \压裂{\ pmb x \ cdot \ pmb y} {| | \ pmb x | | \ cdot | | \ pmb y | |}

正如你所看到的,如果我们有两个单位向量(与标准1向量),在公式的分母两个方面将是1,我们将能够去除公式的分母整体,只留下:

cos(\hat{x}, \hat{y}) =\hat{x} \cdot\hat{y}

因此,如果我们标准化我们的向量,使其有一个单位范数(这就是为什么向量在上面的等式中戴着帽子),我们可以使余弦相似度的计算变成一个简单的点积。这对我们以后计算相似距离有很大帮助当我们使用一个框架来做点积的安全计算时。

因此,下一步是定义,将采取一些句子文本,并将其转发给模型生成的嵌入,然后将它们归到单位向量函数:

#该功能将转发文成模型和#得到的嵌入。在此之后,它会#正常化到一个单位向量。DEF编码(模型,文本):嵌入= model.encode([文本])[0]嵌入/ = np.linalg.norm(嵌入)返回嵌入

正如你所看到的,这个功能是非常简单的,它会将文本到模型中,然后将被嵌入标准划分嵌入载体。

现在,由于实际的原因,我稍后将使用整数计算来计算相似性,但是,由InferSent生成的嵌入当然是真实的值。出于这个原因,您将在下面的代码中看到我们创建了另一个函数缩放浮点值并删除小数点将它们转换为整数。还有另一个重要的问题,我们将在以后使用安全计算框架不允许有符号整数,因此我们还需要在0.0和1.0之间剪辑嵌入值。这当然会导致一些近似错误,然而,我们仍然可以得到非常好的近似剪裁和缩放的精度有限(我使用14位缩放,以避免溢出问题,在以后的点积计算):亚洲金博宝

这个函数将缩放嵌入以去掉小数点。def scale(embedded): scale = 1 << 14 scale_embedded = np。clip(embedding, 0.0, 1.0) * SCALE return scale_embedding.astype(np.int32)

您可以在安全计算中使用浮点,而且有很多框架支持它们,但是,这样做比较棘手,因此,我使用整数算法来简化本教程。上面的函数只是一个简单的hack。很容易看出,我们可以在稍后恢复这种嵌入,而不会造成太大的精度损失。

现在我们只需要创建一些我们将要用到的例句:

Alice的句子列表alice_sentence = ['my cat loves to walk over my keyboard', 'I like to pet my cat',]

并将其转换为嵌入物:

# Alice句子alice_sentence1 = encode(model, alice_sentences[0])

因为我们现在有了这些句子而且每个句子都是标准化的,我们可以计算余弦相似度通亚洲金博宝过做向量之间的点积:

> > > np。点号(bob_sentence1, alice_sentence1) 0.87985420.62976325点(bob_sentence1 alice_sentence2)

可以看出,Bob的第一句话(~0.87)与Alice的第一句话(~0.62)最相似。

既然我们现在有了嵌入,我们只需要把它们转换成有比例的整数:

#规模爱丽丝句子嵌入alice_sentence1_scaled =量表(alice_sentence1) alice_sentence2_scaled =量表(alice_sentence2) #规模鲍勃句子嵌入bob_sentence1_scaled =规模(bob_sentence1) #这是句子的单位向量嵌入> > > alice_sentence1数组([0.01698913,-0.0014404,0.0010993,……这是作为整数的缩放向量>>> alice_sentence1_scaled array([278, 0, 18,…, 41,135, 76], dtype=int32)

现在把这些嵌入作为有比例的整数,我们可以进入第二部分,在那里我们将在双方之间进行安全计算。

双方安全计算

为了在双方(Alice和Bob)之间执行安全计算,我们将使用偿框架。ABY实现了许多不同的安全计算方案,并允许您将您的计算描述为如下图所示的一个电路,其中描述了姚的百万富翁问题:

姚明的百万富翁问题。取自ABY文档(https://github.com/encryptogro金宝博游戏网址up/ABY)。

正如你所看到的,我们有两个输入进入一个GT门(大于门),然后一个输出。对于每个输入,该电路的位长为3,并计算Alice输入是否大于(GT门)Bob输入。计算方然后秘密共享他们的私有数据,然后可以使用算术共享,布尔共享,或姚共享安全评估这些门。

ABY是很容易使用,因为你可以描述你的输入,股票,盖茨和它会做休息,你如创建套接字通信信道,在需要的时候进行数据交换等。然而,实施完全是用C ++编写,并I’m not aware of any Python bindings for it (a great contribution opportunity).

幸运的是,有一个实现的例子,可以为我们做点积计算例如在这里。我不会在这里复制的例子,但只有一部分,我们必须改变读取嵌入矢量,我们之前创建的,而不是生成随机载体和增加的比特长度为32比特。

之后,我们只需要在两台不同的机器上执行这个应用程序(或者像下面这样在本地模拟):

这将执行服务器部分,-r 0指定角色(服务器)#,-n 4096定义向量的维度(InferSent生成# 4096维的嵌入)。~# ./innerproduct -r 0 -n 4096 #,在另一个进程(或另一台机器,但对于另一台#机器,您必须明确指定IP)上相同。~# ./内积- r1 - n4096

得到以下结果:

alice_sentence2和bob_sentence1的内积= 171746521

即使在整数表示中,你可以看到Alice的第一个句子和Bob的内积更高,意味着相似度也更高。现在让我们把这个值转换回float:

尺度= 1 << 14这是点积我们应该得到。这是我们在安全计算中得到的内积>>> 226691917 / SCALE**2.0 0.8444931 #这是点积,我们应该得到>> np。点(alice_sentence2, bob_sentence1) 0.6297632 #这是我们在安全计算>>> 171746521 / SCALE**2.0 0.6398056得到的内部积

正如你所看到的,我们得到了很好的近似,即使在低亚洲金博宝精度数学和无符号整数需求的存在。Of course that in real-life you won’t have the two values and vectors, because they’re supposed to be hidden, but the changes to accommodate that are trivial, you just need to adjust ABY code to load only the vector of the party that it is executing it and using the correct IP addresses/port of the both parties.

希望你喜欢!

- Christian S. Perone

引用本文为:基督教S. Perone,“隐私保护使用InferSent的嵌入和安全两方计算句子的语义相似性,”在亚洲金博宝未发现的地域,22/01/2018,//www.cpetem.com/2018/01/privacy-preserving-infersent/

2“基于推理嵌入和安全双方计算的保护隐私的句子语义相似度”的思想

  1. 关于两个向量的余弦相似度:我一直在试图用文向量作为句子相似度的度量。使用SNLI文集,我没有看到在既定程序以及非entailed句子的余弦相似性的显着差异。使用InferSent,我得到的0.68的平均相似性的既定程序以及0.61禁忌entailed句对。似乎没有成为一个有意义的分离。

    从你的经验来看,你是否看到修饰句和非修饰句之间有更大的区别?

留下一个回复

您的电子邮件地址将不会被公布。

这个网站使用Akismet来减少垃圾邮件。了解如何处理您的评论数据