日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【译】Private Image Analysis with MPC Training CNNs on Sensitive Data

發(fā)布時間:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【译】Private Image Analysis with MPC Training CNNs on Sensitive Data 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

TL; DR:我們采用典型的CNN深度學(xué)習(xí)模式,并通過一系列步驟,使訓(xùn)練和預(yù)測都能夠在加密數(shù)據(jù)上完成。

使用深度學(xué)習(xí)通過卷積神經(jīng)網(wǎng)絡(luò)?(CNN)分析圖像在過去的幾年中獲得了巨大的普及,因為它們在這項工作和相關(guān)任務(wù)上取得了很多其他方法的成功。

最近的一個應(yīng)用程序采取了皮膚癌檢測的形式,任何人都可以使用手機應(yīng)用程序快速拍攝皮膚損傷照片,并使用“與專家相媲美的性能”進行分析(請參閱相關(guān)視頻以了解演示)。?獲得大量臨床照片是訓(xùn)練此模型的關(guān)鍵部分 - 可被視為敏感的數(shù)據(jù)集。

這給我們帶來了隱私并最終確保了多方計算?(MPC):由于缺乏對數(shù)據(jù)的訪問,今天有多少應(yīng)用程序受到限制??在上述情況下,通過讓任何有手機應(yīng)用程序的人都可以參與訓(xùn)練數(shù)據(jù)集,可以改進模型嗎??如果是這樣,有多少人愿意冒著暴露個人健康相關(guān)信息的風(fēng)險?

有了MPC,我們可以降低風(fēng)險,從而增加參與的積極性。?更具體地說,通過改為對加密數(shù)據(jù)進行訓(xùn)練,我們可以防止任何人不僅看到單個數(shù)據(jù),還看到學(xué)習(xí)的模型參數(shù)。另外還可以使用其他技術(shù)(如差分隱私)來隱藏預(yù)測中的任何泄漏,但我們不會在此討論。

在這篇博客文章中,我們將看一個更簡單的用于圖像分析的用例,但需要查看所有必需的技巧。?一些筆記本是在這個過程中展示的,主要的筆記本是概念驗證實施的一部分?。

巴黎機器學(xué)習(xí)聚會上最近的演示文稿幻燈片現(xiàn)已推出。

非常感謝Andrew Trask?,?Nigel Smart?,?AdriàGascón和OpenMined社區(qū)為這個主題提供靈感和有趣的討論!?Jakukyo Friel也非常友好地做了中文翻譯?。

設(shè)置

我們假設(shè)訓(xùn)練數(shù)據(jù)集由一組輸入提供者共同持有,并且訓(xùn)練由兩個不同的服務(wù)器?(或參與方?)執(zhí)行,這些服務(wù)器?(或參與方?)不信任超出我們協(xié)議規(guī)定的協(xié)作范圍。?實際上,這些服務(wù)器可以是例如由兩個不同組織運行的共享云環(huán)境中的虛擬實例。

輸入提供者僅在開始時才需要傳輸他們的(加密的)訓(xùn)練數(shù)據(jù);?之后所有的計算只涉及兩臺服務(wù)器,這意味著輸入提供商使用移動電話確實是合理的。?一旦訓(xùn)練完成,該模型將繼續(xù)以加密形式由兩臺服務(wù)器共同保存,任何人都可以使用該服務(wù)器進行進一步的加密預(yù)測。

出于技術(shù)原因,我們還假設(shè)一個獨立的密碼生產(chǎn)者在計算過程中生成某些原材料以提高效率;?有辦法消除這個額外的實體,但我們不會在這里進入。

最后,就安全性而言,我們的目標(biāo)是實踐中使用的一種典型概念,即誠實但好奇(或被動)的安全性?,其中服務(wù)器被假定遵循協(xié)議但可能試圖從數(shù)據(jù)中盡可能地學(xué)習(xí)看到。?盡管服務(wù)器的概念比完全惡意(或主動)的安全性稍弱,但它仍然能夠?qū)θ魏慰赡茉谟嬎愫髶p害其中一臺服務(wù)器的人提供強有力的保護,盡管他們所做的事情都是如此。?請注意,為了本博文的目的,我們實際上將允許在培訓(xùn)期間發(fā)生一些小的隱私泄露,詳情請參閱后文。

用CNN進行圖像分析

