nn.Linear之后的矩阵的链规则输出

时间:2019-12-28 16:27:52

标签: python pytorch

例如,在应用连锁规则的情况下,

x = torch.tensor([1.], requires_grad=True)
def square(x):
  return x**2
def exp(x):
  return torch.exp(x)
z = exp(square(x)) # e^x**2
# derivative is e^(x**2) * 2*x

所以,当我们这样做时,

z.backward()
x.grad

它给出了

张量([5.4366]) 就是 torch.exp(torch.tensor([1。])** 2)* 2 * torch.tensor([1。])

但是使用矩阵时,

input = torch.randn(3, 3)
a = nn.Linear(3, 3, bias=False)
b = nn.Linear(3, 3, bias=False)
z = b(a(input)).sum()
z.backward()

然后,我们得到这些矩阵,

for param in a.parameters():
  print(param.grad)
tensor([[-0.9843,  0.5633,  0.4002],
        [ 0.7303, -0.4179, -0.2969],
        [ 1.9923, -1.1402, -0.8101]])
for param in b.parameters():
  print(param.grad)
tensor([[ 1.8401,  0.5115, -1.3559],
        [ 1.8401,  0.5115, -1.3559],
        [ 1.8401,  0.5115, -1.3559]])

这两个矩阵如何计算?

1 个答案:

答案 0 :(得分:0)

在2x2矩阵上进行实验后,我获得了导数, PyTorch使用

input @ weight.t()

在nn.Linear内,所以 相对于WB [0] [0]的导数出来,

input[0][0]*WA[0][0] + input[0][1]*WA[0][1] + input[1][0]*WA[0][0] + input[1][1]*WA[0][1]

关于WA [0] [0]的导数出现,

input[0][0]*WB[0][0] + input[0][0]*WB[1][0] + input[1][0]*WB[0][0] + input[1][0]*WB[1][0]
例如与 .param.grad匹配的

input = torch.randn(2, 2)
a = nn.Linear(2, 2, bias=False)
b = nn.Linear(2, 2, bias=False)
z = b(a(input)).sum()
z.backward()
for param in a.parameters():
  print(param.grad)

给予

tensor([[-0.3518, -0.1145],
        [ 0.0382,  0.0124]])
for param in b.parameters():
  print(param.grad)

给予

tensor([[-0.0015,  0.2133],
        [-0.0015,  0.2133]])
input[0][0]*a.weight[0][0] + input[0][1]*a.weight[0][1] + input[1][0]*a.weight[0][0] + input[1][1]*a.weight[0][1]
tensor(-0.0015, grad_fn=<AddBackward0>)
input[0][0]*b.weight[0][0] + input[0][0]*b.weight[1][0] + input[1][0]*b.weight[0][0] + input[1][0]*b.weight[1][0]

给予

tensor(-0.3518, grad_fn=<AddBackward0>)