0x00 参考与符号表

感谢诸位大神的文档让我顺利推导公式

以下是符号表

符号 含义
$$\sigma (z)$$ 泛指激活函数
$$z^{l}$$ 第l层的神经元激活函数的输入
$$a^{l}_{ij}$$ 第l层的神经元的输出,i,j代表下标
$$w_{ij}^{l}$$ 或 $$W^{l}$$ 第l层的权重(矩阵),从第l-1层的i到l层的j的权重
$$b_i^{l}$$ 第l层的神经元的偏移值,i代表下标
C 损失函数
$$\delta ^l_{i}$$ 第l层的误差
$$\nabla {a_{11}}$$ 相当于 损失函数对a11的偏导
$$\bigodot {}$$ 逐项相乘(Hadamard乘积)

0x01 DNN里的反向传播算法与模拟

因为打公式实在是太累了,所以就用图片了
自己推完之后感觉获益良多。之前自己觉得CNN还有RNN的反向传播算法非常难。今天花了近两个小时来推到公式,对于反向传播有了更深入的了解吧。

一个简单的例子

首先来复习一下DNN里面的反向传播,定义一个非常简单的网络。
烧包包儿带你手推CNN反向传播公式-ShaoBaoBaoEr's Blog

计算可得,损失函数对各权重与偏移的偏导数。

复杂一些的例子

当然神经网络不可能这么简单对吧。偏导数可能有若干项。

烧包包儿带你手推CNN反向传播公式-ShaoBaoBaoEr's Blog
烧包包儿带你手推CNN反向传播公式-ShaoBaoBaoEr's Blog

这时候就需要用到一些矩阵表示法,来让算式变得更加易读。

0x02 CNN

卷积操作的反向传播

对于CNN是怎样的呢?这可能会复杂一些,但是我们一步步来

烧包包儿带你手推CNN反向传播公式-ShaoBaoBaoEr's Blog

首先,先定义一下我们的网络,以及将卷积的算式给写出来,可以得到如上的算式

当我们已知上一层的偏差$$\delta{l}$$的时候,如何去计算$$\delta^{l-1}$$呢?

首先把算式展开。我们发现,其实棘手的一项是$$\delta{l} \; \cfrac{\partial{z^l} }{\partial{a^{l-1}}}$$

对此,我们按照定义走。可以发现如下规律。
烧包包儿带你手推CNN反向传播公式-ShaoBaoBaoEr's Blog

整合为矩阵运算,可以看到结果是这样的。因此,我们可以把它简写为如下形式

烧包包儿带你手推CNN反向传播公式-ShaoBaoBaoEr's Blog

关于偏移和权重(卷积核)

经过上述操作,还可以归纳出权重更新的反向传播方程。

在吴老师的课程中,有提及,其实卷积的b是恒等于0的。不知道tf是如何实现的,其实是不用做考虑的吧。

池化层的反向传播

池化的操作相对简单,分为最大池化和均值池化。池化反向传播的基本形式如笔记第一行所示,只不过upsample函数不太一样。

烧包包儿带你手推CNN反向传播公式-ShaoBaoBaoEr's Blog

0x03 总结

写完8张多的草稿之后,有点小心得,来归纳一下

其实反向传播最核心的问题就是,已知$$\delta ^{l}$$,求$$\delta ^{l-1}$$ 以及权重,偏移的误差。

实际上,对于$$\delta ^{l-1}$$,可以写出较为一般的推导形式。比较棘手的就是第二项或者第一加第二项。

烧包包儿带你手推CNN反向传播公式-ShaoBaoBaoEr's Blog