【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining

文章目录

论文地址: https://dl.acm.org/doi/10.1145/3292500.3330920

1 INTORDUCTION

隐私是跨多方协作数据挖掘的一大障碍。我们提出了一个面向大规模数据挖掘任务的多方计算(MPC)框架。PrivPy结合了易于使用和高度灵活的Python编程接口和最先进的基于秘密共享的MPC后端。通过基本的数据类型和操作(如NumPy数组和Broadcasting),以及自动代码重写,程序员可以方便地用熟悉的Python编写现代数据挖掘算法。我们证明了我们可以用最少的算法移植工作来支持许多现实世界中的机器学习算法(例如逻辑回归和卷积神经网络)和大型数据集(例如5000乘以100万的矩阵)。

安全多方计算(MPC)允许多个参与者共同计算一个函数,除最终结果外,不需要透露其他的隐私信息。经过几十年的发展,实际应用中的数据挖掘应用程序开始使用MPC,但是在发展的过程中仍然存在很多的问题。MPC的可编程性就是一个很大的问题,尤其是对于大数据应用,尽管几十年来MPC的效率不断提高,但现有的MPC通常忽略掉了数据挖掘应用的核心要求。使用者需要相当丰富的密码学专业知识才能够理解每次运算的成本,要么就需要使用一些特殊的编程语言。一些有用的解决方案尽管为MPC提供了丰富的接口,但主要关注基本的MPC运算,不仅包括基本的算数运算,还包括低级的加密工具如OT。相反,机器学习开发者使用基于Python的框架,例如PyTorch,Tensorflow和Scikit-learn,并内置支持高级数据类型,例如实数,向量和矩阵,以及非线性函数,例如逻辑函数和ReLu。对于数据科学家而言,几乎不可能以MPC语言在现代机器学习包中重建和优化所有这些通常需要考虑的原语。另一方面,MPC专家重写所有机器学习算法包也很昂贵。因此,设计一个对数据挖掘社区友好的MPC前端是至关重要的,如今它是带有NumPy的Python。实际上,许多机器学习框架都使用Python前端,并提供Numpy风格的数组操作来简化机器学习编程。

在本文中提出了一个高效的隐私保护协同数据挖掘框架PrivPy,旨在为数据挖掘编程提供一个优雅的端到端的解决方案。PrivPy前端提供了与NumPy(最流行的Python包之一)类似的Python接口,以及广泛的机器学习中常用的函数。我们还提供了一个基于秘密分享的计算引擎,并提供了高效的算法。我们想强调的是,PrivPy的主要目标不是在密码协议方面取得理论上的突破,而是建立一个实用的系统,在安全的计算框架上实现优雅的机器学习编程,并在效率和安全性之间做出正确的权衡。贡献如下:1.带有高级数据类型的Python编程接口:提供了非常简洁的Python语言集成环境,支持隐私通用操作和高级原语,包括Broadcasting(对不同形状的数组进行操作),nadrray方法。Numpy的两个特性被广泛用于实现机器学习算法,开发人员可以用最少的努力将复杂的机器学习算法移植到PrivPy上。2.代码自动检查和优化:前端通过对代码进行检查并进行自动优化,帮助程序员避免性能陷阱。3.编程前端和计算后端的解耦:引入了一个同游的私有操作层,允许同一个接口支持多个计算后端。针对不同的性能和安全性假设进行选择。4.大规模机器学习任务的验证:在真实的数据集和应用场景上演示了系统用于数据挖掘应用的实用性,如数据查询、逻辑回归、卷积神经网络。系统可以透明的操作5000*1000000维的矩阵,表明了系统可以扩展到大型任务。

3 PRIVPY DESIGN OVERVIEW

3.1 问题公式化

