pv原语模拟实现_PrivPy:实现规模化通用隐私保护机器学习

翻译自《PrivPy:Enabling Scalable and General Privacy-Preserving Machine Learning》,这篇论文于2019年12月5日发表于arXiv。

笔记:

1)论文写得很棒,技术很硬核,读起来有点痛苦

2)用安全多方计算进行多方机器学习,没有考虑差分隐私机制,支持逻辑回归(LR),矩阵分解(MF)和神经网络(NN)

3)前后端解耦,支持三种后端:自研后端,SPDZ,ABY3

4)用python编码,自动进行代码重写、检查、优化,开发者不必懂密码学知识

5)除客户端外需要4台不共谋服务器(这样严格说不能称为联邦学习了吧?),客户端需要把处理过的数据发送给服务器,这个要求实际应用中可能比较难

6)好像未考虑各方持有相同样本、不同特征的场景,不过应该基于现在的架构支持起来也比较容易,只缺一个拼表功能?

7)支持大型数据集,但因为涉及磁盘存储,运算效率较低,在1M行5K列的数据集上执行一次LR迭代大概需要7小时


摘要

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

1 介绍

隐私是大数据时代的重要问题。数据挖掘的成功通常建立在数据之上,通常希望集成来自多个来源的数据以更好地挖掘结果。但是,无限制地交换敏感数据可能威胁用户的隐私,并且经常受到法律或商业实践的禁止。如何在允许集成多个数据源的同时保护隐私,需要得到解决。

安全多方计算(MPC)允许多个参与者共同计算一个函数,而除了最终结果以外,不需要透漏隐私信息。MPC经常使用各种加密原语,例如garbled circuit和秘密分享,有不同的效率和安全假设。经过30多年的发展,我们开始看到现实世界中的数据挖掘应用程序开始使用MPC。 但是,仍然存在许多挑战,阻碍了安全计算技术的广泛应用。

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

在本文中,我们提出了PrivPy,一种用于保护隐私的协作数据挖掘的有效框架,旨在为数据挖掘编程提供一个优雅的端到端解决方案。PrivPy前端提供的Python接口类似于NumPy(最受欢迎的Python软件包之一)中的接口,并且提供了多种机器学习中的常用函数。我们还提供了一个基于秘密共享并提供高效计算的计算引擎。我们想强调的是,PrivPy的主要目标不是在密码协议上取得理论突破,而是建立一个实用系统,该系统可以在安全计算框架上进行优雅的机器学习编程,并在效率和安全之间做出正确的权衡。特别是,我们做出以下贡献:

  1. 具有高级数据类型的Python编程接口。我们提供了一种非常干净的Python语言,集成了保护隐私的一般运算和高级基元,包括broadcasting(用于操纵不同形状的矩阵),以及ndarray方法(两个广泛用于实现机器学习算法的Numpy功能),通过这些,开发人员可以轻松地将复杂的机器学习算法移植到PrivPy上。
  2. 自动代码检查和优化。 我们的前端将通过检查代码并自动对其进行优化,来帮助程序员避免“性能陷阱”。
  3. 将编程前端与计算后端解耦。我们引入了一个通用的隐私运算层,以允许同一接口支持多个计算后端,从而可以在不同的性能和安全性假设之间进行权衡。我们当前的实现支持SPDZ后端,ABY3后端以及我们自己的计算引擎。
  4. 大型机器学习任务上的验证。我们证明了我们的系统在真实数据集和应用场景上用于数据挖掘应用(例如数据查询,逻辑回归和卷积神经网络)的实用性。我们还表明了,通过透明地操纵5000*100万维的矩阵,我们的系统可以扩展到大型任务。

2 相关工作

在本文中,我们主要关注用于通用算法(尤其是数据挖掘任务)的隐私保护计算系统。一个实用的此类系统包括两部分:高效的计算引擎和易于使用的编程前端。

