繁体   English   中英

损失值不降低

[英]The loss value does not decrease

我正在使用 Pytorch 实现一个简单的前馈神经网络,并且损失 function 似乎没有减少。 由于我已经完成了一些其他测试,问题似乎出在我为计算pred所做的计算中,因为如果我稍微改变网络以便它为每个条目吐出一个二维向量并将其保存为 pred,一切完美运行。

你看到这里定义 pred 的问题了吗? 谢谢

import torch
import numpy as np
from torch import nn

dt = 0.1

class Neural_Network(nn.Module):
    def __init__(self, ):
        super(Neural_Network, self).__init__()
    
        self.l1 = nn.Linear(2,300)
        self.nl = nn.Tanh()
        self.l2 = nn.Linear(300,1)
    
    
    def forward(self, X):
        z = self.l1(X)
        z = self.nl(z)
        o = self.l2(z)
        return o



N = 1000
X = torch.rand(N,2,requires_grad=True)
y = torch.rand(N,1)
NN = Neural_Network()

criterion = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.Adam(NN.parameters(), lr=1e-5)

epochs = 200

for i in range(epochs):  # trains the NN 1,000 times

    HH = torch.mean(NN(X))
    gradH =  torch.autograd.grad(HH, X)[0]
    XH= torch.cat((gradH[:,1].unsqueeze(0),-gradH[:,0].unsqueeze(0)),dim=0).t()
    pred = X + dt*XH

    #Optimize and improve the weights
    loss = criterion(pred, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()


    print (" Loss: ", loss.detach().numpy())  # mean sum squared loss

PS 有了这些 X 和 y,预计 go 的损失不会为零,为了简单起见,我在这里像它们一样添加了它们。 我将把这个架构应用到预期满足这个 model 的数据点上。 但是,我只是对看到损失减少感兴趣。


我的目标是用神经网络近似一个向量场的哈密顿量,其中只有一些轨迹是已知的。 例如,仅针对某些点的选择更新x(t)\rightarrow x(t+\Delta t) 所以向量X包含点x(t) ,而y包含 $x(t+\Delta t)$。 我上面的网络以简单的方式近似于哈密顿量 function H(x) ,为了优化它,我需要找到与这个哈密顿量相关的轨迹。

特别是XH旨在成为与近似哈密顿量相关的哈密顿矢量场。 时间更新pred = X + dt*XH只是向前欧拉的一步。

但是,我在这里的主要问题可以抽象为:如何在损失 function 中涉及网络相对于其输入的梯度?

可能是因为NN的梯度流图被gradH步骤破坏了。 (检查HH.grad_fngradH.grad_fn

因此,您的pred张量(以及随后的损失)不包含通过NN网络的必要梯度流。

loss包含输入X的梯度流,但不包含NN.parameters() 因为优化器只对那些NN.parameters()采取step() () ,所以网络NN没有被更新,并且由于X没有被更新,损失不会改变。

您可以通过在loss.backward()之后检查loss.grad_fn来检查损失如何向后发送它的梯度,这是一个整洁的 function (在 Stackoverflow 上找到)来检查它:

def getBack(var_grad_fn):
    print(var_grad_fn)
    for n in var_grad_fn.next_functions:
        if n[0]:
            try:
                tensor = getattr(n[0], 'variable')
                print(n[0])
                print('Tensor with grad found:', tensor)
                print(' - gradient:', tensor.grad)
                print()
            except AttributeError as e:
                getBack(n[0])

getBack(loss.grad_fn) loss.backward()检查它(虽然之前可能会减少批次 N 的大小)

编辑:它通过改变gradH = torch.autograd.grad(HH, X, create_graph=True)[0]来工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM