謝四江 許世聰 章 樂
1(西安電子科技大學 陜西 西安 710071)2(北京電子科技學院 北京 100070)
隨著云技術的不斷發展,多種形式的云服務不斷涌現。同時,機器學習在人工智能熱潮下,受到了諸多研究人員的廣泛關注。云服務和機器學習在這種背景下也被巧妙地結合起來,形成了一種機器學習即服務(Machine Learning as a Service, MLaaS)的新型云服務,即機器學習在云資源提供商的基礎設施上運行。云機器學習允許在云服務器上訓練和部署模型。模型部署后,用戶可以使用這些模型進行預測任務。MLaaS適用于醫療、金融、商業等多領域。在醫療領域,它可以為用戶提供醫療診斷;在金融領域,它可以為用戶分析信貸資料以及在商業領域為用戶提供一些商業決策。雖然MLaaS帶來了諸多好處,但是也暴露出很嚴重的問題,即用戶數據的安全性和隱私性得不到保障。在一般情況下,機器學習模型訓練結束,并進行部署,用戶就可以利用模型進行預測任務。然而用戶傳入的預測樣本往往是原始數據,這就會產生潛在的安全和隱私風險。特別是進行醫療診斷預測時,用戶傳入的是個人隱私醫療數據。這些數據一旦泄露,對用戶會造成很多困擾。如何充分利用MLaaS又能比較好地保護用戶隱私就成了亟待解決的問題。
同態加密為這一問題提供了解決方案。同態加密最初由Rivest等[1]在保密數據庫場景下提出,它作為一種加密數據的方式,在不對密文解密的情況下,也可以對其進行某些操作。Gentry等[2]第一個提出了基于理想格的全同態加密方案,起到了突破性的作用。全同態是指在該方案下允許對加密數據執行任意多次操作。Bos等[3]引入中國剩余定理提出了一種處理大數的同態加密方案,它將密文擴展到幾個環元素來分開加密,從而解決了輸入數據過大的問題。全同態加密方案具有很好的計算特性,但是也帶來了計算緩慢的問題,在實際較大計算任務中暫時還無法使用?,F在主要使用微同態加密方案(SomeWhat Homomorphic Encryption, SWHE)來解決實際問題,即限制了一些計算的同態加密方案,如只能進行限定次數的密文乘法。
許多研究人員開始著手解決MLaaS中的安全和隱私問題。其中一個重要方法就是將同態加密和機器學習結合起來。目前許多工作都集中在更簡單的模型上,如Graepel等[4]利用層級同態加密方案訓練了兩個線性二分類模型——線性均值和Fisher線性判別器——保持了訓練和測試數據的機密性。Kim等[5]提出了關于加密數據的邏輯回歸模型訓練方法,使用的加密庫是該團隊開發的HEAAN,在同態加密的數據集上,獲得訓練模型需要116分鐘,并且取得了較好的準確率和性能。處理Sigmoid函數的方法是使用高階的泰勒公式。Dowlin等[6]改造一個已經訓練好的邏輯回歸模型,將用FV同態加密方案加密的個人生物信息數據傳入改造模型,得到是否患糖尿病的預測。原始模型激活函數是Sigmoid函數,改造模型將Sigmoid函數處理為在x=0附近展開的7階泰勒級數,使用的同態加密方案支持庫是SEAL,并且對比了給定不同加密參數的用時情況。Cheon等[7]和Giacomelli等[8]也分別提出了隱私保護邏輯回歸和隱私保護嶺回歸方案。在隱私保護下神經網絡方面,Dowlin等[9]使用MNIST數據集訓練了一個卷積神經網絡模型CryptoNets,他們的研究分為訓練和預測兩個階段,在訓練階段為9層,預測階段對網絡層進行了整合和去除,分為5層。為了滿足同態加密計算特性,激勵層使用平方函數,并且使用特殊的加和池化(即滑動窗口中的像素值的加和作為該窗口的結果值)。CryptoNets也借助了SEAL,該庫的早期同態加密方案是YASHE, CryptoNets也正是使用的YASHE方案。使用了中國剩余定理處理大數以及批量化處理。在考慮ReLU和Sigmoid非線性函數和同態計算特性的矛盾時,往往采用多項式來替換非線性函數,以保證同態計算特性。CryptoNets作為引入同態加密的隱私保護神經網絡方案的領頭羊研究,Chabanne等[10]為了擴展到更深層的網絡架構,提出了使用多項式逼近激勵函數結合批量歸一化(Batch Normalization,BN)的處理方法,并分析了層輸出穩定性。然而,他們在研究中僅進行了明文實驗,雖然分析了乘法深度帶來的影響,但是沒有給出密文實驗的相關結果。Hesamifard等[11]引入了一種新的多項式逼近激勵函數方法,結合批量歸一化,并在密文上進行了實驗,使用的同態加密庫是IBM的HELib。還有相關研究關注點在于結合安全多方計算解決隱私保護神經網絡問題[12-13],它們的解決途徑包括混淆電路、秘密共享和茫然傳輸等。
在邏輯回歸和神經網絡中,最常見的連接方式為全連接方式,這種方式滿足同態特性,在同態加密機器學習中尤為常見。然而全連接方式也會產生大量的模型參數,在同態加密情況下,計算變得比較繁雜。本文提出了一種同態加密下的卷積神經網絡(Convolutional Neural Network, CNN)前向計算方法,并結合在實數下表現良好的全局平均池化層(Global Average Pooling, GAP)[14],提出了同態加密下的全局平均池化層,大幅度減少模型參數,從而加快了加密預測的預處理過程。在加密預測方面,該方法用準確率的微小下降換取了預測響應時間的大幅度減少。
全連接神經網絡主要的局限性在于像素比較大的情況下,隱藏層之間會有大量的待訓練參數,而且不便于處理高維數據。卷積神經網絡的出現解決了參數過多的問題,特別是圖像處理方面性能顯著。卷積神經網絡主要依賴于參數共享,核心是卷積操作和池化操作。在實際使用中,一般經過若干卷積層、激勵層、池化層組合,再將特征進行拉伸操作作為全連接層的輸入向量,經過全連接層處理后獲得輸出。經典的LeNet[15]和上述的CryptoNets都是采用這種處理方式。為了便于說明,本文所提到的卷積核和池化窗口的高和寬相等,在高和寬方向上的滑動步長也相等。
(1) 卷積操作。卷積操作是將卷積核和對應輸入中的矩陣數據逐個對應相乘,再加和。卷積操作中還有三個重要的單元(卷積核大小、步長和卷積核個數)以及兩種補零(padding)方式,即同卷積方式(SAME)和窄卷積方式(VALID)。
卷積核大小一般包括三個維度C×F×F,C表示卷積核對應輸入的通道數,F表示卷積核的高和寬。
步長一般包括兩個維度S×S,S表示在高和寬方向上卷積核的滑動距離。
卷積核個數一般僅包括一個維度N,N決定了輸入經過該卷積層后,輸出的通道數大小。
補零方式決定了輸出的高和寬的大小。VALID不需要在輸入圖像周圍進行補零,輸出的高和寬與卷積核有關系。SAME在計算前需要在輸入圖像周圍進行補零,輸出的高和寬與卷積核沒有關系。兩種方式輸出的高和寬對應公式及相應補零規則分別如下:
(1)
式中:I表示輸入圖像的高(寬),O表示輸出圖像的高(寬),F表示卷積核的高(寬),S表示步長,·表示向上取整函數。
(2)
式中:I表示輸入圖像的高(寬),O表示輸出圖像的高(寬),F表示卷積核的高(寬),S表示步長,P表示輸入圖像高(寬)需要補零的行(列)數,Pt、Pb、Pl、Pr分別表示上下左右需要補零的具體行(列)數,表示向上取整函數,max{·,·}表示取最大值函數,[·]表示取整函數。
(2) 池化操作。池化操作一般是兩種方式,即最大值池化和平均值池化。二者區別在于對池化窗口中值的處理方式。池化操作中具有兩個重要的參數(池化窗口大小,步長)以及兩種補零(padding)方式,基本性質相同于卷積操作。最大值池化即對池化窗口中的值取最大值,平均值池化即對池化窗口中的值取平均值。
對數據進行加密是保護數據安全和隱私的有效途徑。一般的加密方案關注的是數據存儲安全,只能對加密結果進行存儲和傳輸,但是不能對其進行運算操作。而同態加密主要關注的是數據處理安全,它可以對加密數據進行運算操作的加密方案。
同態相關數學定義如下:


