什么是论证" grad_outputs"在chainer的后退功能

时间:2017-08-27 15:38:48

标签: chainer

3个问题:

  1. chainer中的grad_outputs是什么?

  2. chainer函数F.transpose中的一个例子,如何解释这个后向代码?

    向后def(自我,输入,grad_outputs):     gy = grad_outputs [0]     inv_axes = self.axes     如果self.axes:         axes = tuple(ax.inx.axes中ax的ax%len(self.axes))         inv_axes = tuple(numpy.argsort(axes))     gx = gy.transpose(inv_axes)     返回gx,

  3. 假设我想要实现自定义函数,但我的输入[0]和输入[1]具有不同的形状,为了使用差分链规则反向传播,我必须在{{1}中编写以下代码}:

    a,b =输入 gy = grad_outputs [0] 返回一个* gy,b * gy 但是,a和b的形状不同,backwarda * gy可能会报告错误?形状不匹配乘以?

1 个答案:

答案 0 :(得分:0)

*此答案适用于chainer v2, Function类的内部行为可能会在chainer v3 之后发生变化,以支持可区分的反向传播。

反向传播从最后一层进行到第一层传播其渐变,以便计算每层参数的梯度。

函数的backward函数接收输出的梯度,需要计算&返回输入梯度。

  1. grad_outputs是此函数输出的渐变,以数组(numpycupy)格式显示。
  2. 我相信基本的想法是,F.transpose的区分也只是一个转置,所以它只是返回输出渐变的转置,gy。 然而,严格地说,当我们转发计算时指定F.transpose的转置顺序,此顺序保持为self.axes,并且在向后计算中需要反向排序。我猜inv_axes是反向排序的轴,它用于计算输入的梯度,写为gx
  3. 正如您所写的,您可以返回元组格式的输入渐变,例如return a * gy, b * gy。形状无关紧要,每个函数的输入可能不同(以及backward的返回值)