一 背景
在卷积神经网络CNN 出现之前,图像对于人工智能来说就是一个灾难,主要是有两个原因:
-
图像需要处理的数据量太大,导致成本很高,效率很低; -
图像在数值化的过程中很难保留原有的特征,导致图像处理的准确率不高;
1 参数共享机制
假设我们使用全连接层进行图像特征的提取,即使使用最简单的数据集例如MNIST数据。每个图片的尺寸是28x28x1,其中28x28是图片的大小,1是表示图像是黑白的,即只有一个色彩通道。假设第一层的隐藏层的节点数量是600,那么这个全连接神经网络将有28x28x600+600=471000个参数。这还仅仅是最简单的数据集,如果是其他的复杂的数据集参数量会更加迅速的膨胀。过多的参数有两方面的坏处,一是计算会严重减慢;另外一个就是非常容易过拟合。所以需要一个更加合理的神经网路结构来有效的减少参数数量,同时保持原始数据的特征,进行抽象。
2 平移不变原理
图片数字化的传统方式我们简化一下,就类似下图的过程:
![alt](https://i-blog.csdnimg.cn/blog_migrate/18ab8a5b040032b6ba64f3a2157c7434.png)
假如图像中有一个圆形,那么基于圆形的位置的不同就会产生完全不同的数据表征。但是从视觉的角度来看,「图像的内容(本质)并没有发生变化,只是位置发生了变化」,这就产生了一个矛盾。
所以当我们移动图像中的物体,用传统的方式得出来的数据表征会差异很大!无法满足也不符合图像处理的要求的。
「而 CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。」
3 模型结构灵感
深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。
1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和TorstenWiesel,以及 Roger Sperry。前两位的主要贡献,是“「发现了视觉系统的信息处理」”,可视皮层是分级的。
人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。下面是人脑进行人脸识别的一个示例:
![人类视觉原理1](https://i-blog.csdnimg.cn/blog_migrate/f0a5e473b3c13fa09bc63b66f3fd8c4f.png)
对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的:
![人类视觉原理2](https://i-blog.csdnimg.cn/blog_migrate/603400ce121e215c282e775dae77f292.jpeg)
我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。
那么我们可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?
「答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。」
二 卷积神经网络CNN
❝对于神经网络来说,相信大家都比较熟悉全连接神经网络,那么卷积神经网络CNN与全连接神经网络相比有什么不同呢,又是为什么有这些不同呢?后续的内容将会为大家娓娓道来。
❞
1 CNN网络结构特点
对于神经网络,针对神经元不同的连接方式,有几种经典的网络类型:「全连接神经网络、卷积神经网络与循环神经网络」等等。
-
全连接神经网络: -
神经元分层布局; -
相邻层与层之间的神经元之间均有连接; -
相同层之间的神经元之间没有连接; -
参数非共享;
-
-
卷积神经网络: -
神经元分层布局; -
相邻层与层之间的神经元之间有部分连接,而非全连接; -
相同层之间的神经元之间没有连接; -
参数共享;
-
![alt](https://i-blog.csdnimg.cn/blog_migrate/66efd39221cbe2156644fdfb18255fa0.png)
虽然上图显示的全连接神经网络和卷积神经网络的模型结构在直观上来看差异比较大,但是实际上它们的整体结构是非常相似的。
-
层级性:卷积神经网络也是通过一层一层的节点组织起来的。 -
基本单元:和全连接神经网络一样,卷积神经网络中的每个节点都是一个神经元。 -
层级连通性: -
在全连接神经网络中,相邻层与层之间的节点都有边相连,于是一般会将每一层全连接层中的节点组织成一列,方便展示模型结构。 -
在卷积神经网络中,相邻层与层之间的节点只有部分节点相连,根据图像的特点,为了展示每一层神经元的维度,一般会将每一层卷积层的节点组成一个三维矩阵。
-
2 模型整体结构
下面我们给出一个更加具体的模型结构(以分类问题为例)。
![alt](https://i-blog.csdnimg.cn/blog_migrate/99b25851155600ebe5bed8e152615ba0.png)
❝如上图,在卷积神经网络的前面几层,每一层的节点都被表示成一个三维的矩阵形式。比如处理Cifar-10图片数据集的时候,我们将要输入一个32x32x3的三维矩阵。从上图我们可以看出,卷积神经网络的前面几层中,每一个节点只是和上一层的部分的节点相连(具体的连接方式会在第三、四节介绍)。一般来说,一个卷积神经网络主要由以下五种结构组成。
❞
-
输入层:输入层是整个神经网络的输入,在处理图像的卷积神经网络结构中,代表一张图片的像素矩阵。比如上图中, 「三维矩阵的长和宽分别代表了图像的大小,而三维矩阵的深度代表了图像的色彩通道(channel)。比如黑白图片的深度为1,而在RGB模式下,图像的深度为3」。从输入层开始,卷积神经网络通过不同的神经网络结构将上一层的三维矩阵转化为下一层的三维矩阵,直到最后的全连接层。 -
卷积层: 「从卷积层这个名字标识可以看出,它是整个卷积神经网络最为重要的部分。不同于全连接层的网络结构,卷积层每个节点的输入是只是上一层神经元的一部分(非全部),这个小块常用的大小有3x3或者5x5」。卷积层试图将神经网络中的每一小块更加深入的分析从而得到抽象程度更高的特征。一般来说,通过卷积层处理过的节点矩阵会变得更深,所以在上图可以看到经过卷积层之后的节点矩阵的深度会增加。 -
池化层: 「池化层在卷积神经网络结构中也非常重要,池化层的神经网络不会改变三维矩阵的深度,但是他会减小矩阵的大小」。池化层的操作可以这么理解,它将一张分辨率较高的图片转化为一个分辨率较低的图片。通过池化层,可以显著的减少最后全连接层中节点的个数,从而达到减少整个神经网络中参数的目的。 -
全连接层:卷积神经网络一般操作是经过多轮的卷积层和池化层,在最后节点一般是由1到2个全连接层来给出最后的结果。经过几轮卷积层和池化层的处理之后,图像中的信息已经被抽象成了信息密度更高的特征。 「卷积层和池化层可以理解为自动抽取图像的特征的过程」。在处理完特征后,再通过全连接来进行分类和回归任务。 -
Softmax层:与普通的softmax层功能一样,用于处理分类问题。
三 卷积层
❝本节介绍卷积层的结构及其前向传播的过程,下图展示了卷积神经网络最重要的结构,这个结构被称之为过滤器(Filter)或者内核(Kernel)。内核的作用是将当前神经网络层的一部分神经元转化为下一个神经网络层的一个单位节点矩阵(单位节点矩阵是指长和宽都是1,深度不限的节点矩阵)。
❞
![alt](https://i-blog.csdnimg.cn/blog_migrate/475b72297e426027abb7976fe61e971b.png)
-
内核的尺寸
内核矩阵的尺寸是三维的,但是我们仅仅需要指定长和宽就好,因为内核的矩阵的深度和当前神经网络层的矩阵的深度是一致的。另外需要特别指定的是输出单位节点矩阵的深度,通常我们将这个深度称之为内核矩阵的深度。常用的内核大小是3x3或者5x5。
-
卷积层参数的数量
基于卷积神经网络参数共享的性质,下面我们来分析下卷积层的参数的数量,假设输入层的节点数量是32x32x3,内核的尺寸是2x2,转换后的单位节点矩阵的尺寸是1x1x5。那么根据卷积神经网络参数共享的性质,可以得到卷积层的参数的个数是2x2x3x5+5=65个参数。对比下使用全连接的神经网络的情况,假设卷积层后三维矩阵的长度与宽度不变(全0填充,后续介绍),深度变为5,那么整体参数是 32x32x3x32x32x5 + 32x32x5 = 15733760(一千五百万多参数)。由此可见,使用卷积层之后,参数量会大大减少,并且基于平移不变原理,基本保留了图像的深度特征进行抽象。
-
单个单位节点矩阵的计算方式
![alt](https://i-blog.csdnimg.cn/blog_migrate/775d9cef21af11aad3185db92cd852eb.png)
假设输入层的深度为3,内核的尺寸是2x2,生成的单位节点矩阵是1x1x1,那么计算的过程如上图所示(f函数是Relu函数)。
PS:如果生成的单位节点矩阵的深度不是1,是N的话,那么就再有N组参数进行计算。比如N的2的话。增加参数 ,并且进行 的计算,计算流程与 的计算方法相同。
-
卷积层的计算逻辑流程
-
节点生成映射关系
针对输入的神经网络层的神经元,先不考虑深度因素,我们考虑二维的结构。首先内核作用于左上角矩阵,然后移动到左下角矩阵,再到右上角矩阵,最后到右下角矩阵。内核每移动一次,可以计算出一个值(深度为N的时候会计算出N个值,详见上面的描述)。并且将这些数值拼接成一个新的矩阵,这样就完成了卷积层前向传播的过程。如下如所示:
![alt](https://i-blog.csdnimg.cn/blog_migrate/634c21563f7cccc8cfaa9be611712d5d.png)
-
矩阵尺寸的变化(长度与宽度)
「当内核的尺寸不是1x1的时候,卷积层经过前向传播得到的矩阵的尺寸会小于当前层军阵的尺寸」,如上图所示。如果要保持矩阵尺寸不变化的话,可以在当前矩阵的边界上进行全0的填充(zero-padding)。这样可以使得卷积层经过前向传播后得到的矩阵的尺寸和当前层的矩阵保持一致,如下图是使用全0填充的效果。
![alt](https://i-blog.csdnimg.cn/blog_migrate/ec9669b70276d474190db4bcf71faa31.png)
「除了内核的尺寸会影响卷积层经过前向传播得到矩阵的尺寸外,stride步长也会影响」,针对上图使用全0填充,并且步长为2(长度宽度均是2)的情况下,卷积层操作如下
![alt](https://i-blog.csdnimg.cn/blog_migrate/6c52ad30f8d10517f39d7add40877c70.png)
-
卷积层前向传播得到矩阵的最终尺寸计算
针对是否使用全0填充,分别计算公式如下:
-
使用全0填充
![alt](https://i-blog.csdnimg.cn/blog_migrate/1fdd668950529b58ecd0578b2c50e2bc.png)
-
不用全0填充
![alt](https://i-blog.csdnimg.cn/blog_migrate/2a6911bf3d2ed2ad149000fb573a8880.png)
四 池化层
❝池化层最重要的特点,没有可训练参数,没有可训练参数,没有可训练参数,重要的事情三遍,所以其反向传播链式求导过程会非常不同,因为没有参数可导,这块后面的章节会进行介绍。池化层的作用是缩小矩阵的尺寸,但是基本不改变深度,从而减少最后全连接层的输入与参数。同时池化层既可以加快计算速度又可以防止过拟合问题。
❞
1 池化层的正向传播
「同卷积层类似,池化层的内核也是需要设定尺寸、是否全0填充以及步长等,而且这些设置的意义也是一样的。同时卷积层和池化层的内核的移动方式也相似的」。池化层的一般作用是对特征图进行下采样,它本身没有参数权重,计算也简单,但它可达到降维特征、突显特征、减少参数量、减少计算量、增加非线性、防止过拟合及提升模型泛化能力等作用,池化层的前向传播我们都比较好理解区别有两点:
-
池化层的计算不需要参数参与,分为最大池化(max pooling)和平均池化(average pooling),顾名思义,直接计算max直接选最大,average加和平均。 -
池化层由于不改变矩阵的深度,所以不会跨越整个深度进行影响,本深度只影响本深度的,一一对应。
下面是Max Pooling的一个示例,大家可以理解下,由于大部分流程与卷积层类似,所以这块不过多描述。
![alt](https://i-blog.csdnimg.cn/blog_migrate/cecd97db245a73317a6d18b52fe2236d.png)
2 池化层的反向传播
❝池化层pooling操作常见的有平均池化mean pooling和最大池化max pooling,前者取某特征区域的平均值进行输出,而后者则取某特征区域的最大值进行输出。但是其是如何参与反向传播的呢?
❞
池化层在反向传播时,由于没有参数参数计算正向传播过程,所以它是不可导的,并且池化层会缩小矩阵的尺寸,比如一个2x2的池化,经过池化层输出的特征图是16个神经元,那么对应当前层就会有64个神经元,两层之间经过池化操作后,特征图尺寸改变,无法一一对应,这使得梯度无法传播。
在反向传播时,「梯度是按照链式法则进行传播的,但是池化层没有参数,那那么要解决的问题就是如何这个虚拟的链路与计算规则,并且要遵守传播梯度总和保持不变的原则」。
以最大池化为例,前向传播过程是取一定特征区域的最大值进行输出,所以本区域只有最大值的神经元参与了前向传播过程。因此在反向传播过程中只需将该区域的梯度直接分配到最大值的神经元就好,其他神经元的梯度被分配为0并且不参与反向传播过程。
但是如何确认最大值神经元呢?这个需要深度学习框架在进行前向传播时记录下最大值神经元的Max ID位置,反向传播的时候将梯度回传给这个神经元就好。
![alt](https://i-blog.csdnimg.cn/blog_migrate/8d10c24c4c183f1916fa912e0f6f3433.png)
五 番外篇
❝个人介绍:杜宝坤,隐私计算行业从业者,从0到1带领团队构建了京东的联邦学习解决方案9N-FL,同时主导了联邦学习框架与联邦开门红业务。 框架层面:实现了电商营销领域支持超大规模的工业化联邦学习解决方案,支持超大规模样本PSI隐私对齐、安全的树模型与神经网络模型等众多模型支持。 业务层面:实现了业务侧的开门红业务落地,开创了新的业务增长点,产生了显著的业务经济效益。 个人比较喜欢学习新东西,乐于钻研技术。基于从全链路思考与决策技术规划的考量,研究的领域比较多,从工程架构、大数据到机器学习算法与算法框架均有涉及。欢迎喜欢技术的同学和我交流,邮箱:「baokun06@163.com」
❞
六 公众号导读
自己撰写博客已经很长一段时间了,由于个人涉猎的技术领域比较多,所以对高并发与高性能、分布式、传统机器学习算法与框架、深度学习算法与框架、密码安全、隐私计算、联邦学习、大数据等都有涉及。主导过多个大项目包括零售的联邦学习,社区做过多次分享,另外自己坚持写原创博客,多篇文章有过万的阅读。公众号「秃顶的码农」大家可以按照话题进行连续阅读,里面的章节我都做过按照学习路线的排序,话题就是公众号里面下面的标红的这个,大家点击去就可以看本话题下的多篇文章了,比如下图(话题分为:一、隐私计算 二、联邦学习 三、机器学习框架 四、机器学习算法 五、高性能计算 六、广告算法 七、程序人生),知乎号同理关注专利即可。
![alt](https://i-blog.csdnimg.cn/blog_migrate/06d85bb24fde6fb74de1f448d7092b23.png)
一切有为法,如梦幻泡影,如露亦如电,应作如是观。
本文由 mdnice 多平台发布