我們的使用案例是規(guī)范的MNIST手寫數(shù)字識別?,即學(xué)習(xí)識別給定圖像中的阿拉伯?dāng)?shù)字,我們將使用Keras示例中的以下CNN模型作為我們的基礎(chǔ)。

feature_layers = [ Conv2D ( 32 , ( 3 , 3 ), padding = 'same' , input_shape = ( 28 , 28 , 1 )), Activation ( 'relu' ), Conv2D ( 32 , ( 3 , 3 ), padding = 'same' ), Activation ( 'relu' ), MaxPooling2D ( pool_size = ( 2 , 2 )), Dropout ( . 25 ), Flatten () ] classification_layers = [ Dense ( 128 ), Activation ( 'relu' ), Dropout ( . 50 ), Dense ( NUM_CLASSES ), Activation ( 'softmax' ) ] model = Sequential ( feature_layers + classification_layers ) model . compile ( loss = 'categorical_crossentropy' , optimizer = 'adam' , metrics = [ 'accuracy' ]) model . fit ( x_train , y_train , epochs = 1 , batch_size = 32 , verbose = 1 , validation_data = ( x_test , y_test ))

我們不會在這里詳細介紹這個模型,因為這些原則已經(jīng)在?其他地方被很好的覆蓋了?,但是其基本思想是首先通過一組要素圖層來運行圖像,這些要素圖層將輸入圖像的原始像素轉(zhuǎn)換為抽象屬性這與我們的分類任務(wù)更相關(guān)。?隨后,這些屬性通過一組分類層進行組合,以產(chǎn)生可能數(shù)字的概率分布。?最終的結(jié)果通常只是具有最高分配概率的數(shù)字。

我們將看到,使用Keras的好處是,我們可以對未加密的數(shù)據(jù)執(zhí)行快速實驗,以了解模型本身的性能,并提供一個簡單的接口,以便稍后模擬加密設(shè)置。

使用SPDZ進行安全計算

隨著CNN的到位,我們接下來轉(zhuǎn)向MPC。?為此,我們將使用最先進的SPDZ協(xié)議,因為它允許我們只有兩臺服務(wù)器,并通過將某些計算移動到離線階段來提高在線性能,詳見前面的博客?文章?。

作為安全計算協(xié)議的典型代表,所有計算都在一個字段中進行,這里由一個素數(shù)Q?。這意味著我們需要將由CNN使用的浮點數(shù)編碼為整數(shù)模的素數(shù),這會對Q產(chǎn)生一定的約束,進而影響性能。

此外,?回想一下?,在諸如SPDZ協(xié)議的交互式計算中,除了典型的時間復(fù)雜度之外,還考慮通信和圓形復(fù)雜性也是相關(guān)的。?在這里,前者測量通過網(wǎng)絡(luò)發(fā)送的比特數(shù),這是一個相對緩慢的過程,后者是兩臺服務(wù)器之間所需的同步點數(shù)量,這可能會阻止其中一個無需處理,直到另一個服務(wù)器趕上。?這兩者對整體執(zhí)行時間也有很大影響。

但最重要的是,我們在這些協(xié)議中唯一的“本地”操作是加法和乘法。?可以完成分部,比較等工作,但在我們的三項績效指標(biāo)方面則較為昂貴。?稍后我們將看到如何減輕由此導(dǎo)致的一些問題,但我們首先回顧一下基本的SPDZ協(xié)議。

張量操作

當(dāng)我們早些時候引入SPDZ協(xié)議時,我們以PublicValue和PrivateValue類的形式這樣做,分別表示兩個服務(wù)器都清楚已知的(標(biāo)量)值和僅以秘密共享形式已知的加密值。?在這篇博客文章中,我們現(xiàn)在更自然地通過類PublicTensor和PrivateTensor更自然地展示它,它們反映了在深度學(xué)習(xí)環(huán)境中大量使用張量?。