基于(完全)同态加密(homomorphic encryption)的框架由于大量的计算开销而不切实际。基于加密布尔电路(garbled circuit)的方法对于通用的算术计算,特别是对于各种类型的机器学习算法而言,是不切实际的,因为它们的带宽成本很高。还有许多采用秘密共享的MPC框架支持通用算术。例如,文献3使用三个半诚实的服务器用1轮执行整数/bit乘法并获得最佳通信成本。SPDZ使用附加秘密共享,可以容忍最多n−1个被破坏方。虽然原生支持有效的整数运算,但它们大多数通过将每个共享的整数解析为m个字段元素(m是每个字段元素的位长)并使用bit级别的运算模拟固定/浮点运算来支持实数,因此要求各方发送O(m)的消息。SecureML基于两方秘密共享,并提供具有O(1)消息复杂度的内置固定点乘法,但是需要昂贵的预计算才能生成Beaver乘法三元组。ObliviousNN优化了点积的性能,但存在和SecureML类似的问题。ABY3扩展了文献3的工作并提供了三方计算,是通用算法的state-of-the-art。为了执行固定点乘法,ABY3提供了两种替代方案:一种要求轻量级的预计算,并且在在线阶段中,每一方都需要在1轮中发送不超过2条消息,而另一种不需要预计算,并且每一方都发送不超过2条消息,但需要2轮。相比之下,我们的计算引擎同样提供了对固定点的内置支持,可以在不进行预计算的情况下在1轮内执行定点乘法,并且每一方仅发送2条消息。

我们强调,采用隐私保护计算超出了计算效率,并且可编程性同样重要。TASTY和ABY为程序员提供了在不同方案之间进行转换的接口。但是,它们仅公开了低级接口,程序员需要自行决定选择哪种加密工具以及何时进行转换,因此使学习曲线陡峭。L1是MPC的中间语言,支持基本运算。但L1是特定领域的语言,它不提供高级原语来简化机器学习算法中经常使用的数组/矩阵操作。文献14和文献8有类似的问题。PICCO支持附加秘密共享,并提供定制的类C接口。但是界面不够直观,仅支持简单的数组运算。而且,根据他们的报告,性能对于大规模计算任务而言不够实用。KSS和ObliVM也有这些问题。文献12为SPDZ提供了编译器,文献2对其进行了扩展以支持更多的MPC协议。但是它们仍然是特定领域的,不能为机器学习任务提供足够的高级原语。另一方面,PrivPy保持与Python的兼容性,并提供具有自动代码检查和优化功能的高级基元(例如broadcasting),不需要应用程序员侧进行学习,从而可以在保护隐私的情况下方便地实现机器学习算法。

3 PrivPy设计综述

3.1 问题定义

应用场景。我们确定了隐私保护数据挖掘的以下两个主要应用场景:

  • 多源数据挖掘。通常,多个组织(例如医院)各自独立地收集数据集的一部分(例如患者信息),而希望在不泄露任何信息的情况下共同训练模型(例如疾病推断)。
  • 基于保密模型和数据的推理。有时,模型的参数很有价值。例如,信用评分参数通常是保密的。模型所有者和数据所有者都不希望在计算中泄漏其数据。

问题定义。我们把两个场景都定义为一个MPC问题:有n个客户Ci(i=1,2,…n),每个Ci有一些隐私数据Di,目标是使用全部的Di来计算某个函数o=f(D1,D2,…,Dn),同时在计算过程中,除了输出o外,没有其他隐私信息被泄露。Di可能是Ci独立收集的记录,全部Ci可以使用它们来共同训练模型或执行数据查询。

安全假设。我们的设计基于安全性社区中被广泛采用的两个假设:1)所有服务器都是半诚实的,这意味着所有服务器都遵循协议并且不会与其他服务器共谋,但是他们对用户的隐私好奇,并会尽可能地窃取信息;2)所有的通信渠道都是安全的,对手无法查看/修改这些渠道中的任何内容。实际上,由于独立和竞争性的云服务提供商越来越多,找到少量此类服务器是可行的。 我们把检测恶意对手的扩展功能留作未来的工作。

