如何获得概率的偏导数以输入pyTorch?

How to get the partial derivative of probability to input in pyTorch?

我想通过以下步骤生成攻击样本:

  1. 找一个预训练好的CNN分类模型,输入为X,输出为P(y|X),X最可能的结果为y。

  2. 我想输入X'得到y_fool,其中X'离X不远,y_fool不等于y

  3. 获取X'的步骤为:enter image description here

  4. 如何得到图中描述的偏导数?

这是我的代码,但我得到了 None:(型号是 Vgg16)

x = torch.autograd.Variable(image, requires_grad=True)
output = model(image)
prob = nn.functional.softmax(output[0], dim=0)
    
prob.backward(torch.ones(prob.size()))
print(x.grad)

我应该如何修改我的代码?有人可以帮我吗?我将不胜感激。

这里的重点是通过网络反向传播一个“错误”的例子,换句话说,你需要最大化输出的一个特定坐标,它与 x 的实际标签不对应。

例如,假设您的模型输出 N 维向量,x 标签应该是 [1, 0, 0, ...],我们将尝试让模型实际预测 [=16] =](所以 y_fool 实际上将其第二个坐标设置为 1,而不是第一个)。

旁注:Variable 已弃用,只需将 requires_grad 标志设置为 True。所以你得到:

x = torch.tensor(image, requires_grad=True)
output = model(x)
# If the model is well trained, prob_vector[1] should be almost 0 at the beginning
prob_vector = nn.functional.softmax(output, dim=0)
# We want to fool the model and maximize this coordinate instead of prob_vector[0]
fool_prob = prob_vector[1]
# fool_prob is a scalar tensor, so we can backward it easy
fool_prob.backward()
# and you should have your gradients : 
print(x.grad)

在那之后,如果你想在你的循环中使用一个optimizer来修改x,请记住pytorch optimizer.step方法试图最小化损失,而你想要最大化它。因此,要么使用负学习率,要么更改反向传播符号:

# Maximizing a scalar is minimizing its opposite
(-fool_prob).backward()