大家好~本课程为“深度学习基础班”的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序
线上课程资料:
本节课录像回放1
本节课录像回放2
本节课录像回放3
加QQ群,获得ppt等资料,与群主交流讨论:106047770
本系列文章为线上课程的复盘,每上完一节课就会同步发布对应的文章
本课程系列文章可进入索引查看:
深度学习基础课系列文章索引
回顾相关课程内容
- 卷积神经网络的局部连接和权重共享是指什么?
- 卷积层的前向传播是如何计算的?

- 全连接层的后向传播算法是什么?
答:先计算输出层的误差项,然后反向依次计算每层的误差项直到与输入层相连的层,最后根据每层的误差项和输入得到每层的梯度
- 误差项的计算公式是什么?
答:δk=dEdnetk
- 全连接层的后向传播是如何推导?

为什么要学习本课
主问题:如何推导卷积层的后向传播?
- 卷积层的后向传播算法有哪些步骤?
答:
1.已知下一层计算的误差项,反向依次计算这一层的误差项
2.计算这一层中每个权重值的梯度
- 与全连接层中隐藏层的后向传播算法的步骤一样吗?有什么区别?
答:步骤跟隐藏层是一样的,但是每个步骤的计算方法都不一样,这是因为:
“局部连接”使得第一步误差项的计算方法不一样;
“权值共享”则使得第二步变为计算Filter中的每个权重值的梯度;
- 下面分别讨论这两个步骤的实现
主问题:如何反向计算误差项?
- 我们先来考虑步长为1、输入的深度为1、filter个数为1的最简单的情况。
- 假设输入的大小为33,filter大小为22,按步长为1卷积,我们将得到2*2的feature map。如下图所示:

- 其中layer l-1为当前层(卷积层),layer l为下一层
- 在这里,我们假设第l层中的每个误差项都已经算好,我们要做的是计算第l-1层每个神经元的误差项
- 它的计算公式是什么:
δl−1i,j=?δl−1i,j表示第l−1层第i行第j列的误差项
答:
δl−1i,j=dEdnetl−1i,j=dEdal−1i,jdal−1i,jdnetl−1i,j
al−1i,j表示第l−1层第i行第j列神经元的输出netl−1i,j表示第l−1层第i行第j列神经元的加权输入
-
如何求dEdal−1i,j?
- 我们先来看几个特例,然后从中总结出一般性的规律:
- 计算dEdal−11,1?
答:
因为al−11,1只与netl1,1有关,且netl1,1=w1,1al−11,1+w1,2al−11,2+w2,1al−12,1+w2,2al−12,2+wb所以dEdal−11,1=dEdnetl1,1dnetl1,1dal−11,1=δl1,1w1,1
- 计算dEdal−11,2?
答:因为al−11,2与netl1,1,netl1,2有关,且netl1,1=w1,1al−11,1+w1,2al−11,2+w2,1al−12,1+w2,2al−12,2+wbnetl1,2=w1,1al−11,2+w1,2al−11,3+w2,1al−12,2+w2,2al−12,3+wb所以dEdal−11,2=dEdnetl1,1dnetl1,1dal−11,2+dEdnetl1,2dnetl1,2dal−11,2=δl1,1w1,2+δl1,2w1,1
- 请总结出规律?
答:不难发现,计算dEdal−1i,j,相当于把第l层误差项的周围补一圈0,再与180度翻转后的filter进行互相关操作,就能得到想要结果,如下图所示:

计算公式是什么?
答:
dEdal−1=cross(padding(δl),rotate180(W))
-
如何求dal−1i,jdnetl−1i,j=?
答:
∵al−1i,j=f(netl−1i,j)∴dal−1i,jdnetl−1i,j=f′(netl−1i,j)
δl−1=dEdnetl−1=dEdal−1dal−1dnetl−1=cross(padding(δl),rotate180(W))∘f′(netl−1)
其中:δl−1,δl,W,netl−1都是矩阵符号∘为elementwiseproduct,即将矩阵中每个对应元素相乘
- 下面我们来推导步长为S的情况
- 我们来看看步长为2与步长为1的差别:

