大家好~本课程为“深度学习基础班”的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序
线上课程资料:
加QQ群,获得ppt等资料,与群主交流讨论:106047770
本系列文章为线上课程的复盘,每上完一节课就会同步发布对应的文章
本课程系列文章可进入索引查看:
目录回顾相关课程内容
- 卷积神经网络的局部连接和权重共享是指什么?
- 卷积层的前向传播是如何计算的?
- 全连接层的后向传播算法是什么?
答:先计算输出层的误差项,然后反向依次计算每层的误差项直到与输入层相连的层,最后根据每层的误差项和输入得到每层的梯度 - 误差项的计算公式是什么?
答:\(\delta_k=\frac{dE}{dnet_k}\) - 全连接层的后向传播是如何推导?
为什么要学习本课
- 如何推导卷积层的后向传播?
主问题:如何推导卷积层的后向传播?
- 卷积层的后向传播算法有哪些步骤?
答:
1.已知下一层计算的误差项,反向依次计算这一层的误差项
2.计算这一层中每个权重值的梯度 - 与全连接层中隐藏层的后向传播算法的步骤一样吗?有什么区别?
答:步骤跟隐藏层是一样的,但是每个步骤的计算方法都不一样,这是因为:
“局部连接”使得第一步误差项的计算方法不一样;
“权值共享”则使得第二步变为计算Filter中的每个权重值的梯度; - 下面分别讨论这两个步骤的实现
主问题:如何反向计算误差项?
- 我们先来考虑步长为1、输入的深度为1、filter个数为1的最简单的情况。
- 假设输入的大小为33,filter大小为22,按步长为1卷积,我们将得到2*2的feature map。如下图所示:
- 其中layer l-1为当前层(卷积层),layer l为下一层
- 在这里,我们假设第l层中的每个误差项都已经算好,我们要做的是计算第l-1层每个神经元的误差项
- 它的计算公式是什么:
答:
\[\begin{aligned} \delta_{i,j}^{l-1} &= \frac{dE}{dnet_{i,j}^{l-1}} \\ &= \frac{dE}{da_{i,j}^{l-1}}\frac{da_{i,j}^{l-1}}{dnet_{i,j}^{l-1}}\\ \end{aligned} \]\[a_{i,j}^{l-1}表示第l-1层第i行第j列神经元的输出 \\ net_{i,j}^{l-1}表示第l-1层第i行第j列神经元的加权输入 \\ \]-
如何求\(\frac{dE}{da_{i,j}^{l-1}}\)?
- 我们先来看几个特例,然后从中总结出一般性的规律:
- 计算\(\frac{dE}{da_{1,1}^{l-1}}\)?
答:
\( 因为a_{1,1}^{l-1}只与net_{1,1}^l有关,且net_{1,1}^l = w_{1,1}a_{1,1}^{l-1} + w_{1,2}a_{1,2}^{l-1} + w_{2,1}a_{2,1}^{l-1} + w_{2,2}a_{2,2}^{l-1} + w_b \\ 所以\frac{dE}{da_{1,1}^{l-1}}=\frac{dE}{dnet_{1,1}^{l}}\frac{dnet_{1,1}^l}{da_{1,1}^{l-1}} = \delta_{1,1}^l w_{1,1} \) - 计算\(\frac{dE}{da_{1,2}^{l-1}}\)?
答:\( 因为a_{1,2}^{l-1}与net_{1,1}^l, net_{1,2}^l有关,且\\ net_{1,1}^l = w_{1,1}a_{1,1}^{l-1} + w_{1,2}a_{1,2}^{l-1} + w_{2,1}a_{2,1}^{l-1} + w_{2,2}a_{2,2}^{l-1} + w_b \\ net_{1,2}^l = w_{1,1}a_{1,2}^{l-1} + w_{1,2}a_{1,3}^{l-1} + w_{2,1}a_{2,2}^{l-1} + w_{2,2}a_{2,3}^{l-1} + w_b \\ 所以\frac{dE}{da_{1,2}^{l-1}}=\frac{dE}{dnet_{1,1}^{l}}\frac{dnet_{1,1}^l}{da_{1,2}^{l-1}} + \frac{dE}{dnet_{1,2}^{l}}\frac{dnet_{1,2}^l}{da_{1,2}^{l-1}} \\ = \delta_{1,1}^l w_{1,2} + \delta_{1,2}^l w_{1,1} \) - 请总结出规律?
答:\( 不难发现,计算\frac{dE}{da_{i,j}^{l-1}},相当于把第l层误差项的周围补一圈0, 再与180度翻转后的filter进行互相关操作,就能得到想要结果,如下图所示: \)
计算公式是什么?
答:
\( \frac{dE}{da^{l-1}} = cross(padding(\delta^l), rotate180(W)) \\ \)
- 计算\(\frac{dE}{da_{1,1}^{l-1}}\)?
- 我们先来看几个特例,然后从中总结出一般性的规律:
-
如何求\(\frac{da_{i,j}^{l-1}}{dnet_{i,j}^{l-1}}=?\)
答:
\[\because a_{i,j}^{l-1} = f(net_{i,j}^{l-1}) \\ \therefore\frac{da_{i,j}^{l-1}}{dnet_{i,j}^{l-1}}= f'(net_{i,j}^{l-1}) \]- 因此,我们得到了最终的公式:
- 下面我们来推导步长为S的情况
- 我们来看看步长为2与步长为1的差别:
- 如何处理步长为2的情况?
- 如何将其统一为步长为1的情况?
答:我们可以看出,因为步长为2,得到的feature map跳过了步长为1时相应的部分。因此,当我们反向计算误差项时,我们可以对步长为S的sensitivity map相应的位置进行补0,将其『还原』成步长为1时的sensitivity map
- 如何将其统一为步长为1的情况?
- 下面我们来推导深度为D和Filter个数为N的情况
- 如果把每个深度看成一个结点,把互相关操作变成乘上权重,则深度为3、Filter个数为2的情况如下图所示:
- 第l-1层的d1影响了第l层的哪几个结点?
答:影响了第l层的所有结点,包括第l层的d1,d2 - 所以第l-1层的d1的误差项应该等于什么?
答:\(= 第l层的d1的误差项与第一个Filter反向计算出的第l-1层的误差项 + 第l层的d2的误差项与第二个Filter反向计算出的第l-1层的误差项\) - 因此,可以将误差项计算公式改为什么?
答:
结学
- 如何反向计算误差项?