論文筆記(一)SecureML: A System for Scalable Privacy-Preserving Machine Learning

SecureML:A system for Scalable Privacy-Preserving Machine Learning

1 摘要及介紹

1.1 模型的大體架構

首先,主要模型中主要有客戶端和兩臺服務器,假設這兩臺服務器不會惡意合做。   整個訓練過程大體分爲在線和離線兩個階段,在線階段的主要任務就是利用本文提出的安全算數技術在共享的十進制數上進行模型的更新,根據混淆電路的思想,除了最後能獲得的模型,什麼數據也不會暴露出來;離線階段的主要任務是服務於在線階段的乘法運算——利用線性同態加密或者不經意傳輸生成必要的三元組,由於這個開銷比較大,後期還提出了一種改進,用客戶端來輔助生成三元組;算法

1.2 主要貢獻

  • 爲線性迴歸、邏輯迴歸、神經網絡這三種機器學習算法開發出了新型的隱私保護的深度學習協議
  • 開發出了支持在共享的十進制數上的安全算數操做的技術
  • 對於那些非線性激活函數,如sigmoid softmax,提出了一種支持安全多方計算的替代方案
  • 以上提出的全部技術相較於目前的技術,在保證安全的前提下,速度上都有很大的提高

1.2.1 爲三種機器學習算法開發出的隱私保護的協議

線性迴歸、邏輯迴歸和神經網絡這三種機器學習方案很是簡單但也很是經常使用,並且他們之間思想相似且一種遞進的趨勢。 所謂思想相似指的是他們都是有監督的機器學習算法,思路都是先前饋,算出交叉熵以後,在利用隨機梯度降低,再後饋更新模型。 所謂遞進指的是,線性迴歸只涉及到了簡單的加乘操做,本質上講不考慮效率的狀況下,只要可以實現隱私保護的線性操做便可實現線性迴歸,最簡單的混淆電路便可實現,但本文考慮了效率,因此提出了一種更快的在共享的十進制數上的安全算法操做技術。而邏輯迴歸相較於線性迴歸,只是多了激活函數,因此做者提出了一種替代的解決方案。而神經網絡在算法設計上雖然與邏輯迴歸不一樣,可是其「組件」上依然是線性操做+激活函數。編程

1.2.2. 更快的安全兩方乘法——在共享的十進制數上的算數操做

前人主要的性能瓶頸是在安全兩方計算,好比姚氏混淆電路中,計算定點乘法操做開銷很是大。安全

本文提出的方案:將這兩個共享的十進制數表示成有限域上的整數,使用離線生成的三元組在共享的整數上執行乘法操做,每一方都截斷它所擁有的積的那部分,於是固定數量的比特便可表示小數部分。通過驗證,即便是用截斷以後的share恢復出來的乘積,相較於定點乘法差距不大,偏差幾乎能夠忽略不計。服務器

1.2.3支持安全多方計算的激活函數

邏輯迴歸和神經網絡必須使用sigmoid和softmax,但如今使用的用多項式去模擬激活函數的方式是低效。網絡

本文提出了一種新的激活函數,相似於兩個RELU函數之和並用小型混淆電路求和,來替代sigmoid,並用到了在算數分享和姚氏分享之間的切換。與之相似,爲了替代softmax,提出了一種結合了RELU、加法和除法結合的激活函數。架構

1.2.4 其餘提升效率的方法——向量化與客戶端輔助生成三元組

​ 爲了提升系統的總體效率,還提出了提升總體性能的方法,如向量化,提取數量數據的時候按batch來提取。離線階段,提出一種更快的、每一個客戶幫助產生三元組的離線階段。可是比起標準設定,安全性保證不夠好,由於它須要客戶端和服務器不會同流合污。機器學習

2 基礎知識

2.1 機器學習

由於本文的重點在於隱私保護,因此涉及到的機器學習三個算法都是很是基礎的,是機器學習中的"hello world"級的線性迴歸、邏輯迴歸和神經網絡這三個算法。並且總體思路也幾乎相同——先前饋,求出交叉熵,而後使用隨機梯度降低再後饋來更新模型。如下是對於他們的簡單回顧:編程語言

2.1.1 線性迴歸

