(四) 20 行代碼實現差分私有深度學習:如何使用 PYTORCH OPACUS 庫


總結:我從可以玩的玩具代碼中學習得最好。本教程使用 PyTorch 最近發布的名為 Opacus 的庫(此處提供完整代碼示例來教授差異化私有深度學習有關差異隱私的更多信息,您可以在 Twitter 上關注@kritipraks@openminedorg

我們 OpenMined 正在與 PyTorch 團隊合作,以實現我們的共同使命,即讓保護隱私的 AI 更容易構建。我們積極支持在我們的社區中使用 Opacus 以及它與我們正在構建的工具的集成。

差分隱私是隱私保護 AI 中最重要的工具之一,因為它允許我們訓練 AI 模型,這些模型可以學習高級模式(例如如何識別癌性腫瘤),而無需記住敏感的個人數據(特定患者的獨特屬性) )。

這項技術成為主流意味着可用於對人類最重要和最敏感問題進行科學探究的訓練數據量迅速增加。

這是關於如何使用PyTorch Opacus 庫在 20 行代碼中使用差異私有隨機梯度下降優化器在 MNIST 數據集上訓練簡單 PyTorch 分類模型的分步教程

Opacus是一個庫,可以訓練具有差異隱私的 PyTorch 模型。它支持對客戶端進行最少代碼更改的培訓,對培訓性能幾乎沒有影響,並允許客戶端在線跟蹤在任何給定時刻花費的隱私預算。

這篇博文將涵蓋:

步驟 1:導入 PyTorch 和 Opacus
步驟 2:加載 MNIST 數據
步驟 3:創建 PyTorch 神經網絡分類模型和優化器
步驟 4:將差分隱私引擎附加到優化器
步驟 5:在多個時期訓練私有模型

先決知識:

1. PyTorch 中的基本深度學習(教程
2. 安裝 PyTorch
3. 安裝PyTorch Opacus


第 1 步:導入 PyTorch 和 Opacus

對於 MNIST 上的私有圖像分類,我們將需要使用 PyTorch、numpyOpacus 和 Opacus。我們需要tqdm可視化我們在訓練過程中取得的進展。

import torch from torchvision import datasets, transforms import numpy as np from opacus import PrivacyEngine from tqdm import tqdm

第 2 步:加載 MNIST 數據

我們使用 a 加載 MNIST 數據並將其DataLoader拆分為訓練和測試數據集。數據被打亂,並使用數據集的平均值 (0.1307) 和標准偏差 (0.3081) 進行歸一化。訓練集分為每批 64 張圖像,而測試集分為每批 1024 張圖像。

train_loader = torch.utils.data.DataLoader(datasets.MNIST('../mnist', train=True, download=True, transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)),]),), batch_size=64, shuffle=True, num_workers=1, pin_memory=True) test_loader = torch.utils.data.DataLoader(datasets.MNIST('../mnist', train=False, transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)),]),), batch_size=1024, shuffle=True, num_workers=1, pin_memory=True)


第 3 步:創建 PyTorch 神經網絡分類模型和優化器

現在,讓我們創建一個SequentialPyTorch 神經網絡模型,該模型從我們的 MNIST 數據集中預測圖像的標簽。我們創建了一個由 2 個卷積層組成的簡單網絡,然后是 2 個完全連接的層,穿插有多個ReLuMaxPooling層。第一層將大小的圖像(28 x 28)作為輸入。最后一層返回一個大小為 的概率向量(1 x 10),以便我們可以預測圖像代表哪個數字(從 0 到 9)。

最后,我們使用隨機梯度下降 (SGD) 優化器來改進我們的分類模型,並將學習率設置為 0.05。

model = torch.nn.Sequential(torch.nn.Conv2d(1, 16, 8, 2, padding=3), torch.nn.ReLU(), torch.nn.MaxPool2d(2, 1), torch.nn.Conv2d(16, 32, 4, 2), torch.nn.ReLU(), torch.nn.MaxPool2d(2, 1), torch.nn.Flatten(), torch.nn.Linear(32 * 4 * 4, 32), torch.nn.ReLU(), torch.nn.Linear(32, 10)) optimizer = torch.optim.SGD(model.parameters(), lr=0.05)


步驟 4:將差分隱私引擎附加到優化器

到目前為止,我們有一個常規的 PyTorch 分類模型。現在,我們想讓我們的模型差異化私有。因此,我們創建PrivacyEngine了 opacus 庫中的一個並將其附加到我們的模型中,這將使我們的模型具有不同的私密性並幫助我們跟蹤我們的隱私預算。

sample_size這里是訓練集的大小,名單alphas是在其仁義微分隱私計算不同的訂單。