class PrivateTensor : def __init__ ( self , values , shares0 = None , shares1 = None ): if not values is None : shares0 , shares1 = share ( values ) self . shares0 = shares0 self . shares1 = shares1 def reconstruct ( self ): return PublicTensor ( reconstruct ( self . shares0 , self . shares1 )) def add ( x , y ): if type ( y ) is PublicTensor : shares0 = ( x . values + y . shares0 ) % Q shares1 = y . shares1 return PrivateTensor ( None , shares0 , shares1 ) if type ( y ) is PrivateTensor : shares0 = ( x . shares0 + y . shares0 ) % Q shares1 = ( x . shares1 + y . shares1 ) % Q return PrivateTensor ( None , shares0 , shares1 ) def mul ( x , y ): if type ( y ) is PublicTensor : shares0 = ( x . shares0 * y . values ) % Q shares1 = ( x . shares1 * y . values ) % Q return PrivateTensor ( None , shares0 , shares1 ) if type ( y ) is PrivateTensor : a , b , a_mul_b = generate_mul_triple ( x . shape , y . shape ) alpha = ( x - a ) . reconstruct () beta = ( y - b ) . reconstruct () return alpha . mul ( beta ) + \ alpha . mul ( b ) + \ a . mul ( beta ) + \ a_mul_b

正如所看到的,使用NumPy的適應(yīng)非常簡單,例如PrivateTensor的一般形式幾乎完全相同,只是偶爾也傳遞一個形狀。?但是有一些技術(shù)細節(jié),所有這些都可以在相關(guān)的筆記本中完整獲得。

def share ( secrets ): shares0 = sample_random_tensor ( secrets . shape ) shares1 = ( secrets - shares0 ) % Q return shares0 , shares1 def reconstruct ( shares0 , shares1 ): secrets = ( shares0 + shares1 ) % Q return secrets def generate_mul_triple ( x_shape , y_shape ): a = sample_random_tensor ( x_shape ) b = sample_random_tensor ( y_shape ) c = np . multiply ( a , b ) % Q return PrivateTensor ( a ), PrivateTensor ( b ), PrivateTensor ( c )

因此,也許最大的區(qū)別在于使用這種形狀的上述基本效用方法。

適應(yīng)模型

雖然原則上可以用我們已有的方法安全地計算任何函數(shù),因此也可以用上面的基礎(chǔ)模型來計算任何函數(shù),但實際上,首先考慮模型的MPC更友好的變體是相關(guān)的,反之亦然。?在稍微更加美觀的文字中,通常打開我們的兩個黑盒子,并使兩種技術(shù)更好地適應(yīng)對方。

這個根源來自于一些在加密設(shè)置中令人驚訝的昂貴的操作。?我們在上面看到,加法和乘法相對便宜,但與私人分母的比較和劃分則不然。?為此,我們對模型進行了一些更改以避免這些情況。

本節(jié)介紹的各種變化以及它們的仿真性能可在相關(guān)的Python筆記本中完整獲取。

優(yōu)化

第一個問題涉及優(yōu)化器:雖然Adam在許多實現(xiàn)中是效率優(yōu)先的選擇,但它也涉及到取一個私有值的平方根并使用一個作為分部的分母。?雖然理論上可以安全地計算這些值?,但實際上它可能是性能的一個重要瓶頸,因此可能會避免。

一個簡單的補救辦法是切換到動力SGD優(yōu)化器,這可能意味著更長的培訓(xùn)時間,但只使用簡單的操作。

model . compile ( loss = 'categorical_crossentropy' , optimizer = SGD ( clipnorm = 10000 , clipvalue = 10000 ), metrics = [ 'accuracy' ])

另外需要注意的是許多優(yōu)化器都使用剪切來防止梯度變得太小或太大。?這需要對私有值進行比較?,這在加密設(shè)置中又是一個比較昂貴的操作,因此我們的目標(biāo)是完全避免使用這種技術(shù)。?為了從我們的Keras模擬中獲得逼真的結(jié)果,我們增加了上面的邊界。

圖層

說到比較,?ReLU和max-pooling層帶來了類似的問題。?在CryptoNets中?,前者由平方函數(shù)替換,后者由平均匯集替換,而SecureML通過增加復(fù)雜度來實現(xiàn)類似ReLU的激活函數(shù),我們希望避免簡化事情。?因此,我們在這里改為使用高級S形激活函數(shù)和平均匯聚層。?請注意,平均匯集也使用一個分區(qū),但這次分母是一個公共值,因此分區(qū)只是一個公共反轉(zhuǎn),然后是一個乘法。

feature_layers = [ Conv2D ( 32 , ( 3 , 3 ), padding = 'same' , input_shape = ( 28 , 28 , 1 )), Activation ( 'sigmoid' ), Conv2D ( 32 , ( 3 , 3 ), padding = 'same' ), Activation ( 'sigmoid' ), AveragePooling2D ( pool_size = ( 2 , 2 )), Dropout ( . 25 ), Flatten () ] classification_layers = [ Dense ( 128 ), Activation ( 'sigmoid' ), Dropout ( . 50 ), Dense ( NUM_CLASSES ), Activation ( 'softmax' ) ] model = Sequential ( feature_layers + classification_layers )

