【问题标题】:Pytorch: Gradient of output w.r.t parametersPytorch:输出 w.r.t 参数的梯度
【发布时间】:2018-10-14 23:42:14
【问题描述】:

我对查找神经网络输出相对于参数(权重和偏差)的梯度很感兴趣。

更具体地说,假设我有以下神经网络结构 [6,4,3,1]。输入样本大小为 20。我感兴趣的是找到权重(和偏差)的神经网络输出的梯度,如果我没记错的话,在这种情况下为 47。在文献中,这个梯度有时称为 Weight_Jacobian。

我在 Jupyter Notebook 上的 Python 3.6 上使用 Pytorch 0.4.0 版。

我生成的代码是这样的:

def init_params(layer_sizes, scale=0.1, rs=npr.RandomState(0)):
    return [(rs.randn(insize, outsize) * scale,   # weight matrix
                 rs.randn(outsize) * scale)           # bias vector
                 for insize, outsize in 
                 zip(layer_sizes[:-1],layer_sizes[1:])]
layers = [6, 4, 3, 1]
w = init_params(layers)
first_layer_w = Variable(torch.tensor(w[0][0],requires_grad=True))
first_layer_bias = Variable(torch.tensor(w[0][1],requires_grad=True))
second_layer_w = Variable(torch.tensor(w[1][0],requires_grad=True))
second_layer_bias = Variable(torch.tensor(w[1][1],requires_grad=True))
third_layer_w = Variable(torch.tensor(w[2][0],requires_grad=True))
third_layer_bias = Variable(torch.tensor(w[2][1],requires_grad=True))
X = Variable(torch.tensor(X_batch),requires_grad=True)
output=torch.tanh(torch.mm(torch.tanh(torch.mm(torch.tanh(torch.mm(X,first_layer_w)+first_layer_bias),second_layer_w)+second_layer_bias),third_layer_w)+third_layer_bias)
output.backward()

从代码中可以明显看出,我使用双曲正切作为非线性。代码生成长度为 20 的输出向量。现在,我有兴趣找到这个输出向量 w.r.t 所有权重(全部 47 个)的梯度。我在here 阅读了 Pytorch 的文档。我也看到过类似的问题,例如here。但是,我未能找到输出向量 w.r.t 参数的梯度。 如果我使用 Pytorch 函数backward(),它会生成一个错误为

RuntimeError: grad can be implicitly created only for scalar outputs

我的问题是,有没有办法计算输出向量 wrt 参数的梯度,它基本上可以表示为 20*47 矩阵,因为我的输出向量的大小为 20,参数向量的大小为47?如果是这样,如何?我的代码有什么问题吗?你可以举任何 X 的例子,只要它的尺寸是 20*6。

【问题讨论】:

  • 我认为您错误地将 requires_grad 传递给 torch.tensor 而不是 Variable。
  • 我已经解决了这个问题,但是,错误仍然是一样的......
  • 我刚刚看到您使用的是 0.4.0,在这种情况下您不再需要 Variable (pytorch.org/2018/04/22/0_4_0-migration-guide.html)。

标签: python neural-network pytorch gradient-descent autograd


【解决方案1】:

函数关于其参数的偏导数矩阵称为Jacobian,可以在 PyTorch 中计算:

torch.autograd.functional.jacobian(func, inputs)

【讨论】:

    【解决方案2】:

    您正在尝试计算函数的雅可比行列式,而 PyTorch 期望您计算向量-雅可比行积。您可以查看使用 PyTorch here 计算雅可比矩阵的深入讨论。

    你有两个选择。您的第一个选择是使用 JAXautograd 并使用 jacobian() 函数。您的第二个选择是坚持使用 Pytorch 并通过调用 backwards(vec) 20 次来计算 20 个向量雅可比乘积,其中 vec 是一个长度为 20 的单热向量,其中组件的索引为 1 的范围从 0 到19. 如果这令人困惑,我建议阅读 JAX 教程中的autodiff cookbook

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2021-11-25
      • 2022-01-14
      • 2019-01-10
      • 2018-01-01
      • 2018-06-16
      • 2020-02-27
      • 2019-09-24
      • 2019-11-19
      相关资源
      最近更新 更多