3. CNN卷积网络-反向更新

完整机器学习实现代码GitHub
欢迎转载,转载请注明出处https://www.cnblogs.com/huangyc/p/10036246.html
欢迎沟通交流: 339408769@qq.com


 


1. CNN卷积网络-初识

2. CNN卷积网络-前向传播算法

3. CNN卷积网络-反向更新

1. 前言

如果读者详细的了解了DNN神经网络的反向更新,那对我们今天的学习会有很大的帮助。我们的CNN卷机网络中有3种网络结构。1. 卷积层,2.池化层,3.全连接层。全连接层的反向传播的方式和DNN的反向传播的方式是一样的,因为DNN的所有层都是全连接的结构。卷机层和池化层下文会继续讲解。

2. 全连接反向更新

这里先回顾下DNN的反向更新,我们进行反向更新主要是计算每一层的W,b的梯度。

J(W,b)Wl=J(W,b,x,y)zlzlWl=δl(al1)T

J(W,b,x,y)bl=J(W,b)zlzlbl=δl

我们现在的目标只要计算每层的δ,就可以算出每层的W,b的梯度。最后一层的δ很好计算,即

δL=J(W,b,x,y)zL=(aLy)σ(zL)

如果我们能够通过后一层的δ推算出前一层的δ那就把问题完全解决了。

δl=δl+1zl+1zl=(Wl+1)Tδl+1σ(zl)

以上就是全连接层的反向更新的过程。需要明确的一点是以上的推到是有一个前提的:

al=σ(zl)=σ(Wlal1+bl)

这个是前向传播的公式。所以卷积层和池化层的前向传播的公式不一样,那在对反向更新中的参数求导的过程也会变化。

3. 卷积层的反向传播

首先我们看下卷积层的前向传播公式:

al=σ(zl)=σ(al1Wl+b)

其中的Wl是不是一个矩阵,矩阵的定义是2维的,而我们的Wl是一个张量,可以理解为多个矩阵的组合,或者理解为矩阵的数组。

由于前向传播公式的改变,卷积层求每层的δl递推方法肯定有所不同。又由于W用的运算是卷积,那么计算卷积核的W,b的方式也不同。

3.1 求δl的递推公式

我们先求δl,它的递推公式还是DNN中的那个。

δl=J(W,b)zl=J(W,b)zl+1zl+1zl=δl+1zl+1zl(1)

因此和DNN一样,计算δl的任务就转化成了计算zl+1zl,那卷积层中的zl+1zl怎么计算呢?

zl=al1Wl+bl=σ(zl1)Wl+bl

所以有

δl1=δlzlzl1=δlrot180(Wl)σ(zl1)

这里的式子其实和DNN的类似,区别在于对于含有卷积的式子求导时,卷积核被旋转了180度。即式子中的rot180(),翻转180度的意思是上下翻转一次,接着左右翻转一次。在DNN中这里只是矩阵的转置。

3.2 已知δl,求W,b的梯度

卷积层zW,b的关系为:

zl=al1Wl+b

则有带入(1)中得到:

J(W,b)Wl=J(W,b)zlzlWl=al1δl

其中的运算符和前向传播公式是一样的,是卷积的过程。可以把张量展开。

J(W,b)Wl=(a11l1a12l1a13l1a14l1a21l1a22l1a23l1a24l1a31l1a32l1a33l1a34l1a41l1a42l1a43l1a44l1)(δ11lδ12lδ21lδ22l)

δl当作卷积核,去扫描al1的张量,就得出了J(W,b)Wl的梯度。

而对于b,则稍微有些特殊,因为δl是三维张量,而b只是一个向量,不能像DNN那样直接和δl相等。通常的做法是将δl的各个子矩阵的项分别求和,得到一个误差向量,即为b的梯度:

J(W,b)bl=u,v(δl)u,v

4. 池化层的反向更新

在前向传播算法时,池化层一般我们会用MAX或者Average对输入进行池化,池化的区域大小已知。现在我们反过来,要从缩小后的误差δl,还原前一次较大区域对应的误差。

在反向传播时,我们首先会把δl的所有子矩阵矩阵大小还原成池化之前的大小,然后如果是MAX,则把δl的所有子矩阵的各个池化局域的值放在之前做前向传播算法得到最大值的位置。如果是Average,则把δl的所有子矩阵的各个池化局域的值取平均后放在还原后的子矩阵位置。这个过程一般叫做upsample。

用一个例子可以很方便的表示:假设我们的池化区域大小是2x2。δl的第k个子矩阵为:

δkl=(2846)

由于池化区域为2x2,我们先讲δkl做还原,即变成

(0000028004600000)

如果是MAX,假设我们之前在前向传播时记录的最大值位置分别是左上,右下,右上,左下,则转换后的矩阵为:

(2000000804000060)

如果是Average,则进行平均:转换后的矩阵为:

(0.50.5220.50.522111.51.5111.51.5)

这样我们就得到了上一层J(W,b)akl1的值:

J(W,b)akl1=upsample(δkl)

所以δkl1为:

δkl1=J(W,b)akl1akl1zkl1=upsample(δkl)σ(zkl1)

5. 总结

以上就是CNN卷积网络的反向更新的过程,CNN卷积网络的更新和DNN还是有很大的不同,需要读者仔细思考这个过程,最好找个简单的例子能够手推一下整个过程,能够对整个过程有更深刻的理解。

posted @   hyc339408769  阅读(4912)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示