隱私保護(hù)是機(jī)器學(xué)習(xí)領(lǐng)域的重要倫理問題之一,而差分隱私(DP)是行之有效的隱私保護(hù)手段。那么,如何方便地使用差分隱私來訓(xùn)練機(jī)器學(xué)習(xí)模型呢?近日,Facebook 開源了 Opacus 庫,支持以這種方式訓(xùn)練 PyTorch 模型。
近日,F(xiàn)acebook 開源了一個新型庫 Opacus,它支持使用差分隱私來訓(xùn)練 PyTorch 模型,擴(kuò)展性優(yōu)于目前的 SOTA 方法。同時,Opacus 庫支持以最少代碼更改來訓(xùn)練模型,且不會影響訓(xùn)練性能,并允許在線跟蹤任意給定時刻的隱私預(yù)算。
Opacus 庫開源地址:https://github.com/pytorch/opacus
Opacus 庫的目標(biāo)受眾主要為以下兩類人群:
機(jī)器學(xué)習(xí)從業(yè)者:可以使用該庫輕松了解如何利用差分隱私訓(xùn)練模型,該庫支持以最少代碼更改來訓(xùn)練模型;
差分隱私科學(xué)家:Opacus 庫易于實驗和修復(fù),這允許他們專注于更重要的事。
差分隱私是一個具備數(shù)學(xué)嚴(yán)謹(jǐn)性的框架,可用于量化敏感數(shù)據(jù)的匿名化。Facebook 在相關(guān)博客中表示,希望 Opacus 庫能為研究人員和工程師提供一條更簡單的途徑,以便在 ML 中使用差分隱私,并加快該領(lǐng)域的 DP 研究。
Opacus 庫提供了什么?
通過這個開源的高速庫 Opacus,你可以得到:
速度:利用 PyTorch 中的 Autograd hook,Opacus 能夠批量化計算每個樣本的梯度。與依賴 microbatching 的現(xiàn)有 DP 庫相比,Opacus 實現(xiàn)了一個數(shù)量級的加速。
安全性:Opacus 對其安全關(guān)鍵代碼使用密碼學(xué)安全偽隨機(jī)數(shù)生成器 CSPRNG,在 GPU 上對整批參數(shù)進(jìn)行高速處理。
靈活性:基于 PyTorch,工程師和研究人員可以通過將 Opacus 代碼與 PyTorch 代碼和純 Python 代碼進(jìn)行融合和匹配,快速為其 idea 構(gòu)建原型。
生產(chǎn)效率:Opacus 庫附帶教程、在訓(xùn)練開始前提示不兼容層的輔助函數(shù),以及自動重構(gòu)機(jī)制。
交互性:Opacus 可以追蹤用戶在任意給定時間所花費的隱私預(yù)算(DP 的核心數(shù)學(xué)概念),從而實現(xiàn)早停和實時監(jiān)控。
Opacus 通過引入 PrivacyEngine abstraction 定義了一個輕量級的 API,它既可以追蹤隱私預(yù)算,也能夠處理模型梯度。該 API 無需直接調(diào)用,只需將其連接至標(biāo)準(zhǔn) PyTorch 優(yōu)化器。該 API 在后臺運行,這使得利用 Opacus 進(jìn)行模型訓(xùn)練變得非常簡單。用戶只需在訓(xùn)練代碼開頭添加以下代碼即可:
model = Net()
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
privacy_engine = PrivacyEngine(
model,
batch_size=32,
sample_size=len(train_loader.dataset),
alphas=range(2,32),
noise_multiplier=1.3,
max_grad_norm=1.0,)
privacy_engine.attach(optimizer)# That's it! Now it's business as usual
訓(xùn)練結(jié)束,即得到一個標(biāo)準(zhǔn)的 PyTorch 模型,并且它沒有部署私有模型的額外步驟或障礙:如果今天就想部署模型,你可以在使用 DP 訓(xùn)練模型后進(jìn)行部署,且無需更改一行代碼。
Opacus 庫還包括預(yù)訓(xùn)練和微調(diào)模型、針對大型模型的教程,以及為隱私研究實驗而設(shè)計的基礎(chǔ)架構(gòu)。
如何使用 Opacus 實現(xiàn)高速隱私訓(xùn)練?
Opacus 旨在保留每個訓(xùn)練樣本的隱私,同時盡量不影響最終模型的準(zhǔn)確率。Opacus 通過修改標(biāo)準(zhǔn) PyTorch 優(yōu)化器來實現(xiàn)這一點,以便在訓(xùn)練過程中實現(xiàn)(和度量)差分隱私。
具體來說,Opacus 的重點是差分隱私隨機(jī)梯度下降(DP-SGD)。該算法的核心思想是:通過干預(yù)模型用來更新權(quán)重的參數(shù)梯度來保護(hù)訓(xùn)練集的隱私,而不是直接獲取數(shù)據(jù)。通過在每次迭代中向梯度添加噪聲,該庫可以防止模型記住訓(xùn)練樣本,同時還可以實現(xiàn)在 aggregate 中的學(xué)習(xí)。在訓(xùn)練過程的多個批次中,(無偏)噪聲自然會被抵消。
但是,添加噪聲需要一種微妙的平衡:噪聲過多會破壞信號,過少則無法保證隱私。為了確定合適的規(guī)模,我們需要查看梯度范數(shù)。限制每個樣本對梯度的影響非常重要,因為異常值的梯度大于大部分樣本。但是異常值的隱私也需要得到保護(hù),因為它們極有可能被模型記住。
因此,開發(fā)者計算 minibatch 中每個樣本的梯度。開發(fā)者分別對每個梯度進(jìn)行梯度裁剪,將其累積到一個梯度張量,然后再將噪聲添加其中。
基于每個樣本的計算是構(gòu)建 Opacus 的最大障礙之一。PyTorch 的典型操作是利用 Autograd 計算整個批次的梯度張量,因為這對其他機(jī)器學(xué)習(xí)用例都有意義,并且可以優(yōu)化性能。與之相比,基于每個樣本的計算顯然更具挑戰(zhàn)性。
為了克服這一困難,開發(fā)者利用 Ian Goodfellow 2015 年提出的高效技術(shù)(參見論文《EFFICIENT PER-EXAMPLE GRADIENT COMPUTATIONS》),獲取訓(xùn)練標(biāo)準(zhǔn)神經(jīng)網(wǎng)絡(luò)所需的全部梯度向量。
至于模型參數(shù),則單獨返回給定批次中每個樣本的損失梯度,整個過程如下所示:
Opacus 工作流程圖,其中計算了每個樣本的梯度。
通過在運行各層時追蹤一些中間量,Opacus 庫支持使用適合內(nèi)存的任何批量大小進(jìn)行訓(xùn)練。這使得該方法比其他替代性 micro-batch 方法快了一個數(shù)量級。
此外,Opacus 庫的安裝和使用過程也比較簡單,詳情參見 GitHub 項目。