模擬結(jié)果表明,通過這種變化,我們現(xiàn)在必須對時代數(shù)量進行調(diào)整,以相同的因子減慢訓(xùn)練時間。?學(xué)習(xí)速度或動力的其他選擇可能會改善這一點。

model . fit ( x_train , y_train , epochs = 15 , batch_size = 32 , verbose = 1 , validation_data = ( x_test , y_test ))

其余層很容易處理。?Dropout和Flatten不關(guān)心我們是處于加密還是未加密的設(shè)置,密集和卷積是只需要基本操作的矩陣點產(chǎn)品。

Softmax和損失功能

最終的softmax層也會導(dǎo)致加密設(shè)置中的訓(xùn)練出現(xiàn)復(fù)雜情況,因為我們需要使用私有指數(shù)來計算冪運算?,并使用帶有私人分母的分割形式進行規(guī)范化。

雖然兩者都有可能,但我們在這里選擇一種更簡單的方法,并將每個訓(xùn)練樣本的預(yù)測類別可能性透露給其中一個服務(wù)器,然后他們可以根據(jù)顯示的值計算結(jié)果。?這當(dāng)然會導(dǎo)致隱私泄露,這可能會或可能不會帶來可接受的風(fēng)險。

一種啟發(fā)式改進是服務(wù)器在揭示任何事物之前首先為每個訓(xùn)練樣本排列類別似然向量,從而隱藏哪個可能性對應(yīng)于哪個類別。?然而,如果例如“健康”通常意味著對類的狹窄分布,而“病態(tài)”意味著擴散分布,則這可能影響不大。

另一種方法是引入一個專門的第三臺服務(wù)器,他只做這個小計算,不會從培訓(xùn)數(shù)據(jù)中看到其他任何內(nèi)容,因此不能將標(biāo)簽與樣本數(shù)據(jù)關(guān)聯(lián)起來。?雖然有些東西仍然泄漏,而且這個數(shù)量很難解釋。

最后,我們也可以用一對一的方法來替代這種“?一對一”的方法,例如使用S形。?如前所述,這使我們能夠在不解密的情況下完全計算預(yù)測。?然而,我們?nèi)匀恍枰嬎銚p失,這也可以通過考慮不同的損失函數(shù)來完成。

請注意,在稍后使用訓(xùn)練好的網(wǎng)絡(luò)執(zhí)行預(yù)測時,不會出現(xiàn)這里提到的問題,因為沒有損失需要計算,服務(wù)器可以在那里簡單地跳過softmax層,并讓預(yù)測的接收者自己根據(jù)顯示的值計算它:對他來說,這只是一個值如何解釋的問題。

轉(zhuǎn)移學(xué)習(xí)

在這一點上,我們似乎可以實際地訓(xùn)練模型并獲得體面的結(jié)果。?但通常在CNN中我們可以通過使用轉(zhuǎn)移?學(xué)習(xí)來獲得顯著的加速;?事實上,“很少有人從零開始訓(xùn)練自己的卷積網(wǎng),因為他們沒有足夠的數(shù)據(jù)”,并且“總是推薦在實踐中使用轉(zhuǎn)換學(xué)習(xí)”。

我們在這里設(shè)置的一個特定應(yīng)用是,可以使用非敏感公開數(shù)據(jù)和使用敏感私人數(shù)據(jù)的微調(diào)階段將培訓(xùn)分為預(yù)培訓(xùn)階段。?例如,在皮膚癌檢測器的情況下,研究人員可能選擇在公開的一組照片上進行預(yù)培訓(xùn),然后通過提供額外照片讓志愿者改進模型。

此外,除了基數(shù)的差異之外,兩個數(shù)據(jù)集在主體方面也存在差異的空間,因為CNN傾向于首先將這些數(shù)據(jù)分解成有意義的子組成部分,其中正在被轉(zhuǎn)移的部分被識別。?換句話說,這種技術(shù)足夠強大,可以在不同類型的圖像上進行預(yù)培訓(xùn)而不是進行微調(diào)。

