百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

卷积神经网络推导-神经网络卷积运算公式

moboyou 2025-04-23 14:11 53 浏览

本文论文来自:

卷积神经网络注释,Jake Bouvrie。

这个主要是一些关于CNN推导和实现的笔记,看这个笔记之前最好先有一些CNN的基础知识,这里也给大家一个可以参考的资源:

[1] 深度学习学习笔记系列(第七部分)

[2]LeNet-5,卷积神经网络

[3] 卷积神经网络

[4]手写数字识别神经网络

[5] 深度学习:三十八(Stacked CNN简单介绍)

[6] 基于梯度的学习应用于文档识别。

[7] 使用深度卷积神经网络进行 Imagenet 分类。

[8]UFLDL中的“卷积特征提取”和“池化”。

[9] 反向传播BP算法

卷积神经网络笔记

1. 简介

本文档讨论了 CNN 的推导和实现。CNN 架构的连接数比权重多得多,这意味着某种形式的正则化。这个特定的网络假设我们想要以数据驱动的方式学习一些过滤器,以此从输入中提取特征。

本文首先描述了训练全连接网络的经典BP算法,然后推导了2D CNN网络的卷积层和下采样层的BP权重更新方法。在推导过程中,我们强调实现的效率,因此会给出一些Matlab代码。最后,我们转而讨论如何自动学习组合前一层的特征图。特别地,我们还学习了特征图的稀疏组合。

2.全连接反向传播算法

在典型的 CNN 中,前几层是交替卷积和下采样,然后最后几层(靠近输出层)都是全连接的一维网络。至此,我们已经将所有二维的 2D 特征图转换为全连接的一维网络的输入。这样,当你准备将最终的 2D 特征图输入到 1D 网络时,一个非常方便的方法就是将所有输出的特征图连接成一个长的输入向量。然后我们回到 BP 算法的讨论。(更详细的基本推导请参考 UFLDL 中的“反向传播算法”)。

2.1 前馈传递

在下面的推导中,我们使用平方误差成本函数。我们正在讨论一个总共有 c 个类和 N 个训练样本的多类问题。

这里

表示第n个样本对应标签的第k维。

表示第n个样本对应的网络输出的第k个输出。对于多分类问题,输出一般以“one-of-c”的形式组织,也就是只有输入对应的类的输出节点是正数,其他类的位或节点都是0或者负数,这取决于你的输出层的激活函数。sigmoid就是0,tanh就是-1。

因为整个训练集上的误差就是每个训练样本的误差之和,所以这里我们先考虑一个样本的BP,第n个样本的误差表示为:

在传统的全连接神经网络中,我们需要按照BP规则计算代价函数E关于网络每个权值的偏导数,我们用l来表示当前层,因此当前层的输出可以表示为:

输出激活函数 f(.) 有很多种,通常是 sigmoid 函数或者双曲正切函数。sigmoid 会将输出压缩到 [0, 1] 之间,所以最终的输出平均值一般会趋向于 0。所以如果我们将训练数据归一化为均值为零、方差为 1,就可以增加梯度下降过程中的收敛性。对于归一化的数据集,双曲正切函数也是一个不错的选择。

2.2 反向传播过程

传播回去的误差可以看成是每个神经元的基的敏感度(敏感度的意思是我们的基b变化多少,误差就会变化多少,也就是误差对于基的变化率,也就是导数),定义如下:(第二个等号是根据链式求导法则得到的)

因为u/b=1,E/b=E/u=δ,这意味着偏差基础E/b=δ的灵敏度等于误差E对某个节点E/u的所有输入u的导数。这个导数就是让高层误差反向传播到底层的魔法。反向传播可以用下面的关系来表达:(下面的公式表达了第l层的灵敏度,即)

公式1)

这里的“o”表示每个元素都相乘。输出层神经元的敏感度不同:

最后,应用delta(或δ)规则更新每个神经元的权重。具体来说,对于给定的神经元,获取其输入,然后使用此神经元的delta(或δ)对其进行缩放。以向量形式表示,对于第l层,该层每个权重(组合成矩阵)的误差的导数是该层的输入(等于前一层的输出)与该层的灵敏度(该层中每个神经元的δ组合成向量)的叉积。然后获得的偏导数乘以负学习率就是该层神经元权重的更新:

公式(2)

偏差基础的更新表达式类似。事实上,每个权重 (W)ij 都有一个特定的学习率 ηIj。

3.卷积神经网络

