【发布时间】:2019-05-16 19:18:45
【问题描述】:
我正在尝试实现一个差分私有随机梯度下降版本(例如,this),如下所示:
计算大小为 L 的批次中每个点的梯度,然后分别裁剪 L 个梯度中的每一个,然后将它们平均在一起,最后执行(嘈杂的)梯度下降步骤。
在 pytorch 中最好的方法是什么?
最好有一种方法可以同时计算批次中每个点的梯度:
x # inputs with batch size L
y #true labels
y_output = model(x)
loss = loss_func(y_output,y) #vector of length L
loss.backward() #stores L distinct gradients in each param.grad, magically
但如果做不到这一点,请分别计算每个梯度,然后在累积之前裁剪范数,但是
x # inputs with batch size L
y #true labels
y_output = model(x)
loss = loss_func(y_output,y) #vector of length L
for i in range(loss.size()[0]):
loss[i].backward(retain_graph=True)
torch.nn.utils.clip_grad_norm(model.parameters(), clip_size)
先累积第 i 个梯度,然后进行剪辑,而不是在将其累积到梯度中之前进行剪辑。解决此问题的最佳方法是什么?
【问题讨论】:
标签: python pytorch gradient-descent