应用场景
1.多源数据挖掘
例如多个组织,单独收集数据集的一部分,想要共同进行模型的训练,同时不泄露任何的信息。例如多个医院,分别收集患者的信息,联合训练模型进行疾病的诊断,但是在诊断的过程中不会向对方泄露任何关于患者的信息。
2.基于秘密模型和数据的推理
在某些情况下模型的参数是有价值的。例如信用评分参数通常是保密的。模型所有者和数据所有者不希望在计算过程中泄露数据。
问题公式化
将上述两种情况描述为一个MPC问题,包含n个客户端Ci(i=1,2,3,…n),每个客户端Ci 都有一组私有数据集合Di作为输入。最终的目标是使用所有的数据集合共同计算某个函数o=f(D1,D2,…,Dn),在计算过程中除了输出o外,不会泄露其他的任何私有信息。Di 可以是客户端Ci 独立搜集的记录,各个客户端可以使用Di 进行模型的联合训练或者进行数据查询。
安全性假设
基于两个在安全领域被广泛采纳的假设,1、所有的服务器都是半诚实的。即所有的服务器都遵循协议,不会与其他服务器合谋,但是对用户的隐私很好奇,会尽可能多地窃取信息。2、所有的通信信道都是安全的,敌手不能够看到/修改通道中的任何东西。

3.2 设计概述

【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining
前后端解耦
使用一个可扩展的接口将前端与后端解耦,这样最主要的好处就是可以适应多种语言和后端技术。我们认为Python是数据挖掘社区前端的自然选择,后端支持多个MPC后端,在后端的选择上允许在不同的安全假设和性能之间进行权衡。前端和后端之间的接口是可扩展的,基本的接口只需要标量数据类型和操作,这使得使用非常简单的引擎成为了可能。然后添加了扩展接口,以便充分利用后端的性能优化,如数组类型和复杂的计算函数(如向量外积)。目前支持三个后端:自己的后端、SPDZ、ABY3。
专注于算法整体的性能优化
性能是支持可伸缩数据挖掘任务的关键。从三个不同的层面上进行性能的优化:1、使用2-out-of-4秘密分享协议对单个操作进行性能优化。2、在可能的情况下进行批处理操作。3、在前端进行语言级别的优化。
基于2-out-of-4秘密分享协议
处理多方协作的数据挖掘任务有两个独特的性能挑战:1)计算可能发生在广域网上,因此它对带宽和延迟都很敏感; 2)数据量大,需要最小化包括预处理在内的整体计算。现有的引擎要么需要多轮通信,因此在广域网中的性能很差,要么需要大量的预计算。结合SecureML和ABY3的思想设计了一个2-out-of-4秘密分享协议。通过增加第四个服务器,可以消除ABY3中的预运算,但在保持相同在线通信复杂性的同时保留其针对定点乘法的单轮在线通信特性。
分级的隐私操作
我们把对私有变量的操作称为private operations(POs)。
【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining
我们确定了一些POs,它们对计算或性能至关重要,我们直接在秘密共享中实现它们。由于空间的限制,我们在4.2节中只引入定点乘法PO。我们实现的另一组POs是支持向量和矩阵运算。在Python中支持数组类型是非常重要的。
2-out-of-4秘密分享的特性是,计算结果仍然是格式完全相同的秘密分享。因此可以将不同的POs连接在一起实现derived POs(衍生POs)。即使是衍生的POs也比Python库执行的更好,因为他是在引擎中预编译的,类似于数据库系统中的built-in routines内置例程。
利用前端提供安全性和性能
PrivPy前端不仅让数据科学家可以很容易地用熟悉的Python编写数据,而且它还提供了广泛的优化来支持数组类型,包括任意大小的数组和操作。此外,它还自动执行代码重写,以帮助程序员避免常见的性能陷阱。
引擎架构
使用四个半诚实的服务器来实现PrivPy引擎中的2-out-of-4秘密分享协议(S1,S2,Sa,Sb),采用客户端服务器模型。客户端将秘密共享的数据发送给服务器,然后服务器基于这些共享执行隐私保护的计算。

【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining
四个服务中每个服务器都包含两个子系统,secret sharing storage(SS store,秘密分享存储子系统)提供对秘密输入和中间结果的临时存储。private opera-tion (PO) subsystem,私有操作子系统为私有操作提供执行环境。服务器从SS store读取shares,执行PO,并将结果的shares写回到SS store。因此我们可以将多个POs组合成一个更大的PO,或者一个复杂的算法。

任务执行
总的来说,PrivPy运行机器学习任务有以下四个步骤:1、Python前端分析并重写程序以实现算法级性能优化。2、每个客户端计算私有变量的秘密份额secret shares,并将resulting shares发送给服务器。3、所有的服务器基于private shares隐私份额并行运行Python代码,没有任何客户端参加,直到到达reveal()。4、服务器调用reveal(),通知客户端查找result shares,并最终恢复明文结果。

