烧包包带你手推CNN
九涅·烧包包儿 / / 程序员 / 阅读量

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里面的反向传播,定义一个非常简单的网络。

1

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

复杂一些的例子

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

2
3

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

0x02 CNN

卷积操作的反向传播

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

4

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

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

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

对此,我们按照定义走。可以发现如下规律。

5

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

6

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

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

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

池化层的反向传播

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

7

0x03 总结

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

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

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

8
支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
有 0 篇文章