深度学习基础课:卷积层的后向传播推导

大家好~本课程为“深度学习基础班”的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序

线上课程资料:

本节课录像回放1

本节课录像回放2

本节课录像回放3

加QQ群,获得ppt等资料,与群主交流讨论:106047770

本系列文章为线上课程的复盘,每上完一节课就会同步发布对应的文章

本课程系列文章可进入索引查看:

深度学习基础课系列文章索引

回顾相关课程内容

  • 卷积神经网络的局部连接和权重共享是指什么?
  • 卷积层的前向传播是如何计算的?
    image
  • 全连接层的后向传播算法是什么?
    答:先计算输出层的误差项,然后反向依次计算每层的误差项直到与输入层相连的层,最后根据每层的误差项和输入得到每层的梯度
  • 误差项的计算公式是什么?
    答:δk=dEdnetk
  • 全连接层的后向传播是如何推导?
    image

为什么要学习本课

  • 如何推导卷积层的后向传播?

主问题:如何推导卷积层的后向传播?

  • 卷积层的后向传播算法有哪些步骤?
    答:
    1.已知下一层计算的误差项,反向依次计算这一层的误差项
    2.计算这一层中每个权重值的梯度
  • 与全连接层中隐藏层的后向传播算法的步骤一样吗?有什么区别?
    答:步骤跟隐藏层是一样的,但是每个步骤的计算方法都不一样,这是因为:
    “局部连接”使得第一步误差项的计算方法不一样;
    “权值共享”则使得第二步变为计算Filter中的每个权重值的梯度;
  • 下面分别讨论这两个步骤的实现

主问题:如何反向计算误差项?

  • 我们先来考虑步长为1、输入的深度为1、filter个数为1的最简单的情况。
  • 假设输入的大小为33,filter大小为22,按步长为1卷积,我们将得到2*2的feature map。如下图所示:
    image
  • 其中layer l-1为当前层(卷积层),layer l为下一层
  • 在这里,我们假设第l层中的每个误差项都已经算好,我们要做的是计算第l-1层每个神经元的误差项
  • 它的计算公式是什么:

δi,jl1=?δi,jl1l1ij

答:

δi,jl1=dEdneti,jl1=dEdai,jl1dai,jl1dneti,jl1

ai,jl1l1ijneti,jl1l1ij

  • 如何求dEdai,jl1

    • 我们先来看几个特例,然后从中总结出一般性的规律:
      • 计算dEda1,1l1
        答:
        a1,1l1net1,1lnet1,1l=w1,1a1,1l1+w1,2a1,2l1+w2,1a2,1l1+w2,2a2,2l1+wbdEda1,1l1=dEdnet1,1ldnet1,1lda1,1l1=δ1,1lw1,1
      • 计算dEda1,2l1
        答:a1,2l1net1,1l,net1,2lnet1,1l=w1,1a1,1l1+w1,2a1,2l1+w2,1a2,1l1+w2,2a2,2l1+wbnet1,2l=w1,1a1,2l1+w1,2a1,3l1+w2,1a2,2l1+w2,2a2,3l1+wbdEda1,2l1=dEdnet1,1ldnet1,1lda1,2l1+dEdnet1,2ldnet1,2lda1,2l1=δ1,1lw1,2+δ1,2lw1,1
      • 请总结出规律?
        答:dEdai,jl1l0180filter
        image
        计算公式是什么?
        答:
        dEdal1=cross(padding(δl),rotate180(W))
  • 如何求dai,jl1dneti,jl1=?

答:

ai,jl1=f(neti,jl1)dai,jl1dneti,jl1=f(neti,jl1)

  • 因此,我们得到了最终的公式:

δl1=dEdnetl1=dEdal1dal1dnetl1=cross(padding(δl),rotate180(W))f(netl1)

