如何在火炬中编写updateGradInput和accGradParameters?

Gu *_*ang 2 backpropagation neural-network gradient-descent deep-learning torch

我知道这两个功能是火炬的向后传播和界面如下 updateGradInput(input, gradOutput) accGradParameters(input, gradOutput, scale) 我感到困惑的是什么gradInput,并gradOutput真正在层意思.假设网络的成本是C一层L.难道gradInputgradOutput层的L意思是d_C/d_input_Ld_C/d_output_L

如果是这样,如何计算gradInput符合gradOutput

而且,是否accGradParameters意味着积累d_C/d_Weight_Ld_C/d_bias_L?如果是这样,如何计算这些值?

del*_*eil 8

gradInputgradOutput层L意味着d_C/d_input_Ld_C/d_output_L

是:

  • gradInput =成本wrt层输入的导数,
  • gradOutput =成本wrt层输出的导数.

如何计算gradInput根据gradOutput

深度学习的构建块调整模式(警告:在此模式中,成本表示为L= Loss,以及层f)我们具有:

在此输入图像描述

有关LogSoftMax层上此类计算的具体分步示例,您可以参考此答案.

确实accGradParameters意味着积累d_C/d_Weight_Ld_C/d_bias_L

是.命名gradWeightgradBias在火炬/ nn.

如何计算这些值?

与上面类似.仍使用上述博文中的公式:

在此输入图像描述

除了jacobian具有不同的维度(有关更多详细信息,请参阅博客文章).例如,对于线性图层,这转换为:

在此输入图像描述

这是图层输入和gradOutput.之间的外部产品.在火炬,我们有:

self.gradWeight:addr(scale, gradOutput, input)
Run Code Online (Sandbox Code Playgroud)

和:

在此输入图像描述

这是gradOutput.在火炬,我们有:

self.gradBias:add(scale, gradOutput)
Run Code Online (Sandbox Code Playgroud)

在这两种情况下scale都是在实践中用作学习率的比例因子.