3.1 卷积层

现在我们重点讨论网络中卷积层的BP更新。在卷积层中,上一层的特征图与一个可学习的卷积核进行卷积,然后经过激活函数得到输出的特征图。每个输出图可能是多个输入图组合的值:

这里 Mj 表示选定的输入图的集合,那么选择哪些输入图呢?有些人会选择一对或者三个。但下面我们将讨论如何自动选择需要组合的特征图。每个输出图都会给出一个额外的偏置 b,但对于特定的输出图,每个输入图的卷积核是不同的。换句话说,如果输出特征图 j 和输出特征图 k 都是由输入图 i 通过卷积求和得到的,那么对应的卷积核是不同的。

3.1.1 计算梯度

我们假设每一个卷积层l都连接着一个下采样层l+1。对于BP来说,根据上述,为了得到l层中每一个神经元对应权重的权重更新,我们需要先计算出l层中每一个神经节点的敏感度δ(即权重更新公式(2))。为了计算这个敏感度,我们需要先把下一层节点(与当前l层感兴趣的节点相连的l+1层节点)的敏感度相加(得到δl+1),然后乘以这些连接对应的权重(连接第l层感兴趣的节点和第l+1层节点的权重)W。然后乘以当前l层神经元节点对输入u的激活函数f的导值(即敏感度反向传播公式(1)的δl的解),这样就可以得到当前l层中每一个神经节点对应的敏感度δl。

但由于下采样的原因,采样层中一个像素(神经元节点)的敏感度δ对应着卷积层(前一层)输出图的一个像素(采样窗口大小),因此第l层中某个图的每个节点只与第l+1层中对应图的一个节点相连。

为了能够有效的计算出第l层的敏感度,我们需要对下采样后的层对应的敏感度图进行一次上采样(特征图中的每一个像素对应一个敏感度,所以也构成了一个图),使得这个敏感度图的大小与卷积层的图大小一致,然后将第l层的图的激活值的偏导数与从第l+1层开始上采样得到的敏感度图逐元素相乘(即公式(1))。

下采样层图的权重均取相同的值β,为一个常数,因此我们只需要将上一步得到的结果乘以β,便可完成第l层敏感度δ的计算。

我们可以对卷积层中的每个特征图j重复同样的计算过程。但显然我们需要匹配相应的子采样层的图(参考公式(1)):

up(.) 表示上采样操作。如果下采样因子为 n,它只是将每个像素水平和垂直复制 n 次。这样就恢复了原始大小。实际上,这个函数可以使用 Kronecker 积来实现:

好了,现在我们可以计算给定图的敏感度图了。然后我们可以通过简单地将第 l 层敏感度图中的所有节点相加来快速计算偏差基础的梯度:

公式(3)

最后,卷积核权重的梯度可以用BP算法计算(公式(2))。另外,很多连接的权重是共享的,所以对于给定的权重,我们需要计算该点所有与该权重相关的连接(权重共享的连接)的梯度,然后对这些梯度求和,就像上面对偏置项的梯度计算一样:

这里,

是的

在卷积中

输出卷积图的(u,v)位置的值是前一层的(u,v)位置上的patch与卷积核k_ij逐元素相乘的结果。

乍一看,似乎我们需要费力地记住输出图(以及对应的敏感度图)的每个像素对应输入图的哪个块。但实际上,在 Matlab 中,这可以用一个代码来实现。对于上面的公式,我们可以使用 Matlab 的卷积函数来实现它:

我们首先旋转增量敏感度图,这样我们就可以进行互相关计算,而不是卷积(在卷积的数学定义中,特征矩阵(卷积核)在传递给 conv2 之前需要翻转。也就是说,特征矩阵的行和列是反转的)。然后我们将输出反旋转回来,这样当我们在前向传播中进行卷积时,卷积核就在我们想要的方向。

3.2. 子采样层

对于子采样层,有 N 个输入图和 N 个输出图,但每个输出图变得更小。

down(.) 表示下采样函数。典型操作是对输入图像的不同 nxn 块的所有像素求和。这样,输出图像在两个维度上都缩小了 n 倍。每个输出图对应其自己的乘性偏差 β 和加性偏差 b。

3.2.1 计算梯度

这里最难的部分是计算敏感度图。一旦我们有了这个,我们需要更新的唯一偏置参数β和b就很容易了(公式(3))。如果下一个卷积层与这个子采样层完全连接,那么子采样层的敏感度图就可以通过BP计算出来。

我们需要计算卷积核的梯度,因此我们必须找到输入图中的哪个patch对应于输出图中的哪个像素。这里,我们必须找到当前层的敏感度图中的哪个patch对应于下一层的敏感度图中的给定像素,这样我们就可以像公式(1)中那样使用delta递归,也就是敏感度反向传播。此外,我们需要乘以输入patch和输出像素之间的连接的权重,这实际上是卷积核(旋转)的权重。

在此之前,我们需要对核进行旋转,以便卷积函数进行互相关计算。另外,我们需要处理卷积边界,不过在Matlab中,这更容易处理。Matlab中的全卷积会用0填充缺失的输入像素。

此时,我们可以计算 b 和 β 的梯度。首先,加法基础 b 的计算与上面的卷积层相同,只需将敏感度图中的所有元素相加即可:

至于乘性偏置β,由于在前向传播过程中涉及到下采样图的计算,所以最好在前向过程中保存这些图,这样在反向计算中就不需要重新计算了。我们定义:

这样β的梯度就可以计算如下:

3.3. 学习特征图的组合

很多时候,通过对多个输入图进行卷积,然后将这些卷积值相加得到一个输出图,效果往往比较好。在一些文献中,一般都是人工来选择将哪些输入图组合起来得到一个输出图。但这里我们尝试让CNN在训练过程中学习这些组合,也就是让网络学会选择哪些输入图来计算最佳的输出图。我们用αij来表示第i个输入图在得到第j个输出图时的权重或者贡献。这样,第j个输出图可以表示为:

需要满足约束:

这些对变量 αij 的约束可以通过将变量 αij 表示为一组不受约束的隐式权重 cij 的 softmax 函数来强制执行(因为 softmax 因变量是自变量的指数函数,所以它们的变化率会有所不同)。

因为对于固定的j,每组权重cij与其他组的权重无关,所以为了描述方便,我们去掉下标j,只考虑一个映射的更新。其他映射的更新也是同样的过程,只是映射索引j不同。

Softmax函数的导数表示为:

这里δ是克罗内克δ。误差关于第l层变量αi的导数为:

最后,可以通过链式法则得到成本函数关于权重ci的偏导数:

3.3.1 强制稀疏组合

为了限制 αi 的稀疏性,即限制一个输出图只与部分输入图相连,而不是与全部输入图相连,我们在总体成本函数中添加了一个稀疏约束项 Ω(α)。对于单个样本,将成本函数重写为:

然后求出这个正则化约束项对权重ci导数的贡献,正则化项Ω(α)对αi的导数为:

然后,根据链式法则,ci 的导数为:

因此,权重ci的最终梯度为:

3.4 使用 MATLAB 加速

CNN的训练主要基于卷积层和下采样层的交互,其主要计算瓶颈是:

1)前向传播过程:对每个卷积层的地图进行下采样;

2)反向传播过程:对高级子采样层的敏感度图进行上采样,以匹配底层卷积层的输出图的大小;

3)S形函数的应用及推导。

针对第一点和第二点问题,我们考虑如何利用Matlab内置的图像处理函数实现上采样和下采样操作。对于上采样,imresize函数可以做到,但是需要很大的开销。一个更快的版本是使用克罗内克积函数kron。通过用全一矩阵ones和我们需要上采样的矩阵做克罗内克积,就能达到上采样的效果。对于前向传播过程中的下采样,imresize并没有提供在缩小图像的同时计算nxn块中像素和的功能,所以不能使用。一个更好更快的方法是用全一的卷积核对图像进行卷积,然后简单地使用标准指数法对最后的卷积结果进行采样。 比如降采样域为2x2,那么我们可以用一个元素全为1的2x2卷积核对图像进行卷积,然后在卷积后的图像中每2个点采集一次数据,y=x(1:2:end,1:2:end),这样既可以得到一倍的降采样,又可以同时起到求和的效果。

对于第三个问题,其实有些人觉得在 Matlab 中内联定义 sigmoid 函数会更快,其实不然,Matlab 不同于 C/C++ 等语言,Matlab 的内联比普通的函数定义更省时,因此我们可以在代码中直接使用真实的代码来计算 sigmoid 函数及其导数。

相关推荐

Excel批量生成随机人名_excel批量生成随机数

之前的文章讲过怎么用在Excel生成随机银行名字。今天继续给大家分享下怎么在Excel生成随机人名。随机数据工具包书接上回,本文对之前的随机数据生成工具包进行封装调用,生成的结果直接写入到Excel表...

