首先是一个理论问题,然后是一个实际问题。
神经网络反向传播是计算权重导数还是计算新权重(即原始权重减去权重导数乘以学习率 - 简化)?
这很可能是一个语义问题,但仍然很重要。
另外,如果有人熟悉 Torch,nn 类
gradInput = module:backward(input, gradOutput)
gradinput 是为下一个前向传递设置的权重还是前一个前向传递的权重的导数?
谢谢!
首先是一个理论问题,然后是一个实际问题。
神经网络反向传播是计算权重导数还是计算新权重(即原始权重减去权重导数乘以学习率 - 简化)?
这很可能是一个语义问题,但仍然很重要。
另外,如果有人熟悉 Torch,nn 类
gradInput = module:backward(input, gradOutput)
gradinput 是为下一个前向传递设置的权重还是前一个前向传递的权重的导数?
谢谢!
我已经使用torch 几个月了,但我会试一试(如果不正确,请道歉)。
是的重量更新如下;
在哪里是你的学习率和是使用类似的东西计算的误差criterion:forward(output,target)。例如,标准可以是nn.MSECriterion()。
计算 你需要 gradOutput = criterion:backward(output,target)(关于输出的梯度)以及input网络的输入,即你的(例如图像数据)生成与 相乘的递归方程组gradOutput。
model:backward(input, gradOutput)因此用于更新权重,以便它们为下一个做好准备,model:forward(input)因为它会生成一个大的导数张量.
然后将其与优化器相结合,例如optim.sgd使用optimMethod和旧权重在第一个方程中生成新的权重。当然,你可以在没有优化器的情况下更新权重,model:updateParameters(learningRate)但是你会错过有用的东西,比如动量、权重衰减等。
那里有点偏题,但希望这会有所帮助。
从最简单的角度来看,这可能就足够了:该backward()方法用于训练具有反向传播的神经网络;使用您的网络方法计算y给定输入的输出,然后使用您定义的(例如负对数似然等)找出目标输出的错误。现在,如果只有一层网络,那么您可以简单地使用输出层和目标之间的这些错误来更新该单层中的权重。当您有多个层(或更复杂的结构)时,您可以一次更新一个层,每次计算该层中的错误xforward()criterion层(不再是输出层),然后使用该错误来更新前一层的权重。那就是反向传播。为此,您显然需要一些方法来映射输出中的错误到使用相同的状态(又名模型状态和输入)。因此,该backward()方法本质上是以下形式:
为了同样的完整性,一个forward()方法可以表示为:
y仍然存在,那么您需要计算的只是,因此,等价地讲,aforward()也可以表示为:
这种形式可以很容易地与backward()方法进行比较,并且很容易看出为什么这样称呼它。