回到我們對字符識別的具體使用案例,我們將讓“公共”圖像為數(shù)字0-4?,“私人”圖像為數(shù)字5-9?。?作為替代,似乎并不是不合理的,例如字符az用作前者,數(shù)字0-9用作后者。

在公共數(shù)據(jù)集上預(yù)訓(xùn)練

除了避免對公開數(shù)據(jù)集的加密數(shù)據(jù)進行培訓(xùn)開銷外,我們還可以利用更先進的優(yōu)化器進行培訓(xùn)。?在這里,例如,我們切換回公共圖像的Adam優(yōu)化器,并可以利用其改進的訓(xùn)練時間。?特別是,我們看到我們可以再次降低所需的時代數(shù)量。

( x_train , y_train ), ( x_test , y_test ) = public_dataset model . compile ( loss = 'categorical_crossentropy' , optimizer = 'adam' , metrics = [ 'accuracy' ]) model . fit ( x_train , y_train , epochs = 1 , batch_size = 32 , verbose = 1 , validation_data = ( x_test , y_test ))

一旦對此感到滿意,服務(wù)器只需共享模型參數(shù)并繼續(xù)對私有數(shù)據(jù)集進行培訓(xùn)。

微調(diào)私人數(shù)據(jù)集

雖然我們現(xiàn)在開始對已經(jīng)“中途”的模型參數(shù)進行加密訓(xùn)練,因此可以預(yù)計需要更少的時期,但是如上所述,轉(zhuǎn)移學(xué)習(xí)的另一個好處是對子組件的識別往往發(fā)生在較低層的網(wǎng)絡(luò),并且在某些情況下可以按原樣使用。?因此,我們現(xiàn)在凍結(jié)了要素圖層的參數(shù),并將培訓(xùn)工作專注于分類層。

for layer in feature_layers : layer . trainable = False

但請注意,我們?nèi)匀恍枰ㄟ^這些層面向前運行所有私人培訓(xùn)樣本;?唯一的區(qū)別是我們在后退步驟中跳過它們,并且沒有幾個參數(shù)需要訓(xùn)練。

然后像以前一樣進行訓(xùn)練,盡管現(xiàn)在使用較低的學(xué)習(xí)率。

( x_train , y_train ), ( x_test , y_test ) = private_dataset model . compile ( loss = 'categorical_crossentropy' , optimizer = SGD ( clipnorm = 10000 , clipvalue = 10000 , lr = 0.1 , momentum = 0.0 ), metrics = [ 'accuracy' ]) model . fit ( x_train , y_train , epochs = 5 , batch_size = 32 , verbose = 1 , validation_data = ( x_test , y_test ))

最后,我們從模擬中的25個時期到5個時期。

預(yù)處理

有幾個預(yù)處理優(yōu)化可以應(yīng)用,但我們在這里不會進一步考慮。

首先是將凍結(jié)圖層的計算移動到輸入提供程序,以便它是與服務(wù)器共享的拼合圖層的輸出,而不是圖像的像素。?在這種情況下,這些圖層被稱為執(zhí)行特征提取?,我們也可能使用更強大的圖層。?但是,如果我們想保持模型專有,那么這就增加了很大的復(fù)雜性,因為參數(shù)現(xiàn)在必須以某種形式分發(fā)給客戶。

另一種加速培訓(xùn)的典型方法是首先應(yīng)用降維技術(shù),如主成分分析?。?這種方法在BSS + '17的加密設(shè)置中進行。

修改協(xié)議

看過模型之后,我們接下來看看協(xié)議:也就是說,理解我們要執(zhí)行的操作可以幫助加快速度。

特別是,很多計算可以轉(zhuǎn)移到加密提供者,加密提供者的原始材料獨立于私人輸入,甚至可以擴展到模型。?因此,只要方便且大規(guī)模,其計算可以預(yù)先完成。

之前回憶說,優(yōu)化輪次和通信復(fù)雜性是相關(guān)的,并且這里提出的擴展通常旨在以犧牲額外的本地計算為代價來改進這些擴展。?因此,需要實際的實驗來驗證它們在具體條件下的好處。

退出

從最簡單的圖層類型開始,我們注意到這里沒有任何與安全計算相關(guān)的特殊情況,唯一的辦法是確保兩個服務(wù)器同意在每次訓(xùn)練迭代中丟棄哪些值。?這可以通過簡單地同意種子價值來完成。

平均匯集

