算法推导 | 卷积神经网络(CNN)反向传播

article/2025/10/9 8:37:55

作者丨南柯一梦宁沉沦@知乎 编辑丨极市平台

来源丨https://zhuanlan.zhihu.com/p/61898234

多层感知机反向传播的数学推导,主要是用数学公式来进行表示的,在全连接神经网络中,它们并不复杂,即使是纯数学公式也比较好理解。而卷积神经网络相对比较复杂,在本篇文章中我们将从直观感受和数学公式两方面来介绍CNN反向传播算法的推导。

首先我给大家介绍一下我分析delta误差反向传播过程的简单方法,如果神经网络l+1层某个结点的delta误差要传到l层,我们就去找前向传播时l+1层的这个结点和第l层的哪些结点有关系,权重是多少,那么反向传播时,delta误差就会乘上相同的权重传播回来。

假设第l层有一个结点a,l+1层有一个结点b。两个结点间的连接权重为w。如果前向传播时,结点a对结点b的影响是 。而反向传播时,结点b的delta误差 对结点a的delta误差 的影响是 。它们的系数都为两结点之间的连接权重。

卷积神经网络前向传播过程简要介绍

在理解卷积神经网络的反向传播之前,我们需要对卷积、池化以及卷积神经网络前向传播过程作一个简要的回顾。

卷积运算介绍

在卷积神经网络中,所谓的卷积运算,其实并不是严格的数学意义上的卷积。深度学习中的卷积实际上是信号处理和图像处理中的互相关运算,它们二者之间有细微的差别。深度学习中的卷积(严格来说是互相关)是卷积核在原始图像上遍历,对应元素相乘再求和,得到的新图像在尺寸上会有减小。可以通过下图直观的去理解。假设输入图像的有m行,n列,卷积核的尺寸为filter_size×filter_size,输出图像的尺寸即为(m-filter_size+1)×(n-filter_size+1)

273fe2ccf8d85ebc269453b1059c95c6.jpeg
图源http://ufldl.stanford.edu/tutorial/supervised/FeatureExtractionUsingConvolution/

在全连接神经网络,图像数据以及特征是以列向量的形式进行存储。而在卷积神经网络中,数据的格式主要是以张量(可以理解为多维数组)的形式存储。图片的格式为一个三维张量,行×列×通道数。卷积核的格式为一个四维张量,卷积核数×行×列×通道数

卷积操作是每次取出卷积核中的一个,一个卷积核的格式为三维,为行×列×通道数。对应通道序号的图片与卷积核经过二维卷积操作后(即上图所示操作),得到该通道对应的卷积结果,将所有通道的结果相加,得到输出图像的一个通道。每个卷积核对应输出图像的一个通道,即输出图像的通道数等于卷积核的个数。

这里概念有一点绕,但是卷积神经网络中所谓张量的卷积,本质上是进行了一共卷积核数×通道数二维卷积操作。每一个卷积核对应卷积结果的一个通道,每一个卷积核的通道对应原始图片的一个通道。这个操作和一个列向量乘上一个矩阵得到一个新的列向量有相似的地方。

下图直观地展示了张量卷积具体操作过程:

ed2688de5a8f71f4b55c48fb1638fd84.jpeg
图源http://cs231n.github.io/convolutional-networks/侵删

池化操作介绍

所谓的池化,就是对图片进行降采样,最大池化就是在图片中用每个区域的最大值代表这个区域,平均池化就是用每个区域平均值代表这个区域。

f8f74df358f63352f61c3bed9649514b.jpeg
图源http://cs231n.github.io/convolutional-networks/侵删

卷积神经网络反向传播推导

池化层反向传播

池化层的反向传播比较容易理解,我们以最大池化举例,上图中,池化后的数字6对应于池化前的红色区域,实际上只有红色区域中最大值数字6对池化后的结果有影响,权重为1,而其它的数字对池化后的结果影响都为0。假设池化后数字6的位置delta误差为 ,误差反向传播回去时,红色区域中最大值对应的位置delta误差即等于 ,而其它3个位置对应的delta误差为0。

因此,在卷积神经网络最大池化前向传播时,不仅要记录区域的最大值,同时也要记录下来区域最大值的位置,方便delta误差的反向传播。

而平均池化就更简单了,由于平均池化时,区域中每个值对池化后结果贡献的权重都为区域大小的倒数,所以delta误差反向传播回来时,在区域每个位置的delta误差都为池化后delta误差除以区域的大小。

卷积层反向传播

虽然卷积神经网络的卷积运算是一个三维张量的图片和一个四维张量的卷积核进行卷积运算,但最核心的计算只涉及二维卷积,因此我们先从二维的卷积运算来进行分析:

ff62b7aa4d780e79c2d0708512afaca0.jpeg