noise_multiplier是高斯噪聲分布的標准偏差的比L2其所加入的函數的靈敏度。

max_grad_norm表示L2損失梯度范數的上界值

privacy_engine = PrivacyEngine(model, batch_size=64, sample_size=60000, alphas=range(2,32), noise_multiplier=1.3, max_grad_norm=1.0,) privacy_engine.attach(optimizer)


第 5 步:在多個時期訓練私有模型

最后,我們創建了一個使用差分私有 SGD 優化器訓練模型的函數。我們希望最小化交叉熵損失。

在單個訓練步驟中,我們迭代所有訓練數據批次,並使我們的模型預測數據的標簽。基於這個預測,我們得到一個損失,我們使用 反向傳播其梯度loss.backward()

現在隱私引擎帶來的主要區別是向后傳播的梯度的范數被剪裁為小於max_grad_norm這樣做是為了確保數據的整體敏感性是有界的。

之后,對批次的梯度進行平均,並根據 的值將隨機采樣的高斯噪聲添加到其中noise_multiplier這樣做是為了確保該過程滿足指定 alpha 訂單值的 Renyi Differential Privacy 的保證。

最后,優化器使用 向與最大噪聲梯度相反的方向邁出一步optimizer.step()我們將整個訓練迭代重復 10 個時期,以減少整體損失。

def train(model, train_loader, optimizer, epoch, device, delta): model.train() criterion = torch.nn.CrossEntropyLoss() losses = [] for _batch_idx, (data, target) in enumerate(tqdm(train_loader)): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() losses.append(loss.item()) epsilon, best_alpha = optimizer.privacy_engine.get_privacy_spent(delta) print( f"Train Epoch: {epoch} \t" f"Loss: {np.mean(losses):.6f} " f"(ε = {epsilon:.2f}, δ = {delta}) for α = {best_alpha}") for epoch in range(1, 11): train(model, train_loader, optimizer, epoch, device="cpu", delta=1e-5)

epsilon 和 delta 參數幫助我們確定高斯噪聲分布​​的形狀和大小。epsilon、delta 和 alpha 值共同為我們提供了 Renyi 差分隱私保證和我們花費的隱私預算的量化。

這就是 opacus 如何巧妙地為 PyTorch 模型添加對差分隱私的支持,通過將謹慎的隱私引擎附加到其模型,確保整個模型創建和訓練過程完全相同。

把這一切放在一起

# Step 1: Importing PyTorch and Opacus import torch from torchvision import datasets, transforms import numpy as np from opacus import PrivacyEngine from tqdm import tqdm # Step 2: Loading MNIST Data train_loader = torch.utils.data.DataLoader(datasets.MNIST('../mnist', train=True, download=True, transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)),]),), batch_size=64, shuffle=True, num_workers=1, pin_memory=True) test_loader = torch.utils.data.DataLoader(datasets.MNIST('../mnist', train=False, transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)),]),), batch_size=1024, shuffle=True, num_workers=1, pin_memory=True) # Step 3: Creating a PyTorch Neural Network Classification Model and Optimizer model = torch.nn.Sequential(torch.nn.Conv2d(1, 16, 8, 2, padding=3), torch.nn.ReLU(), torch.nn.MaxPool2d(2, 1), torch.nn.Conv2d(16, 32, 4, 2), torch.nn.ReLU(), torch.nn.MaxPool2d(2, 1), torch.nn.Flatten(), torch.nn.Linear(32 * 4 * 4, 32), torch.nn.ReLU(), torch.nn.Linear(32, 10)) optimizer = torch.optim.SGD(model.parameters(), lr=0.05) # Step 4: Attaching a Differential Privacy Engine to the Optimizer privacy_engine = PrivacyEngine(model, batch_size=64, sample_size=60000, alphas=range(2,32), noise_multiplier=1.3, max_grad_norm=1.0,) privacy_engine.attach(optimizer) # Step 5: Training the private model over multiple epochs def train(model, train_loader, optimizer, epoch, device, delta): model.train() criterion = torch.nn.CrossEntropyLoss() losses = [] for _batch_idx, (data, target) in enumerate(tqdm(train_loader)): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() losses.append(loss.item()) epsilon, best_alpha = optimizer.privacy_engine.get_privacy_spent(delta) print( f"Train Epoch: {epoch} \t" f"Loss: {np.mean(losses):.6f} " f"(ε = {epsilon:.2f}, δ = {delta}) for α = {best_alpha}") for epoch in range(1, 11): train(model, train_loader, optimizer, epoch, device="cpu", delta=1e-5)
  • 這篇文章的作者是:
  •  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM