例如,在应用连锁规则的情况下,
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]])
这两个矩阵如何计算?
答案 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]
例如与
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>)