如上图所示,我们求原图A处的delta误差,就先分析,它在前向传播中影响了下一层的哪些结点。显然,它只对结点C有一个权重为B的影响,对卷积结果中的其它结点没有任何影响。因此A的delta误差应该等于C点的delta误差乘上权重B。

b7cef092b625d37f01ca0baa15e7268f.jpeg

我们现在将原图A点位置移动一下,再看看变换位置后A点的delta误差是多少,同样先分析它前向传播影响了卷积结果的哪些结点。经过分析,A点以权重C影响了卷积结果的D点,以权重B影响了卷积结果的E点。那它的delta误差就等于D点delta误差乘上C加上E点的delta误差乘上B。

大家可以尝试用相同的方法去分析原图中其它结点的delta误差,结果会发现,原图的delta误差,等于卷积结果的delta误差经过零填充后,与卷积核旋转180度后的卷积。如下图所示:

bad92782ae59912b21909195e75ec6d9.jpeg
图源https://grzegorzgwardys.wordpress.com/2016/04/22/8/侵删

好了,直观上的理解有了,我们接下来用数学公式来对此进行证明,尽管它们会有些枯燥:

让我们回顾一下delta误差的定义,是损失函数对于当前层未激活输出 的导数,我们现在考虑的是二维卷积,因此,每一层的delta误差是一个二维的矩阵。 表示的是第l层坐标为(x,y)处的delta误差。假设我们已经知道第l+1层的delta误差,利用求导的链式法则,可以很容易写出下式:

在这里,坐标(x',y')是第l+1层中在前向传播中受第l层坐标(x,y)影响到的点,它们不止一个,我们需要将它们加起来。再利用前向传播的关系式:

402 Payment Required

我们可以进一步将表达式展开:

后面一大串尽管看起来很复杂,但实际上很容易就可以简化:

402 Payment Required

同时我们得到两个限制条件 和

将限制条件代入上式可得:

再令 以及

402 Payment Required

我们最终的结论得到了:

我们可以短暂的庆祝一下子了,然而我们目前的结论还只是基于二维卷积,我们还需要把它推广到我们卷积神经网络中张量的卷积中去。

再回顾一下张量的卷积,后一层的每个通道都是由前一层的各个通道经过卷积再求和得到的。

等等,这个关系听起来好像有点熟悉,如果把通道变成结点,把卷积变成乘上权重,这个是不是和全连接神经网络有些类似呢?

b773ef5f79ca0223d3049ab64c19e924.jpeg

上图中每根连线都代表与一个二维卷积核的卷积操作,假设第l层深度为3,第l+1层深度为2,卷积核的维度就应该为2×filter_size×filter_size×3。第l层的通道1通过卷积影响了第l+1层的通道1和通道2,那么求第l层通道1的delta误差时,就应该根据求得的二维卷积的delta误差传播方式,将第l+1层通道1和通道2的delta误差传播到第l层的delta误差进行简单求和即可。

已知第l层delta误差,求该层的参数的导数

,

第l层卷积核 是一个4维张量,它的维度表示为卷积核个数×行数×列数×通道数。实际上,可以把它视为有卷积核个数×通道数个二维卷积核,每个都对应输入图像的对应通道和输出图像的对应通道,每一个二维卷积核只涉及到一次二维卷积运算。那求得整个卷积核的导数,只需分析卷积核数×通道数次二维卷积中每个二维卷积核的导数,再将其组合成4维张量即可。

所以我们分析二维卷积即可:

498a25175763ca2d9aa0f7405e3b9e89.jpeg

可以利用之前的分析方法,卷积核上点A显然对卷积结果每一个点都有影响。它对卷积结果的影响等于将整个原图左上3×3的部分乘上点A的值,因此delta误差反向传播回时,点A的导数等于卷积结果的delta误差与原图左上3×3红色部分逐点相乘后求和。因此二维卷积核的导数等于原图对应通道与卷积结果对应通道的delta误差直接进行卷积。

402 Payment Required

我们将原图通道数×卷积结果通道数个二维卷积核的导数重新进行组合成4为张量,即可得到整个卷积核的导数。

下面我们从数学公式进行推导:

402 Payment Required

同样我们可以进行简化,并得到两个限制条件: 和 :

这一次我们并不需要进行旋转180度这种操作。

已知第l层delta误差,求该层的参数的导数

我们的 是一个列向量,它给卷积结果的每一个通道都加上同一个标量。因此,在反向传播时,它的导数等于卷积结果的delta误差在每一个通道上将所有delta误差进行求和的结果。

402 Payment Required

提供简单的公式证明如下:

402 Payment Required

由于 为1

所以:

得证

卷积神经网络包括卷积层,池化层和全连接层,本文介绍了卷积层和池化层的反向传播算法以及各层参数导数的计算方法,全连接层的反向传播方法以及参数导数的计算在之前文章中也介绍过了。