; 4 PrivPy 计算引擎

4.1 Replicated 2-out-of-4 secret sharing

秘密分享
秘密分享将一个秘密号码编码成多个份额,并将这些份额分配给一组参与者,只要没有收集到足够的信息,就不会显示原始号码的信息。最简单的秘密分享是将数字x编码成两个数字r和x – r,其中r是一个随机数。因此,只有当他得到两份份额时,才能重建x。

【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining

; 4.2 定点乘法

为了支持高效的定点乘法,我们结合了同样基于秘密共享的SecureML和ABY3的思想。但与SecureML和ABY3相比,我们的不动点乘法不需要预先计算,只需要1轮通信,并且在使用全双工通信时为每个服务器保持相同的在线通信复杂性,如协议1所示。值得注意的是,每对服务器共享一个随机字符串,并使用该字符串作为伪随机函数的种子,因此它们可以在不通信的情况下得到相同的随机数。

【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining

4.3 其它基本POs

【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining

; 4.4 衍生的POs

我们可以组成多个基本POs,形成机器学习算法中常用的更复杂的派生POs。例如计算神经网络中常用的激活函数ReLu函数f (x) = max(0, x),我们可以先提取最显著的用来表示正负的bit,然后使用OT协议得到f (x)。对于除法,我们可以使用Newton-Raphson算法来逼近结果。要实现逻辑函数f (x) = 1/1+e^−x,我们可以使用欧拉方法或者分段函数。我们还使用类似的数值方法实现了其他常见的数学函数,如sqrt、log、exp和max_pooling。有了这些基本POs和派生POs,我们可以像往常一样进一步实现复杂的算法。

4.5 用于性能优化的POs

我们提供了以下三组POs,基本POs已经涵盖了它们的功能,但是单独的版本在某些情况下可以显著提高性能。程序员可以直接使用这些POs。
Batching POs 批量POs
批量处理是MPC框架中常用的一种优化方法[7,14,51],它可以批量处理服务器之间的独立数据传输,从而减少固定的开销。Array POs天然支持批处理。由于许多机器学习算法大量利用阵列操作,这种优化减少了通信次数,可以显著提高性能。
Multiply by public variables
在操作同时涉及公共变量和私有变量的情况下,我们可以通过揭示公共变量来优化性能。乘法从优化中获益最大,因为服务器只需要将它们的shares直接乘以公共变量,而不需要进行必要的通信。
Dot and outer product
矩阵的点积和外积常用于机器学习算法。例如,逻辑回归和神经网络使用点积进行正向传播,表示为Y = W·X + b。外积常用于计算梯度,在使用for循环实现它们时,每个元素都有太多的重复传输,因为在多维的情况下,每个元素都将与其他几个元素相乘。因此我们提供了内置优化的点积和外积操作。具体来说,对于两个私有矩阵[[A]]和[[B]],我们可以计算为[[A]] · [[B]] = A1 · B′1 + A2 · B′2 + Aa · B′a + Ab · B′b。这种优化大大降低了通信成本。例如,给定两个n × n矩阵,对于点积,一个for循环触发n3次乘法,通信复杂度为O(n^3),而优化后的for循环只导致通信复杂度为O(n2)。

5 前端和优化

5.1 PrivPy前端特点

PrivPy程序是一个具有numpy风格的数据类型定义的有效的Python程序。我们使用三个真实的代码段来说明实现数据挖掘算法所必需的PrivPy特性。

