Building image classifier with Differential Privacy Using Opacus
task:
The task is to train a LeNet or AlexNet with Mnist.
Model: LeNet or AlexNet
Dataset: Mnist
Requirements: test accuracy > 90% and epsilon < 2
Reference:
A Library for Training PyTorch models with Differential Privacy: https://opacus.ai/
Paper of DP-SGD: https://arxiv.org/abs/1607.00133
Opacus介绍
Opacus是一个可以让pytorch实现差分隐私的库,可以仅用非常简介的代码训练一个满足差分隐私的模型。
Opacus主要原理
Opacus会修改model,optimizer和dataloader,在反向传播时对于返回的梯度加入Gaussian噪声来实现差分隐私。
使用Opacus
引入基础的库
1 | %pip install opacus |
1 | device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
设置超参数
EPSILON:$\varepsilon$
DELTA:$\delta$
1 | EPOCH = 30 # 遍历数据集次数 |
获取数据
1 | transform = transforms.ToTensor() |
定义网络
AlexNet
1 | class AlexNet(nn.Module): |
然后还可以检验一下网络中使用的层Opacus是否支持,存在有些层不支持的情况。将网络进行转化满足支持。1
2
3
4
5
6
7
8net = AlexNet()
from opacus.validators import ModuleValidator
errors = ModuleValidator.validate(net, strict=False)
errors[-5:]
net = ModuleValidator.fix(net)
ModuleValidator.validate(net, strict=False)
net = net.to(device)
定义损失函数和优化器
1 | criterion = nn.CrossEntropyLoss() # 交叉熵损失函数,通常用于多分类问题上 |
通过差分隐私引擎重新生成model,optimizer和dataloader
1 | privacy_engine = PrivacyEngine() |
训练
1 | def train(): |