一学就会:Excel MOD函数,让数字周期循环变得easy

今日推荐:MOD函数。目的:根据当前日期在年内的周数对5个小组取余,再根据余数的值获取对应的值班小组。MOD函数也可以作为获取随机数的一种,只不过这种随机数是有一定规律的。【函数介绍】MOD——返回两...

1条公式,自动随机分配座位,你会么?

随机座位困局、老办法效率低、新公式能否破局?.上周学校开会说要给教室换排座位,教务处老师愁得头发都快白了。以前都是靠老师自己写名单再划拉划分组,现在新教室三列座位,学生又多,折腾了三天都没摆顺当。听说...

excel快速制作姓名随机分配表_姓名随机分组

快速制作随机分配表。当需要把这一列的姓名进行随机分组应该怎么操作?是不是还在一行一行的去复制粘贴,这样效率是非常慢的。怎么快速的制作一个随机的分组?·首先在第一组输入等于第一个姓名的A2单元格,双击填...

Excel里实现随机分组案例:导入名单随机分组

大家好呀,今天来给大家分享如何快速在Excel里实现随机分组。如下图所示,有15个人,现在要随机分成3组,每组5个人。只要简单两步,就能完成分组。第一步:为每个人设置一个随机数并编序号C列输入公式=R...

办公必备的15个Excel技巧,绝对的硬核干货,收藏备用

Excel的灵魂在于数据的分析与统计,而分析与统计就离不开函数或公式,今天要给大家分享的15个函数公式,是工作中常用的,可以直接套用。一、从身份证号码中提取出生年月。函数1:Tex...

Excel如何将某单元格区域数据随机排序

如下图是某公司人员名单,现在想要对这些员工进行随机分组。即对单元格区域内数据进行随机排序。选中B2:E10单元格区域点击下图选项(Excel工具箱,百度它即可了解详细的下载安装方法,本文这里就不做具体...

一键生成随机口算题,Excel工具妙用

小学生每天都要做口算,今天我给大家分享一下如何用excel来自制小学生的口算题。看我这里已经做好了,它的公式是这样,然后往下去拉,想要多少要多少,而且每一道题都是随机的。而且这一个表做好了之后,只要让...

Excel秒变抽签神器!1分钟搞定随机点名/抽奖

还在为年会抽奖、课堂点名、分组任务抓狂?别求人写代码啦!Excel自带隐藏大招1分钟设置,永久使用,按个键就能开抽超简单3步设置(有手就会版)1随机号生成在姓名表旁新建「随机号」列输入=RAND...

基础函数20例,案例解读,再不掌握就真的Out了

Excel中的函数是Excel的一个重要工具,如果你不及时掌握,对于Excel的应用、工作效率等会受到很大的影响,今天,小编给大家分享20个Excel的基础函数,对大家肯定很有帮助。练习文件在文末领取...

怎么利用Excel实现随机取样_excel随机取数据

今天跟大家分享一下Excel如何随机抽样1.打开Excel软件2.选中要抽取数据的单元格区域3.点击下图选项(Excel工具箱,百度即可了解详细下载安装信息,本文这里就不做详细解说。)4.点击【统计与...

1分钟学会Excel总表更新,分表实时同步,再也不用熬夜了!

你是不是还在用筛选→复制→粘贴的老方法拆分Excel数据?每次按类别整理报表都要折腾半小时?别傻了!今天教你用FILTER函数一键搞定,数据更新还能自动同步!第一步:准备工作表新建3个工作表,分...

excel计算几个数范围,excel怎么计算一个范围的个数

excel怎么计算某些范围的数的个数,需要计算0-5,5-10,10-15,……1000的...比如这些数字在A列,从B1至B10求10个范围的数量。在B1输入:=countif(a:a,=10)在B...

让Excel随机排序_excel如何设置随机排序

随机排序如下图,希望对A列的应聘人员随机安排面试顺序。先将标题复制到右侧的空白单元格内,然后在第一个标题下方输入公式:=SORTBY(A2:B11,RANDARRAY(10),1)RANDARRAY的...

对人员进行随机分组,分步骤详细解释,看了就学会了

大家好,我是套路EXCEL!如上图,需要将12个人随机分成3组,每组4人。函数公式如下:=ROUNDUP(CHOOSECOLS(SORT(HSTACK(ROW(1:12),RANDARRAY(12...