(3)

(4)

(5)

(6)

同態加密下CNN前向傳播計算主要是為了使同態加密下的圖像能夠通過前向傳播計算而得到加密的預測結果。加密預測示意圖如圖1所示。

圖1 加密預測示意圖

(1) 卷積層。加密域下卷積層輸入圖像是密文圖像,卷積核對應的權重是預處理編碼后的明文。卷積層輸出大小同樣依賴于VALID和SAME方式,高和寬計算方法也同實數網絡對應的卷積層相同。輸出通道數根據卷積核的個數。下式描述了卷積核作用在輸入圖像對應的一個密文輸出:
(7)
式中:outputD表示卷積核作用區域D的輸出,對應輸出圖像的一個密文像素點,P[wi]表示卷積核作用區域上i的權重明文編碼,Epk[vi]表示輸入圖像對應卷積核上i的像素點密文值,vi表示圖像像素點的明文值,這里只是為了形象表示,不需要考慮vi具體是多少,僅僅關注密文本身即可,?表示密文和明文乘法,∑·表示密文加法。
(2) 池化層。通常情況下池化層一般是最大值池化層和平均值池化層,然而也存在特殊池化層,如CryptoNets中的加和池化層。在加密域情況下,對于每個池化窗口中的像素值都是密文。令D為池化窗口區域,區域內有n個像素點,Epk[vi]表示窗口中的像素值的密文,outputD記作該區域的輸出值。
加密域下最大值池化層方案不可行,事實上:
(8)