平均匯集的正向傳遞只需要一個總分和一個公分母。?因此,它可以通過與公共價值相乘來實現(xiàn):由于分母是公開的,我們可以很容易地找到它的逆,然后簡單地乘以和截斷。?同樣,反向傳遞只是一個縮放,因此這兩個方向都完全是本地操作。

密集的層

密集層向前和向后傳遞所需的點積當(dāng)然可以使用乘法和加法以典型的方式實現(xiàn)。?如果我們想要分別用(m, k)和(k, n)形式計算矩陣x和y?dot(x, y)?,則這需要m * n * k乘法,這意味著我們必須傳遞相同數(shù)量的被屏蔽值。?雖然這些都可以并行發(fā)送,所以我們只需要一輪,如果我們允許我們使用另一種預(yù)處理的三倍,那么我們可以將通信成本降低一個數(shù)量級。

例如,我們模型中的第二個致密層計算(32, 128)和(128, 5)矩陣之間的點積。?使用典型的方法需要每批發(fā)送32 * 5 * 128 == 22400屏蔽值,但通過使用下面描述的預(yù)處理三元組,我們只需發(fā)送32 * 128 + 5 * 128 == 4736值,幾乎提高了5倍。?對于第一個致密層來說,它甚至更大,即略高于25倍。

同樣如前所述?,訣竅在于確保矩陣中的每個私有值只發(fā)送一次掩碼。?為了使這個工作,我們需要三元(a, b, c)的隨機矩陣a和b與適當(dāng)?shù)男螤詈蚦 == dot(a, b)?。

def generate_dot_triple ( x_shape , y_shape ): a = sample_random_tensor ( x_shape ) b = sample_random_tensor ( y_shape ) c = np . dot ( a , b ) % Q return PrivateTensor ( a ), PrivateTensor ( b ), PrivateTensor ( c )

給定這樣一個三元組,我們可以相反地傳達alpha = x - a和beta = y - b然后進行局部計算以獲得dot(x, y)?。

class PrivateTensor : ... def dot ( x , y ): if type ( y ) is PublicTensor : shares0 = x . shares0 . dot ( y . values ) % Q shares1 = x . shares1 . dot ( y . values ) % Q return PrivateTensor ( None , shares0 , shares1 ) if type ( y ) is PrivateTensor : a , b , a_dot_b = generate_dot_triple ( x . shape , y . shape ) alpha = ( x - a ) . reconstruct () beta = ( y - b ) . reconstruct () return alpha . dot ( beta ) + \ alpha . dot ( b ) + \ a . dot ( beta ) + \ a_dot_b

使用這些三元組的安全性遵循與乘法三元組相同的論點:所傳遞的掩碼值完全隱藏了x和y而c是一個獨立的新分享,確保結(jié)果不會泄漏任何有關(guān)其構(gòu)成的內(nèi)容。

請注意,?SecureML中使用了這種三元組,這種三元組也提供了允許服務(wù)器在沒有加密提供程序幫助的情況下生成它們的技術(shù)。

卷積

像密集層一樣,卷積可以被視為一系列標(biāo)量乘法或矩陣乘法?,盡管后者只是在首先將訓(xùn)練樣本的張量擴展到具有顯著重復(fù)的矩陣之后。?毫不奇怪,這導(dǎo)致了通信成本,在這兩種情況下都可以通過引入另一種三元組來改善。

作為一個例子,第一卷積使用形狀(m, 28, 28, 1)?(m, 28, 28, 32)?32濾波器(不包括偏差(m, 28, 28, 1)將具有形狀(m, 28, 28, 32)?28,28,1)的張量映射到具有形狀(m, 28, 28, 1)?28,28,32)的張量向量)。?對于批量大小為m == 32情況,如果僅使用標(biāo)量乘法,則表示7,225,344通信元素,如果使用矩陣乘法,則表示226,080?。?然而,由于總共只涉及(32*28*28) + (32*3*3) == 25,376私人值(因為它們只需要添加,所以不再計算偏差),我們看到大致有一個因子9高架。?換句話說,每個私人價值都被屏蔽并被多次發(fā)送。?使用新的三元組,我們可以消除這種開銷并節(jié)省通信成本:對于64位元素,這意味著每批200KB?,而不是分別為1.7MB和55MB?。

我們在這里需要的三元組(a, b, c)與點積中使用的三元組相似,?a和b形狀與兩個輸入相匹配,即(m, 28, 28, 1)和(32, 3, 3, 1)和c匹配輸出形狀(m, 28, 28, 32)?。