让我们对卷积神经网络的训练过程进行一个总结:

  1. 对神经网络进行初始化,定义好网络结构,设定好激活函数,对卷积层的卷积核W、偏置b进行随机初试化,对全连接层的权重矩阵W和偏置b进行随机初始化。
    设置好训练的最大迭代次数,每个训练batch的大小,学习率

  2. 从训练数据中取出一个batch的数据

  3. 从该batch数据中取出一个数据,包括输入x以及对应的正确标注y

  4. 将输入x送入神经网络的输入端,得到神经网络各层输出参数和

  5. 根据神经网络的输出和标注值y计算神经网络的损失函数

  6. 计算损失函数对输出层的delta误差

  7. 利用相邻层之间delta误差的递推公式求得每一层的delta误差
    如果是全连接层δδσ
    如果是卷积层

    402 Payment Required


    如果是池化层

    402 Payment Required

  8. 利用每一层的delta误差求出损失函数对该层参数的导数
    如果是全连接层:
    δ ,δ
    如果是卷积层:

  9. 将求得的导数加到该batch数据求得的导数之和上(初始化为0),跳转到步骤3,直到该batch数据都训练完毕

  10. 利用一个batch数据求得的导数之和,根据梯度下降法对参数进行更新

    402 Payment Required


    402 Payment Required

  11. 跳转到步骤2,直到达到指定的迭代次数

参考:

[1]刘建平Pinard:卷积神经网络(CNN)反向传播算法

[2]Grzegorz Gwardys:Convolutional Neural Networks backpropagation: from intuition to derivation

[3]Kunlun Bai:A Comprehensive Introduction to Different Types of Convolutions in Deep Learning

[4]CS231n Convolutional Neural Networks for Visual Recognition

猜您喜欢:

c36b5ec242f62d87b51a129248acf3e6.png 戳我,查看GAN的系列专辑~!

一顿午饭外卖,成为CV视觉前沿弄潮儿!

CVPR 2022 | 25+方向、最新50篇GAN论文

 ICCV 2021 | 35个主题GAN论文汇总

超110篇!CVPR 2021最全GAN论文梳理

超100篇!CVPR 2020最全GAN论文梳理

拆解组新的GAN:解耦表征MixNMatch

StarGAN第2版:多域多样性图像生成

附下载 | 《可解释的机器学习》中文版

附下载 |《TensorFlow 2.0 深度学习算法实战》

附下载 |《计算机视觉中的数学方法》分享

《基于深度学习的表面缺陷检测方法综述》

《零样本图像分类综述: 十年进展》

《基于深度神经网络的少样本学习综述》

09bd1a1a0fea24bffe795d1872396d1f.png


http://chatgpt.dhexx.cn/article/Yuo6vbA0.shtml

相关文章

深入浅出学习Hive

本文是基于CentOS 7.9系统环境,进行hive的学习和使用 一、Hive的简介 1.1 Hive基本概念 (1) 什么是hive Hive是用于解决海量结构化日志的数据统计工具,是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供…

你知道豆瓣电影是怎么评分的吗?(实战篇—手把手教你分析豆瓣电影)

点赞再看,养成好习惯 Python版本3.8.0,开发工具:Pycharm 写在前面的话: 如果你是因为看到标题进来的,那恭喜你,又多了一个涨(入)知(坑)识的机会。 在这篇豆…

万字入门推荐系统!

最近一周我、强子、Y哥三人,根据自身如何入门推荐系统,再结合三人分别在腾讯做广告推荐、字节做视频推荐、百度做信息流推荐的经历,整理出了这份万字入门推荐系统。内容十分详细,涵盖了推荐系统基础、进阶、实战的全部知识点&…

【原创】LeetCode刷题-Python版

文章目录 LeetCode1、两数之和*2、两数相加3、无重复字符的最长子串**4、寻找两个正序数组的中位数**5、最长回文子串**动态规划思维导图6、Z 字形变换7、整数反转8、字符串转换整数 (atoi)9、回文数10、正则表达式匹配*11、盛最多水的容器*12、整数转罗马数字13、 罗马数字转整…

c语言 字符串切片重组成完整,bash脚本之一(变量+数组)

bash的变量与数组 变量:存储单个元素的内存空间; 也相当于是数组的0号索引。 数组:存储多个元素的连续的内存空间; 一、变量 1、介绍: 任何程序都需要变量。 变量是用来存储数据的。程序指令数据。 按照其变量是否需要…

最重要Python面试题,逻辑题,Python与数学之美

从数学归纳法谈起: 什么是数学归纳法? 从两个有趣的问题谈起: 1)怎么证明一堆人中所有人都是希腊人? 2)思考题:怎么证明所有人都是秃子? 什么是数学归纳法? 最简单和常…

