神经网络求导:computational graph 中涉及向量的求导问题 ?(cs231n作业为例)

cs231n Assignment 2 中 Batch Normalization的 backward部分实现时的问题: 正向传播最后一步: out = xgamma + beta 对应反响传播: dbeta = np.sum(dout, axis = 0) (1)为什么会这样做?为什么会sum一下,是不是我画computational graph时忽略了什么结构? (2)Batch Normalization 这里computational graph中的全都是矩阵之间element-wise的运算,如果维度不同就自动扩展矩阵补齐。 这和Assignment 1 中的矩阵点乘不同,求…
关注者
48
被浏览
1,999
谢邀。参见下面这幅图,前面的computatinal graph我就省略了,我们从\hat{x}这里开始.
\gamma \hat{x}\beta相加,其实是一个broadcast(NumPy refresher)操作,对于out的每一行,都进行了加\beta的操作,所以在backpropagation的过程中,dout的每一行都要加到dbeta上。更细一点,你可以把broadcasting这种操作看成computational graph中的一种操作,首先把1*D的beta“复制”m份,变成一个broadcast过的矩阵,然后和\gamma \hat{x}逐行相加:
这样就会发现,backpropagation的过程中,broadcasting这个节点其实有多个输出,那么自然回流的误差(梯度)就需要求和了。

对于你的第二个问题,其实broadcasting在backpropagation的过程不难,关键就是“找责任”。在forward的过程中,找准变量a参与了哪些操作,通过这些操作影响到了哪些变量b,c,d...,那么根据这个操作和影响到的变量b,c,d...的梯度,就可以得到变量a的梯度了。

推荐几个backpropagation的博客:
1. Neural networks and deep learning
2. 我有写关于computational graph的blog:Using Computation Graph to Understand and Implement Backpropagation – SUNSHINEATNOON – Madness between pain and boredom.
我很久没有看cs231n了,有不当之处请指出,谢谢。