如何获得基于导数的损失的网络参数梯度?

问题描述 投票:0回答:1

我有一个网络

y(x)
,我有一个给定的数据集
dy(x)
。也就是说,我知道
y
对某个
x
的导数,但我不知道
y
本身。一个最小的例子是:

import torch

# Define network to predict y(x)
network = torch.nn.Sequential(
    torch.nn.Linear(1, 50),
    torch.nn.Tanh(),
    torch.nn.Linear(50, 1)
)

# Define dataset dy(x) = x, which corresponds to y = 0.5x^2
x = torch.linspace(0,1,100).reshape(-1,1)
dy = x

# Calculate loss based on derivative of prediction for y
x.requires_grad=True
y_pred = network(x)
dy_pred = torch.autograd.grad(y_pred, x, grad_outputs=torch.ones_like(y_pred), create_graph=True)[0]
loss = torch.mean((dy-dy_pred)**2)

# This throws an error
gradients = torch.autograd.grad(loss, network.parameters())[0]

在最后一行,它给出了错误

One of the differentiated Tensors appears to not have been used in the graph
,即使参数肯定已经被用来计算损失。有趣的是,当我使用
torch.optim.Adam
loss.backward()
的损失时,没有错误发生。我该如何解决我的错误? 注意:定义一个网络来直接预测
dy
不是我实际问题的选项

python pytorch gradient backpropagation automatic-differentiation
1个回答
0
投票

我发现问题是最后一个神经元的偏差对损失没有贡献,因此它没有在图中使用。因此,我们必须通过将

bias=False
传递到最后一层来消除这个偏差参数。

# Define network to predict y(x)
network = torch.nn.Sequential(
    torch.nn.Linear(1, 50),
    torch.nn.Tanh(),
    torch.nn.Linear(50, 1, bias=False)
)
© www.soinside.com 2019 - 2024. All rights reserved.