δl1,δl,W,netl1elementwiseproduct

  • 下面我们来推导步长为S的情况
  • 我们来看看步长为2与步长为1的差别:
    image
  • 如何处理步长为2的情况?
    • 如何将其统一为步长为1的情况?
      答:我们可以看出,因为步长为2,得到的feature map跳过了步长为1时相应的部分。因此,当我们反向计算误差项时,我们可以对步长为S的δl相应的位置进行补0,将其『还原』成步长为1时的δl
  • 下面我们来推导深度为D和Filter个数为N的情况
  • 如果把每个深度看成一个结点,把互相关操作变成乘上权重,则深度为3、Filter个数为2的情况如下图所示:
    image
  • 第l-1层的d1影响了第l层的哪几个结点?
    答:影响了第l层的所有结点,包括第l层的d1,d2
  • 所以第l-1层的d1的误差项应该等于什么?
    答:=ld1Filterl1+ld2Filterl1
  • 因此,可以将误差项计算公式改为什么?
    答:

δdl1=n=0N1cross(padding(δnl),rotate180(Wd,n))f(netl1)

ddnFilternFilter

结学

  • 如何反向计算误差项?

任务:实现反向计算误差项

主问题:如何计算Filter每个权重值的梯度?

  • 我们要在得到本层的误差项的情况下,计算本层的Filter的权重的梯度
    image

ai,jl1l1Wi,jlfilterδi,jllWi,jdEdwi,jWi,jEWi,jneti,jlEWi,jneti,jl

  • 计算dEdw1,1
    • w1,1neti,jl

答:

net1,1l=w1,1a1,1l1+w1,2a1,2l1+w2,1a2,1l1+w2,2a2,2l1+wbnet1,2l=w1,1a1,2l1+w1,2a1,3l1+w2,1a2,2l1+w2,2a2,3l1+wbnet2,1l=w1,1a2,1l1+w1,2a2,2l1+w2,1a3,1l1+w2,2a3,2l1+wbnet2,2l=w1,1a2,2l1+w1,2a2,3l1+w2,1a3,2l1+w2,2a3,3l1+wb

W1,1neti,jlEneti,jlneti,jlw1,1dEdw1,1

dEdw1,1=dEdnet1,1ldnet1,1ldw1,1+dEdnet1,2ldnet1,2ldw1,1+dEdnet2,1ldnet2,1ldw1,1+dEdnet2,2ldnet2,2ldw1,1=δ1,1la1,1l1+δ1,2la1,2l1+δ2,1la2,1l1+δ2,2la2,2l1

  • 计算dEdw1,2

答:

dEdw1,2=δ1,1la1,2l1+δ1,2la1,3l1+δ2,1la2,3l1+δ2,2la2,3l1

  • 实际上,每个权重项导数的计算都是类似的,我们不一一举例了
  • 现在,是我们再次发挥想象力的时候,我们发现计算dEdwi,j的规律是什么?

答:

dEdwi,j=mnδm,nlai+m,j+nl1

也就是用误差项作为卷积核,在input上进行互相关操作,如下图所示:
image

  • 如何求偏置项的梯度dEdwb

答:

dEdwb=dEdnet1,1ldnet1,1lwb+dEdnet1,2ldnet1,2lwb+dEdnet2,1ldnet2,1lwb+dEdnet2,2ldnet2,2lwb=δ1,1l+δ1,2l+δ2,1l+δ2,2l=ijδi,jl

  • 如何处理步长为2的情况?
    image

答:对于步长为S的卷积层,处理方法与传递误差项时一样: 通过对δl补0,将其『还原』成步长为1的情况

  • 对于Filter个数为N和每个Filter的深度为D的情况,因为每个都对应输出图像的对应深度的Feature map和输入图像的对应深度的Feature map,每一个二维Filter只涉及到一次二维卷积运算
  • 所以只需分别计算N×D次每个二维Filter的导数,再将其组合成4维张量,即可求得整个Filter的导数

结学

  • 如何计算Filter每个权重值的梯度?

任务:实现计算Filter每个权重值的梯度

总结

  • 请总结本节课的内容?
  • 请回答开始的问题?

参考资料

扩展阅读

posted @   杨元超  阅读(99)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2019-12-26 WebGPU学习(十):介绍“GPU实现粒子效果”
点击右上角即可分享
微信分享提示