【问题标题】:Why in chainer define self define function backward function must return gradient shape the same as input?为什么在chainer中定义自定义函数后向函数必须返回与输入相同的梯度形状?
【发布时间】:2018-01-31 14:30:31
【问题描述】:

两个问题:

  1. https://docs.chainer.org/en/stable/tutorial/function.html 写道:后向函数必须返回与前向方法的参数相同的形状?因为在某些情况下,输入数据和参数不需要是相同的形状或长度,例如 Convolutional2D,如何处理不同形状的输入数据和参数。

  2. 因为在某些情况下,比如maxpooling,这里没有梯度。如何定义这样的chainer函数?

【问题讨论】:

    标签: chainer


    【解决方案1】:
    1. backward 方法应返回一个数组元组,该元组的第 i 个数组应与 forward 方法的第 i 个参数具有相同的形状。当然,forward 的不同参数(以及backward 的不同返回值)可以有不同的形状。

    2. 当函数没有梯度 w.r.t.一些输入(即梯度始终为零),您可以返回 None 作为元组的相应元素,而不是零填充数组。顺便说一句,最大池化确实有梯度。

    【讨论】:

    • 关于第二个问题:你的意思是如果forward函数有a,b,c参数,如果b没有梯度,我写backward return (ga, None, gc) tuple,这里是ga, gc表示 f wrt 的梯度。 a 和 c.?
    • 还有一个问题:如果我要写一个layer,这个layer的backward应该在layer的隶属函数中做流动梯度,layer本身没有backward()函数。我理解对了吗?
    • 对于第一条评论:是的,您可以返回(ga, None, gc) 表示该函数没有渐变w.r.t。 b.
    • 第二条评论:你的意思是“层”链接吗?如果是这样,基本上是的。如果在不改变Function定义的情况下手动停止梯度流,也可以写x = Variable(x.data)x.unchain()x处切割计算图(前者不修改已有对象,后者修改)。跨度>
    • 如果 w 和 x 形状不同(如 conv 层或其他层),因此 dw 和 dx 形状不同,我们如何按元素方式将顶层的 dx 与前一层的 dw 相乘影响前一层w的变化。
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2019-10-15
    • 2020-03-28
    • 2016-01-07
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多