OpenCV--Python

1、cv2.imread()读入图像;第一个参数为图像路径;第二个为cv2.IMREAD_COLOR:读入彩色图像;cv2.IMREAD_GRAYSCALE:读入灰度图像。 2、显示图像cv2.imshow() 3、保存图像cv2.imwrite() 4、获取视频先创建一个videocapture对象。参…

python - Pandas基础

pandas 简介 基于numpy的工具 高效提供了大量库和一些标准的数据模型 相当于Numpy的一维数组,但是与普通的一维数组不同,Series支持对数据的自定义标签也就是index(索引),通过索引可以访问Series的元素 Series 索引 简单的创建 import pandas as pd sel pd.…

【阿里内部教程】python初阶:基础语法 python全栈自动化测试系类

目录 很多小伙伴可能都没有看过凡哥的视频,所以大家可能对凡哥不是很了解这里先和大家来个自我介绍 凡哥我已经有着十二年互联网自动化测试和测试开发工程师,拥有丰富的自动化测试平台及测试开发经验,擅长接口测试、Python自动化全栈&#x…

opencv python 常用方法

点击:OpenCV--Python 基本使用 一、基本方法 1、cv2.imread() 读入图像;第一个参数为图像路径;第二个为cv2.IMREAD_COLOR:读入彩色图像;cv2.IMREAD_GRAYSCALE:读入灰度图像。 import cv2 import matplotlib.pyplot …

iOS开发通过微信学习WCDB(四)

最近打算将封装一个基于wcdb操作的数据库私有库,在封装使用的过程中遇到了一些问题,将问题整理了一下,分享给大家。 私有pod库依赖于WCDB 造成lint失败 最开始遇到这个问题的时没有眉目,后来看到打包方式都是静态库,后…

微信移动端数据库组件WCDB系列(二) — 数据库修复三板斧

前言 长久以来SQLite DB都有损坏问题,从Android、iOS等移动系统,到Windows、Linux 等桌面系统都会出现。由于微信所有消息都保存在DB,服务端不保留备份,一旦损坏将导致用户消息被清空,显然不能接受。 我们即将开源的移…

微信 WCDB for Android的接入

接入 WCDB Android 项目接入 WCDB,可以选择通过 Maven 接入或通过 AAR 包接入。 通过 Maven 接入 对于大部分开发者,推荐使用 Maven 接入 WCDB,在 APP 模块的 build.gradle 下添加 WCDB 依赖即可 dependencies {// 修改"1.0.0"…

关于WCDB Swift 的一些简易使用

wcdb 开源地址:https://github.com/Tencent/wcdb 一、wcdb介绍 引用官方说法:“WCDB Swift 是一个易用、高效、完整的移动数据库框架,它基于 SQLite 和 SQLCipher 开发。” 鹅厂出品的值得信赖。于是就打算在新的项目中使用它。 三大特性…

微信 WCDB 正式开源——高效易用的移动数据库框架

前沿介绍 腾讯开源微信数据库框架WCDB,他是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android。 便捷地定义表、索引、约束,并进行增删改查操作 项目演示效果如下: 微信 即时通讯软件 微信&#x…

Wcdb android 目录,WCDB漫谈

前言 移动端的数据库选型一直是一个难题,直到前段时间看到了WeMobileDev(微信前端团队)放出了第三个开源组件-WCDB WCDB(WeChat DataBase)是微信官方的移动端数据库组件,致力于提供一个高效、易用、完整的移动端存储方案 微信团队怎么说 基于SQLCipher W…

iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用

iOS开发-关于微信WCDB的使用 WCDB嵌套模型的使用 前言开发前准备开发关于生成WCDB文件 选择new file即可找到关于嵌套模型的生成 分两步 选择new file即可找到增删改查的封装使用 总结 前言 iOS开发中有需要数据库的存储,表的增删改查等,FMDB和最近流行…

iOS开发通过微信学习WCDB(三)

通过之前的两篇文章对wcdb能够简单的使用了,这些知识储备多时,最近终于可以派上用场了,最近app有一个通讯录的新功能,实现联系人列表的排序,以及检索,刚好可以用用wcdb去实现。 联系人模型的建立 我首先建…

WCDB使用笔记

本地数据加密 由于项目涉及到一些用户隐私数据的存储,所以需要对保存在客户端本地的数据进行加密,以防止用户隐私数据在设备被root的情况下出现泄漏。目前android的本地数据存储基本分为file,sharepreference和database,所以对数…

iOS开发通过微信学习WCDB(一)

最近通过对微信ipa包解压发现微信有使用WCDB这个开源库,搜索了一下了解到WCDB(WeChat Database)是一个高效、完整、易用的移动数据库框架,基于SQLCipher,支持iOS, macOS和Android。经过分析对比,个人感觉WC…