首页
时事
民生
政务
教育
文化
科技
财富
体娱
健康
情感
更多
旅行
百科
职场
楼市
企业
乐活
学术
汽车
时尚
创业
美食
幽默
美体
文摘
卷积神经网络数学原理解析
文摘
2024-08-21 08:51
广东
作 者 | Piotr Skalski
原标题 | Gentle Dive into Math Behind Convolutional Neural Networks
翻 译 | 通夜(中山大学)、had_in(电子科技大学)
本篇
分享一篇关于CNN数学原理的解析,会让你
加深理解神经网络如何工作于CNNs。
出于建议,这篇文章将包括相当复杂的数学方程,如果你不习惯线性代数和微分也没事,目标不是记住这些公式,而是对下面发生的事情有一个直观的认识。
可视化和注释的完整源代码
:
GitHub:https://github.com/SkalskiP/ILearnDeepLearning.py
介绍
过去我们已经知道了这些紧密连接的神经网络。这些网络的神经元被分成若干组,形成连续的层layer。每一个这样的神经元都与相邻层的每一个神经元相连。下图显示了这种体系结构的一个示例。
图1. 密集连接的神经网络结构
当我们根据一组有限的人工设计的特征来解决分类问题时,这种方法很有效。例如,我们根据足球运动员在比赛期间的统计数据来预测他的位置。然而,当处理照片时,情况变得更加复杂。当然,我们可以将每个像素的像素值作为单独的特征,并将其作为输入传递给我们的密集网络。
不幸的是,为了让该网络适用于一张特定的智能手机照片,我们的网络必须包含数千万甚至数亿个神经元。另一方面,我们可以缩小我们的照片,但在这个过程中,我们会丢失一些有用的信息。
我们立马意识到传统的策略对我们没有任何作用,我们需要一个新的有效的方法,以充分利用尽可能多的数据,但同时减少必要的计算和参数量。
这就是CNNs发挥作用的时候了。
数字图像的数据结构
让我们先花一些时间来解释数字图像是如何存储的。你们大多数人可能知道它们实际上是由很多数字组成的矩阵。每一个这样的数字对应一个像素的亮度。在RGB模型中,彩色图像实际上是由三个对应于红、绿、蓝三种颜色通道的矩阵组成的。
在黑白图像中,我们只需要一个矩阵。每个矩阵都存储0到255之间的值。这个范围是存储图像信息的效率(256之内的值正好可以用一个字节表达)和人眼的敏感度(我们区分有限数量的相同颜色灰度值)之间的折衷。
图2. 数字图像的数据结构
卷积
核卷积不仅用于神经网络,而且是许多其他计算机视觉算法的关键一环。在这个过程中,我们采用一个形状较小的矩阵(称为核或滤波器),我们输入图像,并根据滤波器的值变换图像。后续的特征map值根据下式来计算,其中输入图像用f表示,我们的kernel用h表示,结果矩阵的行和列的索引分别用m和n表示。
图3. 核卷积的例子
将过滤器放置在选定的像素上之后,我们从kernel中提取每个相应位置的值,并将它们与图像中相应的值成对相乘。最后,我们总结了所有内容,并将结果放在输出特性图的对应位置。
上面我们可以看到这样的操作在细节上是怎么实现的,但是更让人关注的是,我们通过在一个完整的图像上执行核卷积可以实现什么应用。图4显示了几种不同滤波器的卷积结果。
图4. 通过核卷积得到边缘[原图像:https://www.maxpixel.net/Idstein-Historic-Center-Truss-Facade-Germany-3748512]
有效卷积和相同卷积
如图3所示,当我们用3x3核对6x6的图像进行卷积时,我们得到了4x4特征图。这是因为只有16个不同的位置可以让我们把滤波器放在这个图片里。因为每次卷积操作,图像都会缩小,所以我们只能做有限次数的卷积,直到图像完全消失。
更重要的是,如果我们观察卷积核如何在图像中移动,我们会发现位于图像边缘的像素的影响要比位于图像中心的像素小得多。这样我们就丢失了图片中包含的一些信息。通过下图,您可以知道像素的位置如何改变其对特征图的影响。
图5. 像素位置的影响
为了解决这两个问题,我们可以用额外的边框填充图像。例如,如果我们使用1px填充,我们将照片的大小增加到8x8,那么与3x3滤波器卷积的输出将是6x6。在实践中,我们一般用0填充额外的填充区域。这取决于我们是否使用填充,我们要根据两种卷积来判断-有效卷积和相同卷积。
这样命名并不是很合适,所以为了清晰起见:Valid表示我们仅使用原始图像,Same表示我们同时也考虑原图像的周围边框,这样输入和输出的图像大小是相同的。在第二种情况下,填充宽度应该满足以下方程,其中p为填充宽度和f是滤波器维度(一般为奇数)。
步幅卷积
图6. 步幅卷积的例子
在前面的例子中,我们总是将卷积核每次移动一个像素。但是,步幅也可以看作卷积层超参数之一。在图6中,我们可以看到,如果我们使用更大的步幅,卷积看起来是什么样的。
在设计CNN架构时,如果希望感知区域的重叠更少,或者希望feature map的空间维度更小,我们可以决定增加步幅。输出矩阵的尺寸——考虑到填充宽度和步幅——可以使用以下公式计算。
过渡到三维
空间卷积是一个非常重要的概念,它不仅能让我们处理彩色图像,更重要的是在单层中应用多个卷积核。第一个重要的原则是,过滤器和要应用它的图像必须具有相同通道数。基本上,这种方式与图3中的示例非常相似,不过这次我们将三维空间中的值与卷积核对应相乘。
如果我们想在同一幅图像上使用多个滤波器,我们分别对它们进行卷积,将结果一个叠在一起,并将它们组合成一个整体。接收张量的维数(即我们的三维矩阵)满足如下方程:n-图像大小,f-滤波器大小,nc-图像中通道数,p-是否使用填充,s-使用的步幅,nf-滤波器个数。
图7. 三维卷积
卷积层
现在是时候运用我们今天所学的知识来构建我们的CNN层了。
我们的方法和我们在密集连接的神经网络中使用的方法几乎是一样的,唯一的不同是这次我们将使用卷积而不是简单的矩阵乘法。
正向传播包括两个步骤。
第一步是计算中间值Z,这是利用输入数据和上一层权重W张量(包括所有滤波器)获得的卷积的结果,然后加上偏置b。
第二步是将非线性激活函数的应用到获得的中间值上(我们的激活函数表示为g)。对矩阵方程感兴趣的读者可以在下面找到对应的数学公式。顺便说一下,在下图中你可以看到一个简单的可视化,描述了方程中使用的张量的维数。
图8. 张量维度
连接剪枝和参数共享
在文章的开头,我提到密集连接的神经网络不擅长处理图像,这是因为需要学习大量的参数。既然我们已经理解了卷积是什么,让我们现在考虑一下它是如何优化计算的。
在下面的图中,以稍微不同的方式显示了二维卷积,以数字1-9标记的神经元组成了输入层,并接受图像像素亮度值,而A - D单元表示计算出的特征map元素。最后,I-IV是需要经过学习的卷积核的值。
图9. 连接剪枝和参数共享
现在,让我们关注卷积层的两个非常重要的属性。
首先,你可以看到,并不是所有连续两层的神经元都相互连接。例如,神经元1只影响A的值。
其次,我们看到一些神经元共享相同的权重。这两个性质都意味着我们需要学习的参数要少得多。
顺便说一下,值得注意的是,滤波器中的一个值会影响特征map中的每个元素——这在反向传播过程中非常重要。
卷积层反向传播
任何尝试过从头编写自己的神经网络代码的人都知道,完成正向传播还没有完成整个算法流程的一半。真正的乐趣在于你想要进行反向传播得到时候。现在,我们不需要为反向传播这个问题所困扰,我们可以利用深度学习框架来实现这一部分,但是我觉得了解底层是有价值的。就像在密集连接的神经网络中,我们的目标是计算导数,然后用它们来更新我们的参数值,这个过程叫做
梯度下降
。
在我们的计算中需要用到链式法则——我在前面的文章中提到过。我们想评估参数的变化对最终特征map的影响,以及之后对最终结果的影响。在我们开始讨论细节之前,让我们就对使用的数学符号进行统一——为了让过程更加简化,我将放弃偏导的完整符号,而使用如下所示的更简短的符号来表达。但记住,当我用这个符号时,我总是指的是损失函数的偏导数。
图10. 单卷积层的输入和输出的正向和反向传播
我们的任务是计算dW[l]和db[l]——它们是与当前层参数相关的导数,以及dA[l -1]的值——它们将被传递到上一层。如图10所示,我们接收dA[l]作为输入。当然,张量dW和W、db和b以及dA和A的维数是相同的。第一步是通过对输入张量的激活函数求导得到中间值dZ[l]。根据链式法则,后面将使用这个操作得到的结果。
现在,我们需要处理卷积本身的反向传播,为了实现这个目的,我们将使用一个矩阵运算,称为
全卷积
,如下图所示。注意,在这个过程中,对于我们使用卷积核,之前我们将其旋转了180度。这个操作可以用下面的公式来描述,其中滤波器用W表示,dZ[m,n]是一个标量,属于上一层偏导数。
图11. 全卷积
池化层
除了卷积层,CNNs还经常使用所谓的
池化层
。池化层主要用于减小张量的大小和加速计算。这种网络层很简单——我们需要将图像分割成不同的区域,然后对每个部分执行一些操作。
例如,对于最大值池化层,我们从每个区域中选择一个最大值,并将其放在输出中相应的位置。在卷积层的情况下,我们有两个超参数——滤波器大小和步长。最后一个比较重要的一点是,如果要为多通道图像进行池化操作,则应该分别对每个通道进行池化。
图12. 最大值池化的例子
池化层反向传播
在本文中,我们将只讨论最大值池化的
反向传播
,但是我们将学习的规则只需要稍加调整就可以适用于所有类型的池化层。由于在这种类型的层中,我们没有任何必须更新的参数,所以我们的任务只是适当地分布梯度。
正如我们所记得的,在最大值池化的正向传播中,我们从每个区域中选择最大值,并将它们传输到下一层。
因此,很明显,在反向传播过程中,梯度不应该影响矩阵中没有包含在正向传播中的元素。
实际上,这是通过创建一个掩码来实现的,该掩码可以记住第一阶段中使用的值的位置,稍后我们可以使用该掩码来传播梯度。
图13. 最大值池化的反向传播
参考:https://towardsdatascience.com/gentle-dive-into-math-behind-convolutional-neural-networks-79a07dd44cf9
http://mp.weixin.qq.com/s?__biz=MzkxMzUxNzEzMQ==&mid=2247488948&idx=1&sn=86e02ac1ea47ebaab19fb4333b9ef31d
机器学习实战
多名大厂算法工程师共同运营,主要专注机器学习算法、深度学习算法、计算机视觉等领域技术干货分享,一天进步一点点
最新文章
上海交大新聘AI博导,27岁!
SCI机器学习一区TOP,再次刷新顶刊巅峰!
刷脸背后,卷积神经网络的数学原理原来是这样的
一位中国博士把整个CNN都给可视化了,可交互有细节,每次卷积ReLU池化都清清楚楚
教高中生发顶会,看完还不懂来找我
PyTorch下的可视化工具(网络结构/训练过程可视化)
RTX 3090的深度学习环境配置指南:Pytorch、TensorFlow、Keras
有位大佬逐模块解析transformer结构
图解机器学习:贝叶斯算法
使用 YOLO 加速实时应用程序中的对象检测 !
算法岗平时需要自己写cuda吗?
13张动图快速理解马尔科夫链、PCA、贝叶斯!
使用 LSTM 进行多变量时间序列预测的保姆级教程
搞懂Transformer结构,看这篇PyTorch实现就够了
时间序列问题特征提取技巧(含Python代码)
【深度学习】既然英伟达A100/H100 太贵,为什么不用 4090?
李飞飞:我不知道什么是AGI
图解Numpy,这篇文章是真的强!
PyCharm vs VSCode,是时候改变你的 IDE 了!
苹果为什么不敢对 12306 买票抽成 30% ?
微信官方回应:为什么不做已读功能
中国高校面积Top10
六年、六届学生接力,共铸上交大图像合成工具箱libcom
超全!李航《统计学习方法》读书笔记
2026年量产!没有方向盘和踏板!特斯拉无人驾驶出租车发布
何恺明新作出炉!中稿NeurIPS 2024!HPT:异构预训练Transformer
复现Resnet论文那些事
ONNX:从入门到精通
硬核解读Stable Diffusion(完整版)
PyGWalker:最好用的数据分析Python库
7大类卷积神经网络(CNN)创新综述
ACL2024 | 破案了!大型语言模型中的涌现能力只是上下文学习吗?.
漂亮,LSTM模型结构的可视化
XGBoost 比深度学习还强?
Sapiens——强大的通用人类视觉模型
Plotly Express:一种简洁且强大的可视化神器
TensorSensor:可视化向量运算库
Seaborn可视化库:从入门到精通
从零开始学绘图!手把手教新手使用Matplotlib创建个性化图表
卷积神经网络数学原理解析
如何轻松掌握马尔科夫采样算法
虎扑高校排名公布!这JR们打分着实意想不到!
AI大语言模型不再遥不可及:本地化部署、智能体构建技术让每个人都能拥有
50个最佳机器学习公共数据集
如何向10岁小孩解释LDA(线性判别分析)算法
想学SVD(奇异值分解)算法?看这篇就够了
如何通俗理解PCA(主成分分析)算法的数学原理和代码实现
如何向10岁小朋友解释频率学派和贝叶斯学派
如何向10岁小孩解释PCA(主成分分析)算法
全网独一份!AI大模型学习训练资源...(限时免费领)
分类
时事
民生
政务
教育
文化
科技
财富
体娱
健康
情感
旅行
百科
职场
楼市
企业
乐活
学术
汽车
时尚
创业
美食
幽默
美体
文摘
原创标签
时事
社会
财经
军事
教育
体育
科技
汽车
科学
房产
搞笑
综艺
明星
音乐
动漫
游戏
时尚
健康
旅游
美食
生活
摄影
宠物
职场
育儿
情感
小说
曲艺
文化
历史
三农
文学
娱乐
电影
视频
图片
新闻
宗教
电视剧
纪录片
广告创意
壁纸头像
心灵鸡汤
星座命理
教育培训
艺术文化
金融财经
健康医疗
美妆时尚
餐饮美食
母婴育儿
社会新闻
工业农业
时事政治
星座占卜
幽默笑话
独立短篇
连载作品
文化历史
科技互联网
发布位置
广东
北京
山东
江苏
河南
浙江
山西
福建
河北
上海
四川
陕西
湖南
安徽
湖北
内蒙古
江西
云南
广西
甘肃
辽宁
黑龙江
贵州
新疆
重庆
吉林
天津
海南
青海
宁夏
西藏
香港
澳门
台湾
美国
加拿大
澳大利亚
日本
新加坡
英国
西班牙
新西兰
韩国
泰国
法国
德国
意大利
缅甸
菲律宾
马来西亚
越南
荷兰
柬埔寨
俄罗斯
巴西
智利
卢森堡
芬兰
瑞典
比利时
瑞士
土耳其
斐济
挪威
朝鲜
尼日利亚
阿根廷
匈牙利
爱尔兰
印度
老挝
葡萄牙
乌克兰
印度尼西亚
哈萨克斯坦
塔吉克斯坦
希腊
南非
蒙古
奥地利
肯尼亚
加纳
丹麦
津巴布韦
埃及
坦桑尼亚
捷克
阿联酋
安哥拉