3.2 设计综述

3f6f20a862257cee212e37af1082809e.png
图1:PrivPy架构概览

图1展示了PrivPy设计的概览,它有两个主要部分:语言前端和计算引擎后端。 前端提供编程接口和代码优化。后端执行基于秘密共享的隐私保护计算。我们将在本节中讨论我们的关键设计理念。

将前端与后端解耦。我们使用可扩展的接口对前端和后端进行解耦。主要收益是我们可以适应多种语言和后端技术。我们认为Python是数据挖掘社区前端的自然选择,并且支持多个MPC后端,以允许在不同的安全性假设和性能之间进行权衡。我们在前端和后端之间的接口是可扩展的。 基本接口仅要求scaler数据类型和运算,因此可以使用非常简单的引擎。然后,我们添加扩展接口,以通过性能优化来充分利用后端,例如矩阵类型和复杂的计算函数(例如向量外积)。它类似于可扩展的指令集架构(instruction set architecture )设计。实际上,我们目前支持三种后端:我们自己的后端,SPDZ,ABY3。

专注于算法整体的性能优化。性能是规模化数据挖掘任务的关键。我们在三个不同的级别上优化性能:1)使用2-out-of-4秘密共享协议优化单个运算的性能;2)尽可能进行批运算;3)在语言前端中执行语言级别的优化。

基于2-out-of-4秘密共享协议。处理多方协作数据挖掘任务面临两个独特的性能挑战:1)计算可能发生在广域网(WAN)中,因此对带宽和延迟都非常敏感;2)数据量很大,因此我们需要最小化包括预处理在内的整体计算。现有引擎要么要求多轮通信,从而在WAN中表现不佳,要么要求大量预计算。

我们结合SecureML和ABY3中的思想设计了2-out-of-4秘密共享协议。通过添加第四台服务器,我们可以消除ABY3中的预计算,但保留其固定点乘法仅需单轮在线通信的功能,同时保留相同的在线通信复杂性。同样,我们协议的正确性证明直接遵循文献33和文献35,使建立正确性变得简单。

分级隐私运算(POs)。 我们将基于隐私变量的运算成为隐私运算(PO)。表1概述了PrivPy中实现的不同PO。

0d6faf545676b53d83e4c9c7fa9fe138.png
图1:PrivPy前端支持的运算

我们确定了许多计算必需或对性能至关重要的PO,我们直接在秘密共享中实现它们。我们称它们为基本PO。受空间限制,我们仅在第4.2节中介绍固定点数值乘法PO。我们实现的另一套PO用于支持向量和矩阵运算。在Python中支持数组类型至关重要。

2-out-of-4秘密共享的一个好特性是,计算结果仍然是一些具有完全相同格式的秘密份额。因此,我们可以将不同的PO连接在一起,并实现衍生PO。请注意,即使是衍生的PO也比Python库要好,因为它在引擎中进行了预编译——很像数据库系统中的内置程序一样。

利用前端提供灵活性和性能。 PrivPy前端不仅使数据科学家可以轻松地使用熟悉的Python进行编码,还提供了可扩展的优化来支持数组类型,包括任意大小的数组和运算。而且,它会自动执行代码重写,以帮助开发者避免常见的性能陷阱。

引擎架构。我们使用4个半诚实服务器在PrivPy引擎中实现上述2-out-of-4秘密共享协议:S1,S2,Sa和Sb。就像许多现有的MPC系统一样,我们采用客户端/服务器模型。客户端将秘密共享的数据发送到服务器,然后服务器基于这些共享执行隐私保护计算(请参见图2)。

42b4f2a2b8c38f11fc57680ae4a05dd1.png
图2:PrivPy计算引擎概览