乙狀結(jié)腸激活

如前所述?,我們可以使用9階多項式來以足夠的準(zhǔn)確度逼近S形激活函數(shù)。?評估這個多項式為私有值x需要計算x的一系列冪,這當(dāng)然可以通過順序乘法來完成 - 但這意味著幾輪和相應(yīng)的通信量。

作為替代方案,我們可以再次使用一種新的預(yù)處理三元組,使我們能夠在一輪中計算所有需要的功率。?如前所述,這些“三元組”的長度并不是固定的,而是等于最高指數(shù),因此例如平方的三元組由a和a**2的獨立分支組成,而一個用于立方體的三元組由獨立的a?,?a**2和a**3?。

一旦我們有了這些x的冪,那么用一個公共系數(shù)評估一個多項式就是一個局部加權(quán)和。?這一點的安全性來自于三聯(lián)所有權(quán)力都是獨立分享的事實。

def pol_public ( x , coeffs , triple ): powers = pows ( x , triple ) return sum ( xe * ce for xe , ce in zip ( powers , coeffs ) )

我們和早期的定點精度有相同的警告,即我們需要更多的空間來獲得更高的精度:?x**n的精度是n倍,我們希望確保它不會從那以后我們就無法正確解碼了。?正如那里所做的那樣,我們可以通過引入一個足夠大的場P來解決這個問題,我們在計算功率時暫時切換到這個場,這是以兩輪額外的通信為代價的。

實際的實驗可以顯示是否最好留在Q并使用更多的乘法輪次,或者執(zhí)行切換并支付更大數(shù)目的轉(zhuǎn)換和算術(shù)。?具體而言,對于低度多項式,前者可能更好。

概念實施證明

沒有聯(lián)網(wǎng)的概念證明實現(xiàn)可用于實驗和可重復(fù)性。?該代碼目前仍在進行中,目前支持從加密特征中訓(xùn)練新的分類器,但不支持對加密圖像進行特征提取。?換句話說,它假定輸入提供者本身通過特征提取層運行他們的圖像,并以加密的形式將結(jié)果發(fā)送給服務(wù)器;?因此,該部分模型的權(quán)重目前不保密。?未來的版本將解決這個問題,并允許通過使特征層也可以在加密的數(shù)據(jù)上運行來直接從圖像中進行訓(xùn)練和預(yù)測。

from pond.nn import Sequential , Dense , Sigmoid , Dropout , Reveal , Softmax , CrossEntropy from pond.tensor import PrivateEncodedTensor classifier = Sequential ([ Dense ( 128 , 6272 ), Sigmoid (), Dropout ( . 5 ), Dense ( 5 , 128 ), Reveal (), Softmax () ]) classifier . initialize () classifier . fit ( PrivateEncodedTensor ( x_train_features ), PrivateEncodedTensor ( y_train ), loss = CrossEntropy (), epochs = 3 )

該代碼被分成幾個Python筆記本,并附帶一組預(yù)計算權(quán)重,允許跳過一些步驟:

  • 第一個涉及使用Keras?對公共數(shù)據(jù)進行預(yù)訓(xùn)練?,并產(chǎn)生用于特征提取的模型。?可以通過使用存儲庫的預(yù)計算權(quán)重來跳過此步驟。

  • 第二個應(yīng)用上述模型對私人數(shù)據(jù)進行特征提取?,從而產(chǎn)生用于訓(xùn)練新加密分類器的特征。?在未來的版本中,這將通過首先對數(shù)據(jù)進行加密來完成。?由于提取的數(shù)據(jù)太大,此步驟不能跳過。

  • 第三個提取提取的特征并訓(xùn)練一個新的加密分類器?。?這是迄今為止最昂貴的一步,可以通過使用存儲庫的預(yù)計算權(quán)重來跳過。

  • 最后,第四個筆記本使用新分類器從新圖像執(zhí)行加密預(yù)測?。?目前,特征提取仍然是未加密的。

運行代碼是克隆存儲庫的問題

$ git clone https://github.com/mortendahl/privateml.git && \ cd privateml/image-analysis/

安裝依賴關(guān)系

$ pip3 install jupyter numpy tensorflow keras h5py

啟動一個筆記本

$ jupyter notebook

并導(dǎo)航到上述四個筆記本中的任意一個。

思考

