卷积神经网络推导-神经网络卷积运算公式
liebian365 2024-12-28 23:51 13 浏览 0 评论
本文论文来自:
卷积神经网络注释,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)
这里的“?”表示每个元素都相乘。输出层神经元的敏感度不同:
最后,应用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 函数及其导数。
- 上一篇:男女生的“平均脸”长这样…
- 下一篇:基于 PID 控制的离散控制系统实现
相关推荐
- 4万多吨豪华游轮遇险 竟是因为这个原因……
-
(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...
- “菜鸟黑客”必用兵器之“渗透测试篇二”
-
"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...
- 科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白
-
作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...
- 麦子陪你做作业(二):KEGG通路数据库的正确打开姿势
-
作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...
- 知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势
-
智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...
- 每日新闻播报(September 14)_每日新闻播报英文
-
AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...
- 香港新巴城巴开放实时到站数据 供科技界研发使用
-
中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...
- 5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper
-
本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...
- Qt动画效果展示_qt显示图片
-
今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...
- 如何从0到1设计实现一门自己的脚本语言
-
作者:dong...
- 三年级语文上册 仿写句子 需要的直接下载打印吧
-
描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...
- C++|那些一看就很简洁、优雅、经典的小代码段
-
目录0等概率随机洗牌:1大小写转换2字符串复制...
- 二年级上册语文必考句子仿写,家长打印,孩子照着练
-
二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)