四个服务器各有两个子系统。秘密共享存储(SS存储)子系统提供(临时)隐私输入和中间结果份额的存储。隐私运算(PO)子系统为隐私运算提供执行环境。服务器从SS存储读取份额,执行PO,然后将结果份额写回到SS存储。这样,我们可以组合多个PO以形成更大的PO或复杂的算法。

任务执行。总的来说,PrivPy通过以下四个步骤运行机器学习任务:1)Python前端分析并重写代码以进行算法层级的性能优化。2)每个客户端为它的隐私变量计算秘密份额,并将结果发送给服务器。3)所有服务器并行地基于隐私份额执行Python代码,而无需任何客户端参与,直到达到代码中的reveal()。4)服务器调用reveal(),通知客户端找到结果份额,最终恢复明文结果。

4 PrivPy计算引擎

本章以乘法为例介绍我们的秘密共享协议设计,并描述我们支持的隐私运算(PO)。 线程模型(安全假设)在第3.1节中定义好了。

4.1 重复2-out-of-4秘密共享

秘密共享。秘密共享将秘密数字编码为多个份额,并将份额分发给一组参与者,这样只要没有收集到足够的信息就不会泄露有关原始数字的信息。最简单的秘密共享是将数字x编码为两个数字r和x-r,其中r是一个随机数。因此,只有当获得两个份额时,才能复现x。

重复2-out-of-4秘密共享。我们结合了SecureML和ABY3的思想,并设计了一个更高效的固定点乘法协议。

我们定义了一个2-out-of-4秘密共享,来实现高效运算。我们认为所有份额都在Z2^n中。具体来说,要分享一个整数x对2^n的余数,我们把它编码为一个份额元组:[x]=(x1, x1‘, x2, x2‘, xa, xa‘, xb‘, xb‘)。S1持有(x1, x1‘),x1和x1‘为两个独立随机整数;S2持有(x2, x2‘),其中x2=x-x1且x2‘=x-x1‘;Sa持有(xa, xa‘),其中xa=x2且xa‘=x1‘;Sb持有(xb, xb‘),其中xb=x1且xb‘=x2‘。很容易看出,每个服务器拥有的两个数字独立均匀地分布在Z2n中,因此非共谋服务器对x毫无了解。注意,秘密共享的所有线性算术运算(例如加、减、乘)都在Z2^n上。除法运算x/2^d表示shifting the bits of x right in the two’s- complement representation。

分享初始化。要分享一个数字x,用户把它编码为x1和x2,其中x1是在Z2^n中随机采样得到的,而x2=x-x1。然后它把x1和x2分别发送给S1和S2。得到份额后,S1把x1发送给Sb,S2把x2发送给Sa。这样四台服务器分别持有x1、x2、xa、xb。同时,S1和S2用同一个种子生成一个随机数r,并分别计算x1‘=x1-r,x2’=x2+r。最后,S1把x1‘发送给Sa,S2把x2’发送给Sb,服务器就得到了数字x的2-out-of-4份额。在这种情况下,每台服务器只看到两个独立随机整数,一致分布在Z2^n,没有关于x的信息被泄露给任何一个服务器。

自由相加。容易看到,2-out-of-4分享是同态可加的,也就是,[x]+[y]=[x+y],结果份额同样满足上面的约束。这样每一个服务器能在本地计算和的份额。类似地,对于Z2上分享的位,XOR运算同样是自由的。

支持小数。我们把小数x映射到Z2^n,成为一个固定点数字:我们将它缩放2^d倍,并把四舍五入的整数x*2^d用二进制补码表示为n位整数。这种映射方式很常用,其精度为2^-d,很明显,忽略精度损失的话,x*2^d同样是同态可加的。

4.2 固定点乘法

4.3 位提取

4.4 OT(遗忘传输)协议

4.5 其他基础PO

4.6 衍生PO

4.7 性能优化PO

5 前端和优化

5.1 PrivPy 前端特征