與往常一樣,當(dāng)以前的想法和問題得到解答時,已經(jīng)有一批新的等待。

廣義三元組

當(dāng)試圖減少交流時,人們也可能想知道能夠以預(yù)先處理階段的形式增加多少種三元組。

正如我們多次提到的那樣(并且在例如BCG + '17中提出的建議),我們通常試圖確保每個私人價值只被發(fā)送一次。?所以如果我們例如計算dot(x, y)和dot(x, z)那么有一個三元組(r, s, t, u, v)可能是有意義(r, s, t, u, v)其中r用于掩蔽x,?s到掩碼y?,?u屏蔽z?,?t和u用于計算結(jié)果。?例如,訓(xùn)練期間會發(fā)生此模式,在正向傳球期間計算的值有時會在后向傳球中緩存并重新使用。

也許更重要的是,當(dāng)我們只用模型進行預(yù)測時,即用固定的私人權(quán)重進行計算。?在這種情況下,我們只想掩蓋一次權(quán)重,然后對每個預(yù)測重用這些權(quán)重?。?這樣做意味著我們只需按照流經(jīng)模型的輸入張量按比例地進行屏蔽和通信,而不是像輸入張量和權(quán)重那樣輸入張量,就像JVC'18那樣?。?更一般地說,我們理想地希望僅根據(jù)改變的價值進行溝通,這可以通過使用量身定制的三元組來實現(xiàn)(按攤銷意義)。

最后,原則上也可以使用三元組來實現(xiàn)更高級的功能,例如通過一輪通信評估密集層及其激活功能,但這里的大障礙似乎是三重存儲和數(shù)量的可擴展性重組步驟所需的計算,特別是在使用張量時。

激活功能

一個自然的問題是其他典型激活函數(shù)中的哪一個在加密設(shè)置中是有效的。?如上所述,?SecureML通過臨時切換到亂碼電路來使用ReLU,并且CryptoDL給出Sigmoid,ReLU和Tanh的低階多項式近似(使用切比雪夫多項式以獲得更好的精度?)。

考慮非典型但更簡單的激活函數(shù)也是有意義的,例如像CryptoNets中的平方,如果除了簡化計算和通信之外別無其他。

亂碼電路

盡管上面提到的僅僅是作為安全評估更高級激活函數(shù)的一種方式,但實際上也可以將亂碼?電路用于更大的部分,包括作為安全計算的主要手段,例如DeepSecure?。

與例如SPDZ相比,此技術(shù)具有僅使用恒定數(shù)量的通信回合的優(yōu)點。?缺點是操作現(xiàn)在經(jīng)常發(fā)生在位而不是更大的場元素上,這意味著涉及更多的計算。

精確

圍繞聯(lián)邦學(xué)習(xí)的許多研究涉及梯度壓縮,以節(jié)省通信成本。更接近我們的設(shè)置,我們有BMMP'17,它使用量化將同態(tài)加密應(yīng)用于深度學(xué)習(xí),甚至未加密的?生產(chǎn)就緒系統(tǒng)通常將此技術(shù)視為提高學(xué)習(xí)性能的一種方式

浮點運算

上面我們使用了實數(shù)的固定點編碼到場元素中,但未加密的深度學(xué)習(xí)通常使用浮點編碼。ABZS'12SPDZ?的參考實現(xiàn)所示,也可以在加密設(shè)置中使用后者,顯然具有某些操作的性能優(yōu)勢。

圖形處理器

由于深度學(xué)習(xí)通常是出于性能原因在GPU上完成的,因此考慮是否可以通過將其應(yīng)用于MPC計算來實現(xiàn)類似的加速是自然的。有些工作,關(guān)于這個主題的亂碼電路存在的,但它似乎如SPDZ的秘密共享設(shè)置不太受歡迎。

這里最大的問題可能是GPU上的任意精度算法的成熟度和可用性(但參見例如這個那個),對于大于例如64位的字段元素的計算需要。盡管這里有兩件事值得記住:首先,雖然我們計算的值大于本機支持的值,但它們?nèi)匀皇苣?shù)限制;?其次,我們可以通過一個環(huán)而不是一個字段來進行安全的計算。

https://mortendahl.github.io/2017/09/19/private-image-analysis-with-mpc/

總結(jié)

以上是生活随笔為你收集整理的【译】Private Image Analysis with MPC Training CNNs on Sensitive Data的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。