我在我的研究中实现了一个非常复杂的函数,它在这一层使用了信念传播。我已经导出了渐变w.r.t.这个层的W(参数),但因为它的复杂性,我还没有得到渐变w.r.t. input_data(数据来自前一层)。
我对反向传播的细节非常困惑。我搜索了很多关于BP算法的内容,有些笔记说它只对差分w.r.t. W(参数)并使用残差来获得梯度?您的示例似乎我们还需要计算渐变w.r.t.输入数据(以前的图层输出)。我很困惑? 非常典型的例子是,如何导出渐变w.r.t.在卷积层输入图像?
我的网络有两层,我是否需要手动导出渐变w.r.t.在最后一层输入X?(向后需要返回gx才能让BP工作到渐变流到前一层)?
答案 0 :(得分:0)
如果你不需要渐变w.r.t.输入,你可以省略它的计算。在这种情况下,返回None
作为省略的输入渐变的占位符。请注意,在这种情况下,backprop之后输入的grad
将不正确。如果你想编写一个可以在任何上下文中使用的函数(包括想要渐变w.r.t.输入的情况),你必须计算渐变w.r.t.所有输入(除了函数没有区分w.r.t.输入的情况除外)。这就是为什么Chainer的内置函数为所有输入计算梯度的原因。
顺便说一下,导出渐变w.r.t.卷积层的输入图像很简单:使用相同的权重将转置卷积(在历史原因中称为"解卷积"在Chainer中)应用于输出。