TENSEAL: A LIBRARY FOR ENCRYPTED TENSOR OP- ERATIONS USING HOMOMORPHIC ENCRYPTION 解讀

本文記錄閱讀該paper的筆記,這篇論文是TenSeal庫的原理介紹。

摘要

機器學習算法已經取得了顯著的效果,並被廣泛應用於各個領域。這些算法通常依賴於敏感和私有數據,如醫療和財務記錄。因此,進一步關注隱私威脅和應用於機器學習模型的相應防禦技術至關重要。在本文中,我們介紹了TenSEAL,這是一個使用同態加密保護隱私數據的機器學習開源庫,可以輕鬆地集成到流行的機器學習框架(PyTorch 或 Tensorflow)中。我們使用MNIST數據集對我們的實現進行了benchmark測試,結果顯示加密的卷積神經網絡可以在不到一秒鐘的時間內進行計算,通信量不到1/2MB。

介紹

近年來,機器學習狂奔發展。在典型場景中,用戶需要將數據發送給服務提供商,服務提供商將對數據執行一些計算並返回結果。

這種方法有兩個關鍵問題。首先,出於隱私考慮,用戶可能不想將其數據發送給服務提供商。其次,如果用戶不向服務提供商發送數據,那服務提供商就無法向用戶提供模型。使用同態加密,可以解決該問題,用戶的數據將始終加密,服務提供商將看不到輸入和輸出,並且仍然可以對這些加密數據進行計算。

然而,在機器學習中採用同態加密的速度很慢。問題一:雖然目前可用的密碼庫爲密碼學家提供了一個優秀的API,但它們可能會對數據科學家使用就不方便了(觸及密碼專業知識)。問題二:是計算成本,包括通信和計算成本。

本文工作

提供了一個靈活的開源庫,使用同態加密進行張量計算(tensor computation)。該庫可以直接將當前流行機器學習框架(如PyTorch或Tensorflow)中的張量轉換爲加密所支持的明文形式。

對於本文的其餘部分,第2節中描述該庫的體系結構。然後在第3節,詳細介紹了在加密空間中計算卷積神經網絡所需的算法。在第5節中對我們的庫進行了實驗性測試,並在第6節總結了我們工作的一些侷限性。

文章結構

TenSEAL是一個連接經典機器學習框架和同態加密功能的庫。它實現了在加密數據上進行張量計算。TenSEAL依賴於Microsoft SEAL庫。客戶端可以計算明文或加密的張量(支持C++或Python)。在客戶機-服務器場景中,消息交換是使用協議緩衝區完成的。核心API主要組件構建:環境(context)、明文張量(PlainTensor)和密文張量(Encrypted Tensor)計算。

環境(context)

TenSEAL的context是庫的核心組件,它生成並存儲密鑰(用於解密的私鑰、用於加密的公鑰、用於旋轉的伽羅瓦密鑰以及用於密文重新線性化的重新線性化密鑰)。這個對象還將處理線程池,線程池控制在執行可並行化操作時應並行運行的作業數。另外在context中可以設置自動密文重新線性化(relinearization)和重新縮放(rescaling )。

明文張量(PlainTensor)

張量(Tensor)

Tensor是深度學習中廣泛使用的數據結構,本質上就是一個高維的矩陣,甚至將其理解爲NumPy中array,Pandas中的DataFrame。

單個元素叫標量(scalar),一個序列叫向量(vector),多個序列組成的平面叫矩陣(matrix),多個平面組成的立方體叫張量(tensor)。在深度學習的範疇內,標量、向量和矩陣都統稱爲張量。
image

參考:
1、PyTorch學習系列教程:何爲Tensor?

image
該圖顯示了密文張量的構建,PlainTensor封裝了當前流行框架中的張量表示,並用EncryptedTensor接口的輸入。

PlainTensor是一個將未加密的張量連接到加密實現的類。
image
這顯示了張量的關係。EncryptedTensor接口派生爲BFVVector、CKKVector或CKKSTensor類。

密文張量(Encrypted Tensor)

EncryptedSensor接口提供了一個API,該API需要由庫公開的每個張量來實現。接口有一個TenSEALContext對象,這是進行任何同態計算所必需的。派生類公開了不同的張量風格,例如:

  • CKKSVector派生EncryptedVector接口,可以將實數向量加密爲單個密文。
  • CKKSTensor將的N維實數張量加密爲的N維密文張量。然而,在對密文批處理時,需要一個軸(axis),因此只需要(N-1)維密文張量。

方法