- 如何处理步长为2的情况?
- 如何将其统一为步长为1的情况?
答:我们可以看出,因为步长为2,得到的feature map跳过了步长为1时相应的部分。因此,当我们反向计算误差项时,我们可以对步长为S的δl相应的位置进行补0,将其『还原』成步长为1时的δl
- 下面我们来推导深度为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层的误差项
- 因此,可以将误差项计算公式改为什么?
答:
δl−1d=N−1∑n=0cross(padding(δln),rotate180(Wd,n))∘f′(netl−1)
其中:d为深度序号,即第d层n为Filter的序号,即第n个Filter
结学
任务:实现反向计算误差项
主问题:如何计算Filter每个权重值的梯度?
- 我们要在得到本层的误差项的情况下,计算本层的Filter的权重的梯度

如上图所示,al−1i,j是第l−1层的输出,Wi,j是第l层filter的权重,δli,j是第l层的误差项。我们的任务是计算Wi,j的梯度,即dEdwi,j为了计算偏导数,我们需要考察权重Wi,j对E的影响:权重项Wi,j通过影响netli,j的值,进而影响E我们仍然通过几个具体的例子来看权重项Wi,j对netli,j的影响,然后再从中总结出规律。
- 计算dEdw1,1?
- w1,1对哪几个netli,j有影响?
答:
netl1,1=w1,1al−11,1+w1,2al−11,2+w2,1al−12,1+w2,2al−12,2+wbnetl1,2=w1,1al−11,2+w1,2al−11,3+w2,1al−12,2+w2,2al−12,3+wbnetl2,1=w1,1al−12,1+w1,2al−12,2+w2,1al−13,1+w2,2al−13,2+wbnetl2,2=w1,1al−12,2+w1,2al−12,3+w2,1al−13,2+w2,2al−13,3+wb
从上面的公式看出,由于权值共享,权值W1,1对所有的netli,j有影响因为E是所有所有的netli,j的函数,而所有的netli,j又都是w1,1的函数所以根据全导数公式,计算dEdw1,1是要把每个偏导数都加起来:
dEdw1,1=dEdnetl1,1dnetl1,1dw1,1+dEdnetl1,2dnetl1,2dw1,1+dEdnetl2,1dnetl2,1dw1,1+dEdnetl2,2dnetl2,2dw1,1=δl1,1al−11,1+δl1,2al−11,2+δl2,1al−12,1+δl2,2al−12,2
答:
dEdw1,2=δl1,1al−11,2+δl1,2al−11,3+δl2,1al−12,3+δl2,2al−12,3
- 实际上,每个权重项导数的计算都是类似的,我们不一一举例了
- 现在,是我们再次发挥想象力的时候,我们发现计算dEdwi,j的规律是什么?
答:
dEdwi,j=∑m∑nδlm,nal−1i+m,j+n
也就是用误差项作为卷积核,在input上进行互相关操作,如下图所示:

答:
dEdwb=dEdnetl1,1dnetl1,1wb+dEdnetl1,2dnetl1,2wb+dEdnetl2,1dnetl2,1wb+dEdnetl2,2dnetl2,2wb=δl1,1+δl1,2+δl2,1+δl2,2=∑i∑jδli,j
也就是偏置项的梯度就是所有误差项之和
- 如何处理步长为2的情况?

答:对于步长为S的卷积层,处理方法与传递误差项时一样:通过对δl补0,将其『还原』成步长为1的情况
- 对于Filter个数为N和每个Filter的深度为D的情况,因为每个都对应输出图像的对应深度的Feature map和输入图像的对应深度的Feature map,每一个二维Filter只涉及到一次二维卷积运算
- 所以只需分别计算N×D次每个二维Filter的导数,再将其组合成4维张量,即可求得整个Filter的导数
结学
任务:实现计算Filter每个权重值的梯度
总结
参考资料
扩展阅读
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
2019-12-26 WebGPU学习(十):介绍“GPU实现粒子效果”