【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining
【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining
【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining
基本语义
与许多要求程序员具备密码学只是并使用定制语言的特定领域的前端不同,程序本身即为简单的Python程序,可以在纯文本输入的Python环境中运行,用户只需要添加两项内容便可以实现在PrivPy中的私有保护。
1、声明私有变量。在第一行中使用SS函数声明一个私有变量x作为来自客户机client clientID的输入。
2、返回结果。reveal()函数允许客户端恢复私有变量的明文,不熟悉密码学的程序员,如机器学习程序员可以使用最少的努力实现算法。
所有操作都支持标量和数组类型
PrivPy支持标量以及任意形状的数组,支持数组操作对于编写和优化严重依赖数组的机器学习算法至关重要。在调用SS方法时,PrivPy会自动检测x的类型和形状。如果x是一个数组,程序返回一个相同形状的数组,其中包含x中每个元素的函数。遵循NumPy的语义,提供boradcast,允许在标量和数组之间以及不同形状的数组之间进行操作。现有的MPC前端并不支持这样优雅的程序,如PICCO只支持对形状相同的数组进行操作。
私有数组类型
数组运算在机器学习算法中很常见。PrivPy中的私有数组封装了任何形状的数组。用户只需要将私有数组传递给构造函数,构造函数就会自动检测形状。就像NumPy中的数组类型一样PrivPy中的私有数组也支持广播,PrivPy可以通过广播较小的数组来处理不同形状的数组的算数运算。
我们还实现了NumPy中大多数的ndarry方法,程序员可以使用这些方法方便而高效的操作数组,但与IO相关的方法除外。表1列出了已经实现的ndarry方法。
【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining
支持大数组
将数据映射到秘密份额不可避免地会增加数据的大小,因此以明文形式存入内存的真实数据集可能无法装入私有版本。
自动代码重写
用户编写程序后,前端解析器将其解析为后端支持的基本隐私保护操作,优化器自动重写程序以提高效率(详见第5节)。这种优化可以帮助程序员避免MPC情况下的性能”陷阱”。

; 5.2 实现

基于Python解析器
使用c++编写后端以提高性能,使用Python前端保持Python的见同行。后端作为每个服务器上的库连接到前端,从而减少前端和后端之间的开销。在执行任务期间,在每个服务器和客户机上并行的解析相同的代码。
numPy风格的数据类型定义和操作符重载
定义了自己的数据类型SNum和SArr分别表示secret number和secret array。然后重载私有数据了id运算符,因此像+ — * /这类标准运算符既可以处理私有数据也可以处理公共数据。
自动磁盘支持的大数组
提供了一个LargeArray类,透明的使用磁盘作为大到无法装入内存的数组的后备存储。

5.3 代码分析和优化

与对明文的计算相比,私有操作有非常不同的开销,而且许多熟悉的编程结构可能会导致糟糕的性能,产生”性能陷阱”。因此,我们提供了积极的代码分析和重写,以帮助避免这些缺陷。例如,在普通Python程序中编写两个向量的按元素计算的乘法是很好的。
for i in range ( n ) : z [ i ] = x [ i ] * y [ i ]
但是,与单个数组操作相比,这是一种典型的反模式,会导致性能开销,因为这涉及到n次乘法。为了解决这个问题,我们基于Python的抽象语法树(AST)包构建了一个源代码分析器和优化器。在服务器执行用户代码之前,我们的分析器扫描AST并将反模式重写为更有效的方式。在本文中,我们实现了三个例子:
for循环的向量化
分析器将上面的for循环重写为一个向量形式z ̅ = x ̅ ∗y ̅。重写器还生成代码来初始化向量变量。
公因子的提取
我们将带有模式x∗y1 + x∗y2 +···+ x∗yn的表达式转换为x∗(y1 + y2 +···+ yn)。这样,我们将乘法的数量从n减少到1,节省了大量的时间。
常见的表达向量化
程序员经常显式地编写向量表达式,比如x1∗y1 + x2∗y2 +···+ xn∗yn,特别是对于短向量。优化器提取两个向量x ̅ =(x1, x2, . . . , xn ) 和y ̅= (y1, y2, . . . , yn ),并将表达式重写为向量点乘的形式x ̅·y ̅。此处x1, x2, . . . , xn 不需要相同的形状,Privy支持混合形状的批处理操作。
拒绝不支持的语句
我们允许用户编写我们不能正确运行的合法Python代码,例如带有私有条件的分支(实际上,大多数MPC工具不支持私有条件,或者只支持有限的场景)。为了减少用户在运行时的意外,我们执行AST-level的静态检查,然后在初始化阶段拒绝不支持的语句,并以错误结束。

Original: https://blog.csdn.net/WuwuwuH_/article/details/123602120
Author: WuwuwuwH_
Title: 【论文阅读】PrivPy: General and Scalable Privacy-Preserving Data Mining

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/697960/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球