5.2 实现

5.3 代码分析与优化

6 评测

测试台。 我们在四个Amazon EC2虚拟机上运行了实验。所有计算机均为c5.2xlarge型,具有8个Intel Xeon Platinum 8000系列CPU内核和64GB RAM。每台计算机都有一个以full-duplex模式运行的1 GB以太网适配器。在我们的实验中,考虑了两种网络设置:LAN设置,其中每个虚拟机具有10Gbps的传入和传出带宽;以及WAN设置,其中每个虚拟机的带宽为50Mbps,RTT延迟为100ms。

参数设置。所有运算份额都在Z2^128,我们将d设置为40,这表示比例因子为2^40。我们将每个实验重复10次并报告平均值。

PriPy执行。我们使用Python实现了PrivPy的前端,并用C++实现了我们的计算引擎。并且我们使用内置的int128类型gcc来实现128位整数。我们使用g++ -O3编译了C++代码,并使用Boost.Python库将其包装为Python代码。我们将SSL与1024位密钥一起使用于保护所有的通信。

6.1 微基准测试

我们首先在LAN设置中执行微基准测试,以展示基本运算的性能以及优化的收益。

基本运算。PrivPy引擎支持高效的基本运算,包括加法,固定点乘法和比较。加法可以本地完成,而乘法和比较则涉及通信。因此,我们证明了后两者的性能,如表2所示。

b95e597ff702d918a6b5d39f6a41e7a8.png
表2:LAN设置中Z2^128的基本运算量(运算数/秒)。

客户端-服务器交互。我们评估秘密共享过程ss的性能,即客户端将原始数据拆分为秘密份额并将其发送给服务器,以及反向过程reveal的性能,即客户端从服务器接收份额并把它们恢复到明文。我们假设每个客户拥有若干维向量,用不同客户端数量和维数来评估时间(包括计算和通信)。图6显示,即使具有1000个客户端和1000维向量,服务器仅花费不到0.3秒的时间即可从所有客户端收集数据/披露给所有客户端数据。

2243afc962fb3eb5585a35588d21491e.png
图6:ss和reveal的性能

批运算的影响。我们使用两种常见操作来评估批处理的效率:逐元素乘法和向量的点积。对于乘法,我们把各独立运算的通信分批,而对于两个m维向量的点积,我们只需要传输点积的份额,这样通信成本就从O(m)降低到了O(1)。我们改变了元素的数量并测试了时间消耗,图7显示了结果(y轴是时间的对数)。两种情况都显示了超过1000倍的收益。

9b91c3c9d1a421f3dda9a05881c4d91d.png
图7:批方式运算的优化

代码优化的效果。我们评估了公共因子提取和表达向量化。由于这些手写的反模式通常很小,因此我们将表达式的大小范围设置为从2到10。图8显示,在两种情况下,五项表达式的性能均提高了4倍以上。

7b77b0303701cebb97cf4174e4c92a0d.png
图8:代码优化器性能

基于磁盘的大型矩阵性能。PrivPy前端提供了一个LargeArray类,可以自动处理太大而无法容纳在内存中的数组。由于LaregeClass使用磁盘作为后台存储,因此我们应考虑磁盘IO时间对整体性能的影响。为了评估LargeArray的性能,我们使用了Movielens数据集,该数据集包含来自成千上万用户的100万部电影评级。我们将数据集编码为一个1,000,000×5048维的矩阵,它需要占用每台计算机150GB的存储空间。

然后,我们执行数据集中的一批元素与一个5048维向量的点积。我们通过更改批大小并在数据集中随机选择一批元素来评估性能。如表3所示,磁盘IO成为主要成本。原因是程序应顺序扫描存储在磁盘中的大型矩阵以检索随机选择的批。

e3b596bfcb7fb7a1f87e220e5e36213c.png
表3:大型矩阵点积的时间(毫秒)

