【问题标题】:Find global minimun with GD in PyTorch在 PyTorch 中使用 GD 查找全局最小值
【发布时间】:2019-01-31 22:56:24
【问题描述】:

我已经用向量输入和标量输出(回归)训练了一个神经网络。 现在我想使用 GD 和 pytorch 找到 NN 的全局最小值。

我是一般编程的新手,特别是 python,特别是 pytorch。

我相信我正在尝试做的事情一定已经做过一千次了,如果不是一万次的话。如果有人能在某个地方(可能在 github 中)向我指出一些代码,我将非常高兴和感激,那里有一个我正在尝试做的示例,我可以根据我的需要进行调整。

【问题讨论】:

  • 含义:我想知道什么输入会给出最小(最大)输出
  • 需要注意的是,基于梯度的优化只能保证找到局部最小值。只有对于您的神经网络和损失的特殊情况(如果损失函数是凸的),GD 才会产生全局最小值。更详细地研究导数如何工作可能会有所帮助,但梯度是一个局部属性,在单个点上给出最陡的斜率。有关真正简短的介绍,请阅读this

标签: python regression pytorch gradient-descent non-linear-regression


【解决方案1】:

你按照你所做的来训练你的网络,但不是更新权重,而是更新输入:

input = torch.zeros([1,3,32,32], requires_grad=True) # Whatever the expected input size of your network is
output = model(input)
target = 0.0 # What kind of target should your network reach?
loss = ((target - output) ** 2) # Replace this with the loss you are using
grad = torch.autograd.grad(loss, input)

您可以将梯度(可能与学习率相乘)应用于输入并重复此步骤多次。我已经从https://discuss.pytorch.org/t/gradient-of-loss-of-neural-network-with-respect-to-input/9482更新了这个

您应该注意这样一个事实,即您的网络可能会产生相当嘈杂的“输入”,因此您应该考虑一下您的初始输入应该是什么。谷歌之前也做过类似的事情,例如https://www.networkworld.com/article/2974718/software/deep-dream-artificial-intelligence-meets-hallucinations.html

【讨论】:

  • 太棒了!谢谢。这完美地工作。我的代码现在看起来像这样:for t in range(30): input = 100 * softmax(input), output = net(input), loss = -output, loss_list.append(loss), grad = torch.autograd.grad (损失, 输入), grad = torch.tensor(grad[0]), input -= learning_rate * grad.然而,经过几次更新后,输入变成了 one-hot-vector,在应用 softmax 后变成了“Nan”。即使我使用高度逻辑的初始值(来自用于训练 NN 的数据)有什么想法吗?
  • 你的损失只是网络的否定输出,在回归中,应该有类似目标值的东西。您能否解释一下为什么要应用转换input=100*softmax(input)
  • 你是对的。 :) 无论如何,现在一切正常。所以,非常感谢大家的帮助。有一个美好的秋天。
猜你喜欢
  • 2016-09-10
  • 2015-08-01
  • 1970-01-01
  • 2012-08-27
  • 2021-01-13
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
相关资源
最近更新 更多