為了保持卷積神經網絡的普遍性,加密域下池化操作選擇常用的平均值池化,數學描述為:
(9)
式中:數值1/n不能直接與密文和直接相乘;需要通過編碼成明文后才能進行乘法操作,P[·]表示對· 進行編碼操作,?表示密文和明文乘法,∑·表示密文加法。式(9)表明平均池化滿足同態計算特性,運算僅包括密文加法與密文和明文乘法。
(3) 激勵層。激勵層一般使用ReLU、Sigmoid和Tanh作為激勵函數,然而這些函數不滿足同態特性。為了保證密文域下數據流的正常運算,需要對這些激勵函數進行改進。處理方法可以通過函數逼近上述激勵函數,使用逼近多項式作為激勵函數。CryptoNets在訓練階段就沒有選擇上述三種常見的激勵函數,而使用了平方函數。為了便于和CryptoNets比較計算時延,激勵函數也選擇平方函數。
(4) 全局平均池化層。本文方法不再使用全連接層接在卷積層、激勵層和池化層的組合之后,而是使用全局平均池化層作為全連接層的替代。全局平均池化層計算方法和池化層相同。全局平均池化層的思想在于最后獲得的若干通道的數據均值對應分類輸出向量。使用全局平均池化層可以大幅度減少模型的訓練參數,并且獲得較好地準確率。
訓練階段網絡層分為9層,神經網絡示意圖如圖2所示。

圖2 訓練階段神經網絡結構示意圖
(1) 卷積層——卷積核大小為1×5×5,步長為2,卷積核個數為5,VALID方式,輸入大小為1×28×28,輸出大小為5×13×13。
(2) 激勵層——使用平方函數。
(3) 平均池化層——池化窗口大小為3×3,步長為2,SAME方式,輸入大小為5×13×13,輸出大小為5×13×13。
(4) 卷積層——卷積核大小為5×5×5,步長為2,卷積核個數為50,VALID方式,輸入大小為5×13×13,輸出大小為50×5×5。
(5) 平均池化層——池化窗口大小為3×3,步長為2,SAME方式,輸入大小為50×5×5,輸出大小為50×5×5。
(6) 卷積層——卷積核大小為50×3×3,步長為2,卷積核個數為10,VALID方式,輸入大小為50×5×5,輸出大小為10×2×2。
(7) 激勵層——使用平方函數。
(8) 全局平均池化層(GAP)——每個通道大小為2×2,每個通道的全局平均值作為該通道的輸出值。輸入大小為10×2×2,輸出大小為10×1。
(9) Softmax層——該層主要便于誤差的反向傳播。
CryptoNets將激勵層作為分割層,并去除了不影響加密預測結果的最后一層,預測階段CryptoNets重新分為5層。為了便于分析與比較,也將預測階段將網絡分為5個部分:
(1) 卷積層,記為Ⅰ——同訓練階段第1層。
(2) 激勵層,記為Ⅱ——同訓練階段第2層。
(3) 線性層,記為Ⅲ——同訓練階段第3~6層。
(4) 激勵層,記為Ⅳ——同訓練階段第7層。
(5) GAP層,記為Ⅴ——同訓練階段第8層。
訓練階段第9層Softmax層是單調遞增的,不會改變輸出向量最大值索引,在預測階段不再考慮。
實驗數據為MNIST數據集,包括70 000幅手寫數字圖片,每幅圖片為28×28像素,每個像素點值范圍[0, 255]。其中55 000幅是訓練樣本,5 000幅是驗證樣本,剩余10 000幅是測試樣本。由該數據集獲得模型參數。
預測階段的同態加密下的前向傳播需要利用這些經過編碼處理后的模型參數。預測階段的輸入是對MNIST數據集測試樣本的像素點值進行同態加密后的密文圖像。
實驗主要分為兩個階段,模型訓練階段和密文預測階段。模型訓練階段主要是為了獲得模型參數,為密文預測階段的前向傳播提供數據。模型訓練階段使用Python語言借助Tensorflow和Numpy可以高效快速地完成模型的訓練和測試,并保存模型參數。在密文預測階段,選擇C++語言,SEAL庫在同態加密運算上提供支持,運行時間的統計依賴于Chrono庫。具體的環境說明如表1所示。

表1 實驗運行環境
(1) 準確率。準確率比較如表2所示。

表2 準確率比較
本文利用GAP替換全連接層的方法,在準確率方面略微低于CryptoNets。
(2) 預測時間。由于同態加密中加密參數不同會對預測時間有影像,特別選取了兩組加密參數測量時間。
第一組:n=8 192,t1=1 099 511 922 689,t2=1 099 512 004 609,q=2383-233+1。
這里t1·t2>280,q<2384,則密文多項式對應的每個系數需要48 bytes。n=8 192,該預測網絡可以接受的批量大小也為8 192,則計時是以一批大小為8 192的測試數據作為基準的。如表3所示,第一組參數下,本文方法對應各層的加密預測時間合計472.8 s,而CryptoNets加密預測時間為570 s,效果對比如表4所示。

表3 第一組加密參數下本文方法各層運行時間

表4 第一組參數下預測計算時間對比
第二組:n=4 096,t1=40 961,t2=65 537,t3=114 689,t4=147 457,t5=188 417,q1=2191-2 589 751,q2=2191-491 527,q3=2191-2 232 751,q4=2191-2 309 565,q1=2191-15 131 401。
這里t1·t2·t3·t4·t5>280,q<2192,則密文多項式對應的每個系數需要24 bytes。n=4 096,該預測網絡可以接受的批量大小也為4 096,計時是以一批大小為4 096的測試數據作為基準的。如表5所示,第二組參數下,本文方法各層的加密預測時間合計189.38 s,而CryptoNets加密預測時間為249.6 s,效果對比如表6所示。

表5 第二組加密參數下本文方法對應各層運行時間

表6 第二組參數下預測計算時間對比
(3) 模型參數分析。在CryptoNets中,第一個全連接層待訓練參數個數為100×1 250=125 000,第二個全連接層待訓練參數個數為10×100=1 000,合計訓練參數個數為126 000。而使用GAP后僅需要待訓練參數個數為50×3×3×10=4 500,大大減少了模型參數,簡化了參數預處理編碼。在同態計算過程中,除了密文和密文乘法外,較為花費時間的是密文和明文乘法。CryptoNets中需要126 000次密文和明文相乘,而使用GAP后僅需要18 000次。
在分類準確率下降較小的情況下,使用GAP可以較好地解決全連接層計算緩慢的問題,在響應時間上獲得了較好的提升。GAP大大減少了模型參數數量,簡化了對模型參數的處理。
本文將同態加密和卷積神經網絡中全局平均池化相結合,提出了加密域下全局平均池化層的前向傳播方法。該方法可以在降低較少分類準確率的前提下,大幅度減少加密域下全連接層帶來的計算時延,同時減少相關參數數量及服務器預處理參數編碼的時間。接下來的研究方向是增強方法的魯棒性以應對更加復雜的神經網絡以及加密待處理數據。