首先是一个理论问题,然后是一个实用问题。

神经网络反向传播是权重衍生物的计算或新权重的计算(即原始权重减去权重衍生物的时间时代的学习率 - 简化)?

这很可能是一个语义问题,但仍然很重要。

另外,如果有人熟悉火炬,nn课程

gradInput = module:backward(input, gradOutput)

GARTINPUT是下一个前向传球的重量集还是前向前传球权重的衍生物?

谢谢!

有帮助吗?

解决方案

我已经使用火炬了几个月,但我会尝试一下(如果不正确,则表示歉意)。

是的,重量$ W $已更新如下;

$$ w_ {new} = w_ {old} - gamma partial e/ partial w_ {old} $$

$ gamma $是您的学习率,而$ e $是使用类似的错误计算出的错误 criterion:forward(output,target). 。例如,标准可能是 nn.MSECriterion().

要计算$ partial e/ partial w $您需要$ partial e/ partial y $ gradOutput = criterion:backward(output,target)(对输出的梯度)以及输入 input 到网络IE您的$ x $(例如图像数据),以生成递归的递归方程组 gradOutput.

model:backward(input, gradOutput) 因此,有助于更新权重,以便它们为下一个 model:forward(input) 因为它生成了一个大导数张量$ de/dw_ {old} $。

然后将其与优化器(例如 optim.sgd 使用 optimMethod 旧的权重$ w_ {old} $以在第一个方程式生成新权重。当然,您可以在没有优化器的情况下更新权重 model:updateParameters(learningRate) 但是您错过了有用的东西,例如动量,体重衰减等。

在那里有点跟踪,但希望这会有所帮助。

其他提示

从最简单的角度来看,也许这足够了: backward() 方法用于训练具有反向传播的神经网络;计算输出 y 给定输入 x 使用网络的 forward() 方法,然后通过 criterion 您定义了(例如负日志可能性等)。现在,如果只有一层网络,那么您可以简单地使用输出层和目标之间的这些错误来更新该单层中的权重。当您有多个层(或更复杂的结构)时,您可以一次更新一层,每次计算错误 图层(不再是输出层),然后使用该错误来更新上一层的权重。那是反向物质。为此,您显然需要某种方法将输出$ delta y $中的错误映射到$ delta x $上,使用同一状态(又称型号状态和输入$ x $)。就这样 backward() 方法本质上是形式:$$ f:(x,x, delta y) rightarrow delta x $$

对于完整性, forward() 方法可以表示为:$$ f:x rightarrow y $$,如果以前的状态 y 坚持不懈,然后您需要计算的只是$ delta y $,因此,同等地说, forward() 也可以表示为:$$ f:(x,y) rightarrow delta y $$

该表格可以很容易地与 backward() 方法,很容易理解为什么称其为这样。

许可以下: CC-BY-SA归因
scroll top