在同態加密方案上構建張量時,需要解決兩個重要問題:
1,如何在加密之前對張量進行編碼?
2、使用特定編碼時可以執行哪些操作?

CKKS方案的批處理功能允許將N×N矩陣加密爲N維密文向量,每行或每列作爲一個密文。另一種可能性是將整個張量(N×N矩陣)加密爲一個密文【paper:Secure outsourced matrix compu- tation and application to neural networks】。根據我們如何將明文張量放入密文中,我們可以用執行不同的操作(不同的複雜度)。目標是使用最小數量的密文,並以最小的運行時間獲得最大的深度,從而優化內存和計算。爲了實現這一理想目標,我們發現可以將輸入圖像進行加密爲單個密文,並在卷積神經網絡上對其進行計算。這需要客戶端上的預處理步驟將圖像編碼爲矩陣,由卷積窗口作爲行組成,然後通過垂直掃描將其展平爲向量。在TenSEAL中,所有這些功能都是圍繞CKKSVector實現的。CKKSVector包含N/2個實數,其中N是模多項式的次數。我們可以使用其他密文或者明文向量執行逐元素計算(加法、減法和乘法)。我們有一種計算加密向量次冪的方法,該方法使用最佳電路,從而使用最小乘法深度。此外,由於我們需要近似計算多項式,對於不同的激活函數,我們構建了一種以加密向量爲變量的多項式求值的方法,確保使用最小電路。除了元素操作之外,我們還需要矩陣操作來執行機器學習任務。我們實現了密文向量乘明文矩陣【paper:Algorithms in helib】,它可以使用多線程來更快地運行。下面是該庫的密文張量支持的操作:
image

點積(dot product)

該庫爲點積提供計算方法【類似:Algorithms in helib】,但支持的向量大小不是2的冪,或者不能填充密文的所有插槽。前一種方法中的這種限制是由於向右旋轉(希望最後一個元素是第一個元素),這對於我們所處理的情況來說是不正確的。如果向量大小不是2的冪,我們的方法僅限於特定數量的點積。然而,由於方案允許的乘法次數可能較低,因此通常無法達到此限制。所以通過儘可能多次將輸入向量複製到密文槽中,並且在計算過程中只有密文左旋轉,該方法和【Algorithms in helib】有相同的算法複雜性。我們使用【CKKS17】中的方法實現了密文向量與明文矩陣之間的點積。因此,它可以擴展到支持密文矩陣與明文矩陣之間的點積(矩陣乘法)。下圖顯示瞭如何在加密向量和普通矩陣之間執行點積:
image

2維卷積

卷積

卷積是一種數學運算,對兩個函數(信號)的乘積進行積分,其中一個信號翻轉。
下面我們將兩個信號卷積\(x =(0,1,2,3,4),w =(1,-1,2)\)
(1)首先是將W水平翻轉(或向左旋轉180度)
image
(2)需要將翻轉的W滑過輸入X:
image
其中,在步驟3、4、5上,翻轉的窗口完全位於輸入信號內。 這些結果稱爲“有效”卷積。 如果翻轉的窗口未完全位於輸入窗口(X)內,則可以考慮爲零,或計算可能計算出的值,例如 在第1步中,我們將1乘以零,其餘的將被忽略。
image

參考:
1、深度 | 理解深度學習中的卷積

2D convolution

二維卷積可以使用單個矩陣乘法來執行,而不是在每個窗口上重複乘法。這種方法稱爲圖像塊到列的卷積( image block to column),或圖像到列的卷積(image to column)。下圖顯示瞭如何使用此方法執行卷積。它首先將輸入矩陣重新組織成表示卷積窗口的行,然後用flattened kernel執行點積。
image

將此技術應用於加密矩陣(加密爲一個密文)並不是一件小事,因爲重新組織slot並不簡單。我們需要在加密之前將矩陣重新組織爲預處理步驟,以便爲卷積做好準備。明文向量(kernel)和密文矩陣(輸入圖像)的計算可以通過逐元素乘法和一系列旋轉和累加來執行。下圖顯示了執行此操作的步驟。第一個顯示了密文矩陣(彩色)是如何編碼並與明文向量(kernel)相乘的。第二步是對向左旋轉不同的不同版本的輸出求和。
image

image

TenSEAL還支持計算卷積,即提供當前流行的機器學習框架(例如PyTorch)計算卷積的類似實現。我們將圖像塊應用於Columns (im2col)【paper:Cnns in practice】,將卷積層轉換爲單個矩陣乘法運算。這種技術需要密文矩陣乘明文向量,我們通過複製的明文向量和轉置的矩陣逐元素向乘來實現。最後,將結果旋轉並累加到單個密文向量中。