線性迴歸是根據現有點,擬合出一個n元一次函數,所謂的模型就是係數向量w,把數據向量化表示以後,更新模型最核心的公式是: $$ w:=w-{1\over |B|}\alpha X^T_B×(X_B×w-Y_B) $$ 其中,w爲係數矩陣,也就是所謂的「模型」,每次訓練時選出的那組數據叫作一個batch,|B|就是batch中數據的個數,(XB,YB)就是一個batch中全部的數據組成的向量組,物理意義其實就是函數圖像上的不少點。函數

2.1.2 邏輯迴歸

邏輯迴歸在二分類問題上很經常使用,它通常獲得的是一個介於0~1之間的數。邏輯迴歸和線性迴歸很相似,可是多了一個激活函數,就是這個激活函數使整個算法從線性飛躍到了非線性,把數據向量化以後,更新模型的公式和線性迴歸也很像,就是多了激活函數f: $$ w:=w-{1\over {|B|}}\alpha X^T_B×(f(X_B×w)-Y_B) $$ 各個符號的意義和線性迴歸的幾乎同樣,激活函數f通常要麼是logistic(這篇文章裏叫logistic,但我看通常的機器學習資料裏管他叫sigmoid): $$ y={1\over {1+e^{-x}}} $$ 或者是softmax: $$ y = {e^{-x_i} \over \sum e^{-x_i}} $$ 這都是很常見的激活函數了。性能

2.1.3 神經網絡

這裏提出的神經網絡也是最多見的BP神經網絡,整個過程和線性迴歸和邏輯迴歸大同小異。從本質上來講,線性迴歸只涉及到了線性的加乘操做,邏輯迴歸多了激活函數,神經網絡相較於前兩種算法在這個方面並無什麼本質上的突破,因此只要解決了線性和激活函數的隱私計算問題,這三種機器學習算法的運算問題都獲得瞭解決。

做爲深度學習的「hello world」任務,MNIST是全部新手的第一關,任務也很是簡單,就是分類任務,不過是多分類。思路也相似,所謂的「模型」就是每一層神經網絡之間的係數矩陣,先前饋,求出交叉熵,而後隨機梯度降低,再後饋調整係數矩陣,最終達到一個比較理想的結果: $$ W_i := W_i - {\alpha\over|B|}×f(X_{i-1}×W_i)×Y_i $$

2.2 安全計算

2.2.1 不經意傳輸

​ 不經意傳輸是安全多方計算經常使用的技術:有一個發送者S,他有兩個輸入x0和x1,又有一個接收者R,它有一個選擇比特b,獲得xb(b∈{0,1}),可是S不知道b到底是什麼,而R也不可能知道除xb以外的另外一個輸入是什麼。符號描述起來是:(null, xb) <- OT(x0,x1;xb),僞代碼描述起來是這樣:

Parameter: Sender S and Receiver R

Main: On input (SELECT, sid, d) from R and (SEND, sid, x0, x1) from S, return (RECV, sid, xb) to R.

