0

3个问题:

  1. chainer 中的 grad_outputs 是什么?

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

    def向后(自我,输入,grad_outputs):gy = grad_outputs [0] inv_axes = self.axes if self.axes:轴=元组(ax % len(self.axes)for ax in self.axes)inv_axes = tuple(numpy .argsort(axes)) gx = gy.transpose(inv_axes) 返回 gx,

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

    a, b = inputs gy = grad_outputs[0] return a * gy, b * gy 但是,a和b的形状不一样,a * gy而且b * gy可能报错?形状不匹配乘?

4

1 回答 1

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)可能不同
于 2017-08-28T00:05:24.740 回答