然后,我们将LargeArray应用于真实算法的训练:用SGD训练的逻辑回归(LR),以及矩阵分解(MF),矩阵分解算法将大矩阵分解为两个较小的潜在矩阵以进行有效的预测(在在本文中,我们将每个m×n矩阵分解为一个m×5矩阵和一个5×n矩阵)。表4展示了结果。

b255c4e786710c5013b494f0f3c1259e.png
表4:大型矩阵真实算法的时间(秒)

6.2 真实算法的性能

PrivPy的重点是在真正的大数据集上的算法性能。我们使用ABY3和我们的后端给出了我们在通用算法中的经验,包括逻辑回归(LR),矩阵分解(MF)和神经网络(NN)。ABY3引擎具有多个配置选项,我们在所有评估中都使用了ABY3的性能最优的选项(无预计算的半诚实假设)。

我们在LAN设置和WAN设置中都进行了评估,并使用MNIST数据集,其中包括70,000个带标记的手写数字,每个数字28×28像素。我们评估训练和推理的表现。并且由于我们的前端支持两个引擎,因此我们在两个引擎上运行用Python编写的相同算法代码。

表5给出了1次训练所消耗的平均时间。逻辑回归和矩阵分解的构造如前面所述,并且神经网络(NN)具有一个784维输入层,两个128维隐藏层和一个10维输出层。

31cbeb3ccf2f1f472491b33592c3db52.png
表5:使用不同引擎训练实际算法的时间(秒)

对于模型推断,我们另外还对LeNet-5模型进行了评估,以证明卷积神经网络(CNN)。 LeNet-5具有784维输入层,3个具有5×5卷积核的卷积层,2个sum-pooling层,3个sigmoid层,1个点积层,1个Radial Basis Function层,以及一个10维向量上的argmin函数,用于得到输出。然后基于LeNet-5模型,我们为每一个sigmoid层添加了一个批标准化层,以得到一个CNN+BN模型。评估结果如表6所示。

a46ddc3ade2fabd2efc7d2d9c03c441d.png
表6:不同引擎真实算法推理的时间(秒)

从评估结果可以看出,我们的计算引擎在训练和推理方面的性能均优于ABY3,尤其是在WAN设置中。 这是因为,尽管ABY3和我们的计算引擎都不需要预计算,并且每台服务器具有相同的通信成本,但对于固定点乘法,ABY3比我们的计算引擎需要多一轮运算,从而导致性能降低。

最后,我们强调我们的前端的可用性。表7显示了每种算法的代码行数以及专注于数据挖掘但不熟悉密码技术的学生使用我们的前端编写每种算法的时间。

d6155a0973adfdc3f3203e808614665f.png
表7:用于实现真实算法的代码行和时间(小时)

7 结论与未来工作

30多年的MPC文献提供了一系列在性能,安全性或易编程性的某一方面很突出的协议和系统。我们相信现在是时候将这些技术集成到应用驱动的一致系统中用于机器学习任务了。PrivPy是一个自上而下设计的框架。在上层,它提供熟悉的Python兼容接口以及基本数据类型(例如实数和数组),并使用代码优化器/检查器来避免常见错误。在中间层,通过使用中介进行存储和通信,我们构建了可组合的PO系统,该系统有助于使前端与后端解耦。在底层,我们设计了可以提高计算速度的新协议。PrivPy展示了巨大的潜力:它以最少的程序移植工作来快速处理大型数据集(1M×5K)和复杂算法(CNN)。

PrivPy开辟了许多未来的方向。首先,我们正在改进PrivPy计算引擎,以在保持高效率的同时提供主动安全性。第二,我们想将现有的机器学习库移植到我们的前端。第三,我们将支持更多的计算引擎。第四,尽管我们在这项工作中专注于MPC,但是我们将引入随机化以保护最终结果。最后,我们还将改进服务器的容错机制。

.1 乘法PO的安全性证明

.2 在PrivPy中实现的Numpy功能

参考文献

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值