此操作僅使用一個乘法運算和\(log2(N)\)個旋轉和加法,其中N表示矩陣中的行數。下面解釋瞭如何將“圖像塊-》列”算法應用於加密輸入。需要注意的是,轉換髮生在明文數據中,轉換後的輸入圖像進行編碼和加密爲單個密文。這直接意味着堆疊兩個卷積是不可能的,因爲重新組織密文的slot並不簡單。

相關工作

近年來,一些研究工作已經使同態加密方案在機器學習中實用化。【paper:Cryptonets: Applying neural networks to encrypted data with high throughput and accuracy】實現了CryptoNets,一種使用YASHE(一種Leveled-FHE方案)【paper:Improved security for a ring-based fully homomorphic encryption scheme】具有高效的簡單加法和乘法算法,適用於對密文數據進行推理的神經網絡。然而,該框架需要大批量才能實現良好的攤銷性能,這使得它對於計算單個實例不太實用。

【paper:ngraph-he: a graph compiler for deep learning on homomorphically encrypted data】在實現不同的優化層時,使用了類似的張量結構(CryptoNets)。他們對於HE應用程序shying了特別的圖形級優化,這減少了乘法深度對於計算操作(比如批處理和平均池(average pooling))。。。。

所有工作都使用MNIST數據集進行benchmarked測試,但硬件配置不同。下表1中總結了相應論文中報告的實證結果。
image

測試

爲了測試我們的庫和技術,我們實現了一個由以下部分組成的神經網絡:卷積層(4個7x7的內核,步長爲3x3)、線性層(輸入:256,輸出:64)和最終線性層(輸入:64,輸出:10)。除最後一層外,我們在每一層後使用平方激活函數。卷積是使用我們的圖像-》列實現完成的,而線性層使用點積實現。明文測試集的準確率爲97.7%,而密文測試集的準確率爲97.4%。我們使用了CKKSVector實現,它使用CKKS方案。知道我們需要6次乘法計算和128位的安全級別,我們將模多項式的級數(N)設置爲8192,係數模數爲206位,縮放因子(scale)爲21位。測試是在Ubuntu服務器20.04和Python 3.8上使用AWS c4完成的。2xlarge(8個VCPU)和AWS c4。4XL(16個VCPU)配置。測試的持續時間是5輪測試的平均值,每輪10次迭代。下表包含了在從MNIST數據集採樣的加密圖像上計算神經網絡的完整細分。
image

上表是測試MNIST計算的完整說明,持續時間以毫秒錶示。我們使用兩種設置來測試這些方法:Amazon c4。2xlarge實例(8個VCPU,15個GiB內存)和Amazon c4。4xlarge實例(16個VCPU,30 GiB內存),強調該庫並行性優秀。

結果表明,該庫大量實現並行,在網絡通信方面具有很強的競爭力,只需427KB的通信即可發送加密的輸入和接收加密的輸出。同時,TenSEAL沒有強行定義批處理的大小(batch size),這使得它非常實用。完整的benchmarks測試是開源的,其結果下面展示。
image

顯示了不同算術運算的平均性能。具體來說一元操作的持續時間(毫秒)。CKKS的context是由模多項式的級數8192和係數模數200位創建的。polyval benchmark是針對\(2X^2+X\)執行的。

image
顯示了矩陣乘法的平均性能。具體來說,二元操作的持續時間(毫秒)。CKKS的context是由模多項式級數8192和係數模數200位創建的。對於“明文”操作,操作數是shape相同的明文張量。對於其餘部分,操作數是shape相同的密文張量。

不足和總結

加密部分依賴於【paper:CKKS17】,這是Leveled-FHE方案。這意味着,根據我們的參數選擇,我們可以對密文數據執行的乘法數量是有限的,這直接影響我們可以使用的機器學習模型或其深度。不同的機器學習模型也使用非線性激勵函數,在CKKS的情況下,需要使用近似多項式計算)。最近的一項工作【paper:New challenges for fully homomorphic encryption】一直試圖通過使用TFHE方案【paper:Tfhe: fast fully homo- morphic encryption over the torus】來解決與機器學習密切相關的這個問題,該方案允許評估更深層次的模型以及非線性激活函數。

最後,我們的結果表明,利用CKKS方案進行張量計算是可行的。根據使用情況,用戶可以選擇高級張量操作(slicing、broadcasting)或使用更多計算通信優化實現。TenSEAL可以適應這兩種情況,同時提供從傳統機器學習框架的平穩過渡。最後,我們試圖擴展tensor operations catalog,並進一步提高整體性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章