(:P8不經意傳輸的算法描述

咱們在兩個地方使用使用不經意傳輸:一、離線階段產生三元組 二、計算激活函數

傳統的不經意傳輸效率較低,這裏使用了一種擴展的不經意傳輸correlated OT擴展,記做COT,可以容許接收和發送者執行m個OTs以n(n,一個安全參數)基、帶有公鑰操做的OTs和O(m)快速對稱密鑰操做的代價。在這裏,兩個輸入是不獨立的,s0是一個隨機數,而s1=f(s0),f是用戶選定的一個係數矩陣。一個l-bit消息的COT,記做COTL,是n+l比特,計算由三個哈希組成。

2.2.2 混淆電路兩方安全計算

混淆電路的目的是爲了根據兩方的輸入x,y計算出f(x,y)的結果,可是參與運算的彼此不可能知道對方的輸入,一套混淆方案大體由一下幾部分組成:

參數1 參數2 輸出1 輸出2
混淆算法 隨機種子$ 函數f 混淆電路F 解碼錶dec
解碼錶dec 隨機種子$ x 混淆輸入x^
評價(evaluation)算法 混淆輸入x^ 混淆電路FZ[i] = UBi* V[i] 混淆輸出z^
解碼算法 混淆輸出z^ 解碼錶dec f(x)

給定上述方案,則能夠設計出一套安全兩方計算協議,在通常的相似協議中,alice叫作generator,bob叫作evaluator。generator負責本身設計密鑰,把整個真值表加密、混淆,而後和evluator利用不經意傳輸協議,evaluator作出選擇以後,將選中的label和他的密鑰還給evalator,兩方再分別解密。一個例子以下:

  1. alice運行混淆算法:根據隨機種子和函數f,生成混淆電路GC和解碼錶dec

  2. alice將x放入解碼錶dec編碼以後獲得混淆輸入x^

  3. alice將混淆電路GC和混淆輸入x^發送給bob

  4. bob經過不經意傳輸,獲得了本身的混淆輸入y^

  5. bob接着在GC上執行評價算法——經過x^ y^和混淆電路GC獲得混淆輸出z^

  6. 雙方經過解碼算法獲得最終結果f(x)

    以上算法被記做:(za,zb) <- GarbledCircut(x;y,f)

2.2.3 祕密分享和三元組

​ 在咱們的協議中,全部的中間結果都被兩個服務器所祕密分享的。這裏實現了三種不一樣的分享方案:加法、布爾和乘法分享。

1、加法分享

  所謂將a加法分享,就是將a拆成兩個數字,這兩個數字之和是a,這兩個數字由兩方分別保存。記做(ShrA(.))。爲了加法分享一個l-bit的值a,記做<.>,以alice和bob爲例:

  1. alice隨機產生一個2^l範圍內的整數a0 (a0記做<a>A0 )

  2. alice計算出a1 = a - a0 mod 2^l

  3. alice將a1發送給bob (a1記做<a>A1)

    爲了恢復RecA(.,.)已經被加法分享的值a,Pi將<a>i發送給P1-i,雙方分別計算<a>0+<a>1

2、乘法分享

​ 所謂將c乘法分享,就是將c拆成兩個數字,而這兩個數字之積是c,這兩個數字由兩方分別保存。記做(MulA(.,.))。如今c已經被分享成了<a>和<b>,咱們假設雙方已經共享了<u> <v> <z>,其中:

  • u和v都是2^l整數域內的隨機值

  • z = u*v mod 2^l

    乘法分享流程以下:

  1. Pi本地計算<e>i = <a>i - <u>i
  2. Pi本地計算<f>i = <b>i - <v>i
  3. Pi運行Rec(<e>0, <e>1)
  4. Pi運行Rec(<f>0, <f>1)
  5. Pi計算

$$ c_i = -i * e * f + f * <a>_i + e * <b>_i + <z>_i $$

3、布爾分享

布爾分享能夠被視做在{0,1}整數域內的加法分享,其中異或被加法替代,邏輯與被乘法替代。   關於布爾分享和姚氏分享:此協議中不顯式使用姚氏分享,由於它會被隱藏在混淆方案中,可是Y2B轉換會被使用來將混淆輸出變成布爾分享   能夠把混淆電路協議視做操做姚氏分享的輸入來產生姚氏分享的輸出。特別地,在全部混淆方案中,generator爲每一個wire w產生兩個隨機字符串kw0,kw1。當使用點&排序技術時,generator也產生隨機排序比特rw,使Kw0 = kw0||rw,Kw1 = kw1 || (1-rw)。被排成串的比特流一會被用來排序每一個被混淆真值表的行   好比,數字a的姚氏分享是<a>Y0 = Kw0, Kw1 & <a>Y1 = Kwa。爲了恢復被分享的值,參與者交換他們的shares,異或或者邏輯與會被執行來評價相關的邏輯門。   從姚氏分享切換到布爾分享的操做記做Y2B(.,.),其中,姚氏分享<a>Y0 = Kw0, Kw1 & <a>Y1 = Kwa,布爾分享則變成了P0擁有<a>B0=Kw0[0],P1擁有<a>B1= <a>Y1[0]=Kwa[0]換句話說,混淆方案中用來排序的比特能夠被無縫切換到布爾分享。

3 隱私保護的機器學習

3.1 隱私保護的線性迴歸

​ 基於算數祕密分享三元組的隱私保護的線性迴歸

訓練數據被祕密分享於兩個服務器S0 S1上,咱們將其分別記爲(<X>0, <Y>0) (<X>1, <Y>1)。s0可使用它的公鑰來加密第一個share,而後將加密後的結果和明文share上傳S1上,S1把被加密的share傳給S0來解密。

數據被祕密分享,模型也被祕密分享——係數矩陣w也被祕密分享於兩個服務器上,初始階段都是隨機值,在兩個服務器之間沒有任何通訊。每一輪GSD以後,它被更新但仍然保持祕密分享,直到訓練的最後纔會恢復。

在線階段,咱們進行線性迴歸的更新,公式是: $$ w_j := w_j - \alpha(\sum^d_{k=1}x_{ik}w_k-y_i)x_{ij} $$ 由於沒有向量化,因此這是一個個的數字,根據以前所述,這些數字都是被祕密分享在兩個服務器上的,又由於只有加法和乘法,所以咱們使用相應的、被分享值的加法和乘法算法給來更新系數: $$ <w_j> := <w_j> - \alpha Mul^A(\sum^d_{k=1}Mul ^A(<x_{ik}>,<w_k>)-<y_i>,<x_{ij}>) $$ 也就是說每一個服務器用這個公式來分別更新本身本地的相應的值。

3.1.1 向量化

上面那個只是針對一個訓練數據,舉個例子,好比d=3,有這樣一個訓練數據([x1 x2 x3], y[1]),更新時就是i=1,j從1到3.

咱們想要同時訓練一個batch的數據,這樣能夠提升效率,因此可使用向量化技術。因此咱們將共享值上的線性操做推廣到了共享矩陣上的線性操做。其實很是相似,就是把全部的值都換成了矩陣便可,矩陣中的每一個元素視做共享值便可。若是mini-batch有B條數據,那麼在線階段的更新公式就是變成了: $$ <\bold w> := <\bold w> - {1\over|\bold B| } \alpha Mul^A(<\bold X^T_B>,Mul^A(<\bold X_B>,<\bold w>)-<\bold Y_B>) $$ 一個樣本在不一樣的輪次上會被使用不少次,它知足用一樣的隨機三元組來掩蓋它。所以離線階段,一個共享的n*d隨機矩陣<U>被用來生成掩蓋數據樣本<X>。

在線階段的起始階段,<E>i = <X>i - <Y>i被計算並被交換來重構E。此後,EB被選擇並且被使用在乘法協議中,不帶有任何更多的計算和交流。特別的,在離線階段,一系列下標B1,B2...Bt在兩個服務器間獲得公認。僅僅須要n,d,t的知識或者一個上標而不須要真實數據。而後三元組<U>,<V>,<Z>,<V'>,<Z'>被提早計算:

維度 做用 備註
U n×d mask data X
V d×t 每一列用來mask w forward propagation
Z |B|×t 中間結果 Z[i] = UBi* V[i]
V' |B|×t 每一列用來mask Y* - Y backward propagation
Z' d×t 中間結果 Z'[i] = UTBi* V'[i]

將數據用矩陣形式表示,將大大下降交流和通訊的效率.

3.1.2 被分享的十進制數上的算數操做

正如以前討論的,前人工做的不高效主要來源於在共享/加密的十進制數上的計算,以前的解決方案主要有兩種: 一、把共享的十進制數當作整數,作乘法後在很大的有限域上徹底保留下全部的精度。缺點是隻能支持必定數量的乘法,由於結果的範圍會隨着乘法的數量指數級增加。 2、在十進制數上利用安全兩方計算的布爾電路來作定點或者浮點乘法。這帶來了大量的負載,由於計算兩個l-比特長的數的乘法就須要O(l^2)個門,在2PC(例如姚氏混淆電路中),這樣的電路須要爲每一個乘法進都算一次。

本文提出了一種簡單但有效的支持有限域上的十進制數的解決方案。考慮對兩個小數部分最多有lD比特的兩個十進制數x y的定點乘法,首先把經過x' = 2^lD×x,y' = 2^lD×y,把數字轉化成整數,而後把他們相乘獲得z = x'×y',注意到z最多有2lD表示積的小數部分,因此咱們簡單粗暴地將最後z的最後lD比特砍掉,這樣它最多有lD比特來表示小數部分。 z也能夠被祕密分享,能夠證實,兩個服務器分別砍去本身的最後lD位比特,和想要的z其實最多相差一個最不重要的比特位,這對最後結果的影響能夠說是微乎其微。換句話說,相較於標準的定點乘,咱們只是缺乏了小數部分最不重要的一個比特位。

隱私保護的線性迴歸的在線部分的協議如圖所示:

線性迴歸 協議假定了數據無關的共享矩陣<U><V><Z><V'><Z'>已經在離線階段產生,除了共享十進制數的加乘,協議還須要將係數向量和學習率相乘,爲了讓乘法更有效率,將{\alpha \over |B|}變成2的冪次,好比{\alpha \over |B|} = 2^{-k}

3.2 離線階段——產生三元組子

說到底我仍是不理解,在線和離線階段都分別用來幹什麼?個人理解是,所謂模型更新,所須要的不過是一次線性混淆計算,簡單來說,就是雙方共同計算一個a*b便可,而後各自能夠獲得計算結果。這麼講吧,你本身也發現了,你本身其實可能根本不須要online就能作不少事情,你所須要online作的只是一小部分,不少事情不必online作了,因此分紅了online和offline。

那咱們這裏線下作了些什麼呢?就是generate 三元組。對啊,我就是想問,爲何offline的必定是generate 三元組?而不是其餘的工做?

回憶一下,給定共享隨機矩陣(這裏所謂的共享是什麼意思?是兩方擁有同樣的矩陣?仍是說這個矩陣被祕密分享,便可以用兩個數字相加恢復出來?)<U>,<V>關鍵步驟是從<U>中選擇一個|B|×d的子矩陣,和從<V>選擇一個列並計算他們積的shares,這被重複t次來計算出<Z>,<Z'>被這樣計算以相反的維度。

所以,簡化起見,咱們關於於基礎步驟,給定|B|×d的矩陣<A>的shares,和一個d×1的矩陣<B>的shares,咱們想要計算|B|×1的矩陣<C>的shares。咱們利用接下來的關係:C = <A>0 ×<B>0 + <A>0 ×<B>1 +<A>1 ×<B>0 +<A>1 ×<B>1。<<A>0 ×<B>1> <<A>1 ×<B>0>能夠合做計算,而 <A>0 ×<B>0 <A>1 ×<B>1便可在本地計算。

接下來就是如何合做計算<<A>0 ×<B>1> 、<<A>1 ×<B>0>>這兩個式子的問題

3.2.1 基於同態加密的生成

爲了計算<A>0 ×<B>1的shares,S1使用LHE加密<B>1的每一個元素,並將它發送給S0。S0而後在密文上執行矩陣乘法,其中加法被乘法替代,乘法被冪運算取代。最後,S0將獲得的密文用隨機值掩蓋,發送給S1解密。最終的結果就是S0和S1分別獲得了<<A>0 ×<B>1>0和<<A>0 ×<B>1>1這兩個shares。對於計算<<A>1 ×<B>0>>,方法是同樣的。再用上能夠本地計算的兩個式子,C便可算出出來。說白了,線下階段就是在計算沒法本地計算的三元組子嘛?

我大概懂了什麼叫generate 三元組,說白了就是根據本地存儲的<A>和<B>計算出<C>,上面的分析是將求出<C>拆成四個式子的運算,一半能夠offline作,一半須要交流。須要交流的那個兩個式子的求解過程只須要傳送一下兩個被加密/混淆過的矩陣便可,通訊開銷小。計算開銷經過分析是能夠接受的.

3.2.2 基於不經意傳輸的生成

上面的問題——計算<<A>0 ×<B>1>的shares也能夠用不經意傳輸來解決,步驟以下:

  1. S1使用bj個比特來選擇從2個使用COT從aij中計算出來的值選一個出來(明明就是一個aij,爲何要變成兩個,並且怎麼變成兩個的???)
  2. 對於k=1~l,S0設置COT的係數函數爲fk(x)=aij*2^k+x mod 2^l
  3. S0執行COT(rk,fk(xj); bj[k])
  4. S1執行COT(rk, fk(x); bj[k])
    • 若是bj[k] = 0,S1獲得 rk
    • 若是bj[k] = 1,S1獲得 aij*2^k+x mod 2^l
    • 也能夠寫成bj[k] * aij * 2^k + rk mod 2^l

$$ <a_{ij},b_j>_0 = \sum _{k=1}^l*(-r_k) (mod 2^l) $$

$$ <a_{ij},b_j> 1= \sum {k=1}^l(b_j[k]aij2^k+r_k)= a{ij}*b_j+\sum{k=1}^lr_k (mod 2^l) $$

3.3 隱私保護的邏輯迴歸

相較於線性迴歸,邏輯迴歸須要在共享數字上計算激活函數: $$ f(u)={1\over 1+e^{-u}} $$ 這其中有除法有冪運算,很難用算數或布爾電路來進行安全兩方計算。以前使用的用多項式去近似的方法雖然能夠行可是效率過低而沒法使用。

3.3.1 安全計算友好型激活函數

因此做者提出用這樣一種激活函數來做爲替代方案:

$$ f(x)=\begin{cases}0,&if \quad x<-{1\over 2}\cr x+{1\over 2},&if \quad -{1\over 2} \leq x \leq {1\over 2}\cr1,&if\quad x> {1\over 2} \end{cases} $$ 激活函數

之因此使用這個函數,一來是由於它在邊界很容易收斂到0或1,並且和RELU函數很像。

一旦咱們使用新的激活函數,在計算後饋階段時,咱們使用相同的更新函數做爲邏輯函數,即繼續使用邏輯函數計算偏導數,這種方法通過實驗證實效率很好。做者頁建議探索更多安全多方計算友好型能夠被簡單的布爾和算數電路計算的激活函數。

3.3.2 隱私保護協議

新的激活函數是電路友好型。它僅僅包含了測試輸入是否在[-1/2,1/2]這個區間。可是,僅僅把姚氏混淆電路協議整個的直接用到激活函數中是不高效的。相反,咱們利用在算數分享和姚氏分享之間切換的技術。邏輯迴歸和線性迴歸隨機梯度降低的惟一不一樣就是邏輯迴歸在每一個前饋過程都多了一個額外的激活函數。所以,首先咱們和計算線性迴歸同樣,先計算除了數據和係數矩陣的內積,而後將算數分享切換到姚氏分享並計算激活函數的值使用混淆電路。而後在切換回算數分享來繼續後饋過程。具體訓練過程以下:

邏輯迴歸

3.4 隱私保護的神經網絡訓練

在隱私保護的線性迴歸和邏輯迴歸均可以被很順暢地擴展來支持隱私保護的神經網絡的訓練,我可使用RELU函數做爲每一個神經元的激活函數,交叉熵做爲損失函數。每一個神經元的係數的更新函數均可以像表達成像2.1中討論的那種封閉模式。除了激活函數的求值和偏導函數外,前饋和後饋階段的全部函數都是簡單的線性操做。爲了給RELU函數求和和求導,咱們像給邏輯函數那樣轉換到姚氏分享便可,混淆電路僅僅將兩個shares相加並輸出最重要的比特,比咱們在邏輯函數中使用的電路還要簡單。RELU的求值和求導函數能夠在一輪以內一塊兒求出來,求導的結果用在後饋階段。   咱們也提出了安全多方計算友好型的softmax的替代方案。而後咱們將RELU全部的輸出加起來求和,使用出發電路,將每一個輸出除以總和。這樣,輸出能夠保證是機率分佈。   根據實驗中的觀察,花在RELU混淆電路上的時間佔了大量的在線訓練時間。所以,咱們也考慮將激活函數替換成平方函數。這樣調整以後,咱們達到了93.1%的準確率。如今,一個計算RELU函數的混淆電路被在共享值上的三元組子所替代,在線階段的性能大大提升。可是,這種方法花費了更多的三元組也提升了在線階段的開銷。

3.4.1 效率討論

在線階段,計算複雜度是 使用矩陣算數操做的明文訓練加上RELU求值和使用混淆電路和不經意傳輸的 兩倍。 離線階段,三元組的總數相較於增加了O(\sum^m_{i=1}d_m)相較於迴歸,這實際上是神經元的總數。一些三元組子能夠爲在線矩陣乘法以矩陣形式產生

3.5.1 隱私保護預測

咱們迭代咱們能夠隱藏輸入數據、模型、預測結果和他們的任意組合,由於在咱們的協議中他們能夠祕密分享。若是要麼輸入數據、要麼模型能夠被揭露出來,效率能夠進一步提高,例如,若是模型是明文,帶有矩陣的輸入數據的乘法能夠被直接計算在shares,不須要直接計算的三元組

4 客戶端輔助的離線協議

主要的性能瓶頸是離線階段,它包含大量的密碼學操做例如OT或者LHE,,固然會比在線階段的在有限域上的簡單的加乘操做慢。這刺激咱們去尋找另一種產生三元組的替代方案。尤爲,咱們讓客戶端產生三元組。既然客戶端首先須要祕密分享他們的數據,進一步讓他們祕密分享一些額外的三元組也是天然而然的事情。如今,一些三元組能夠在沒有任何祕密學操做、以可信任的方式產生。這大大提升了效率,儘管他有好處,也改變了安全模型。

4.1 客戶端輔助的三元組

簡單起見,注意到在整個訓練過程當中,每一個數據樣本中的特徵在兩個三元組子中用到了——一次是在前饋階段,一次是在後饋階段。所以,它suffices for客戶端持有這個值來產生2E三元組。尤爲,對於每一個樣本中的每一個特徵,客戶端處理數據來產生隨機值u來掩蓋數據,產生隨機值vk,vk' for k = 1~E並計算zk=u*vk,zk'=u* vk' 最後,客戶端將<u>, <vk>, <vk'>, <zk>, <zk'>的shares分佈在兩個服務器上。此次操做我確定在哪裏見過,若是是服務器作,該怎麼作呢?服

咱們不假定客戶端在產生三元組的時候知道數據是如何partitioning的,這意味着咱們沒法從在線階段的向量化中獲益。舉個例子,在線性迴歸的前饋階段,咱們使用以前計算的和在線階段具備同樣的維度的矩陣三元組U×V=Z。如今,當三元組被客戶端產生時,在mini-batch Xb中的數據或許屬於不一樣的,且不知道他們擁有相同的訓練batch的客戶端,所以不一樣共認一個共同的隨機矩陣V來計算Z 相反的,若是不進行向量化,即對於在XB中的每一個數據樣本x,雙方使用獨立產生的三元組計算<y*>=MulA(<x,w))。所以,在線階段的通訊、計算開銷和兩臺服務器的存儲負載都提升了。 客戶端輔助三元組產生由於沒有密碼學操做參與其中,雖然提升了離線階段的效率,可是由於矩陣三元組被向量的內積所替代,它將負載引入了在線階段。所要執行的乘法的總數是相同的,整體上,矩陣相乘算法比使用編程語言中的矩陣庫要快。這是最大的被客戶端輔助產生三元組引入的負載。 通訊的開銷也一樣上升了,之前係數矩陣被一個隨機矩陣所掩蓋來計算一個矩陣乘法,如今每計算一個內積就要被不少不一樣的隨機矩陣來掩蓋。被掩蓋的值要用安全計算協議在兩方之間傳輸。   最後,存儲開銷也提高了。先前,矩陣V和矩陣Z比數據大小要遠遠地小,矩陣U和數據同樣的大小。如今,由於三元組子被獨立產生,V的大小變成了|B|*d*t=n*d*E,比數據的大小要多出一個E。U的大小仍然同樣,由於每一個數據仍然被一個隨機值所掩蓋,Z的大小仍然相同由於一旦服務器從全部的客戶端那裏收到了shares,值將會被聚合。   儘管有這樣負載,由於離線階段被大大提高,在線階段仍然是有效率的,因此總體的性能被大大提高。這種客戶端輔助產生三元組的架構也是是如今最有前景的一種架構。

4.2 新的安全模型

安全模型也隨之發生改變,僅僅記下改變的那一部分。先前,用戶只負責上傳數據,所以服務器固然沒法知道任何信息當它和一小部分客戶端同流合污時。如今,由於客戶端也產生三元組,若是一小部分客戶端和服務器聯合起來時,他們或許能夠恢復出係數矩陣,這損害了誠實客戶端的利益。所以在這個安全模型中不容許服務器和客戶端同流合污。

相關文章
相關標籤/搜索