机器学习算法之——走近卷积神经网络(CNN)

走近卷积神经网络(CNN)

“卷积神经网络”这个名字,早已被各位社友朋友所熟知,在图像和语音识别方面能够给出更好的结果。相比较其他深度、前馈神经网络,卷积神经网络需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。
在这里插入图片描述

the history of Convolutional Neural Network development

想要深入了解卷积神经网络的发展历史的社友,可以参看这篇博客:一文带你了解卷积神经网络CNN的发展史,我这里就只贴出一张CNN历史进程图。

卷积神经网络,听起来像是计算机科学、生物学和数学的诡异组合,但它们已经成为计算机视觉领域中最具影响力的革新的一部分。神经网络在 2012 年崭露头角,Alex Krizhevsky 凭借它们赢得了那一年的 ImageNet 挑战赛(大体上相当于计算机视觉的年度奥林匹克),他把分类误差记录从 26% 降到了 15%,在当时震惊了世界。论文地址:https://www.aminer.cn/archive/imagenet-classification-with-deep-convolutional-neural-networks/53e9a281b7602d9702b88a98

自那之后,大量公司开始将深度学习用作服务的核心。Facebook 将神经网络用于自动标注算法、谷歌将它用于图片搜索、亚马逊将它用于商品推荐、Pinterest 将它用于个性化主页推送、Instagram 将它用于搜索架构。

在这里插入图片描述

然而,应用这些网络最经典最流行的案例是进行图像处理。在图像处理任务中,让我们看一下如何使用卷积神经网络进行图像分类。

问题空间

图像分类是对输入图像的操作,最终输出一组最好地描述了图像内容的分类(如猫、狗等)或分类的概率。对人类来说,识别是打出生便开始学习的技能之一,对成人来说更是信手拈来,毫不费力。我们只需一眼便能快速识别我们所处的环境以及环绕在我们身边的物体。当我们看到一张图片或是环看四周的时候,无需刻意观察,多数时候也能立即描述出场景特征并标记出每一个对象。快速识别不同模式、根据早前知识进行归纳、以及适应不同的图像环境一直都是人类的专属技能,机器尚未享有。

在这里插入图片描述

输入与输出

当计算机看到一张图像(输入一张图像)时,它看的是一大堆像素值。根据图片的分辨率和尺寸,它将看到一个 32 x 32 x 3 的数组(3 指代的是 RGB 值)。为了讲清楚这一点,假设我们有一张 JPG 格式的 480 x 480 大小的彩色图片,那么它对应的数组就有 480 x 480 x 3 个元素。其中每个数字的值从 0 到 255 不等,其描述了对应那一点的像素灰度。当我们人类对图像进行分类时,这些数字毫无用处,可它们却是计算机可获得的唯一输入。其中的思想是:当你提供给计算机这一数组后,它将输出描述该图像属于某一特定分类的概率的数字(比如:80% 是猫、15% 是狗、5% 是鸟)。

我们想要计算机做什么

现在我们知道了问题所在以及输入与输出,就该考虑如何处理了。**我们想要计算机能够区分开所有提供给它的图片,以及搞清楚猫猫狗狗各自的特有特征。**这也是我们人类的大脑中不自觉进行着的过程。当我们看到一幅狗的图片时,如果有诸如爪子或四条腿之类的明显特征,我们便能将它归类为狗。同样地,计算机也可以通过寻找诸如边缘和曲线之类的低级特点来分类图片,继而通过一系列卷积层级建构出更为抽象的概念。这是 CNN(卷积神经网络)工作方式的大体概述,下面是具体细节。

生物学连接

首先介绍些背景。当你第一次听到卷积神经网络这一术语,可能会联想到神经科学或生物学,那就对了。可以这样说。CNN 的确是从视觉皮层的生物学上获得启发的。视觉皮层有小部分细胞对特定部分的视觉区域敏感。Hubel 和 Wiesel 于 1962 年进行的一项有趣的试验详细说明了这一观点,他们验证出大脑中的一些个体神经细胞只有在特定方向的边缘存在时才能做出反应(即放电)。例如,一些神经元只对垂直边缘兴奋,另一些对水平或对角边缘兴奋。Hubel 和 Wisesl 发现所有这些神经元都以柱状结构的形式进行排列,而且一起工作才能产生视觉感知。这种一个系统中的特定组件有特定任务的观点(视觉皮层的神经元细胞寻找特定特征)在机器中同样适用,这就是 CNN 的基础。

结构

回到细节上来。更为详细的 CNN 工作概述指的是你挑一张图像,让它历经一系列卷积层、非线性层、池化(下采样(downsampling))层和完全连接层,最终得到输出。正如之前所说,输出可以是最好地描述了图像内容的一个单独分类或一组分类的概率。如今,难点在于理解其中每一层的工作方法。我们先来看最重要的部分。

在这里插入图片描述

用于图像分类问题的一种卷积神经网络框架图

第一层——数学角度

CNN 的第一层通常是卷积层(Convolutional Layer)。首先需要了解卷积层的输入内容是什么。如上所述,输入内容为一个 32 x 32 x 3 的像素值数组。现在,解释卷积层的最佳方法是想象有一束手电筒光正从图像的左上角照过。假设手电筒光可以覆盖 5 x 5 的区域,想象一下手电筒光照过输入图像的所有区域。在机器学习术语中,这束手电筒被叫做过滤器(filter,有时候也被称为神经元(neuron)或核(kernel)),被照过的区域被称为感受野(receptive field)。过滤器同样也是一个数组(其中的数字被称作权重或参数)。

重点在于过滤器的深度必须与输入内容的深度相同(这样才能确保可以进行数学运算),因此过滤器大小为 5 x 5 x 3。现在,以过滤器所处在的第一个位置为例,即图像的左上角。当筛选值在图像上滑动(卷积运算)时,过滤器中的值会与图像中的原始像素值相乘(又称为计算点积)。这些乘积被加在一起(从数学上来说,一共会有 75 个乘积)。现在你得到了一个数字。切记,该数字只是表示过滤器位于图片左上角的情况。我们在输入内容上的每一位置重复该过程。(下一步将是将过滤器右移 1 单元,接着再右移 1 单元,以此类推。)输入内容上的每一特定位置都会产生一个数字。过滤器滑过所有位置后将得到一个 28 x 28 x 1 的数组,我们称之为激活映射(activation map)特征映射(feature map)。之所以得到一个 28 x 28 的数组的原因在于,在一张 32 x 32 的输入图像上,5 x 5 的过滤器能够覆盖到 784 个不同的位置。这 784 个位置可映射为一个 28 x 28 的数组。(这个过程将在第二篇卷积神经网络原理详解中用动图展实)

在这里插入图片描述

(注意:包括上图在内的一些图片来自于 Micheal Nielsen 的 「神经网络与深度学习( Neural Networks and Deep Learning)」一书。我强烈推荐这本书。这本书可免费在线浏览:http://neuralnetworksanddeeplearning.com/

当我们使用两个而不是一个 5 x 5 x 3 的过滤器时,输出总量将会变成 28 x 28 x 2。采用的过滤器越多,空间维度( spatial dimensions)保留得也就越好。数学上而言,这就是卷积层上发生的事情。

第一层——高层次角度

不过,从高层次角度而言卷积是如何工作的?每个过滤器可以被看成是特征标识符( feature identifiers)。这里的特征指的是例如直边缘、原色、曲线之类的东西。想一想所有图像都共有的一些最简单的特征。假设第一组过滤器是 7 x 7 x 3 的曲线检测器。(在这一节,为了易于分析,暂且忽略该过滤器的深度为 3 个单元,只考虑过滤器和图像的顶层层面。)作为曲线过滤器,它将有一个像素结构,在曲线形状旁时会产生更高的数值 (切记,我们所讨论的过滤器不过是一组数值!)

在这里插入图片描述

左图:过滤器的像素表示;右图:曲线检测器过滤器的可视化;对比两图可以看到数值和形状的对应

回到数学角度来看这一过程。当我们将过滤器置于输入内容的左上角时,它将计算过滤器和这一区域像素值之间的点积。拿一张需要分类的照片为例,将过滤器放在它的左上角。
在这里插入图片描述

切记,我们要做的是将过滤器与图像的原始像素值相乘。

在这里插入图片描述

左图:感受野的可视化;右图:感受野的像素表示 * 过滤器的像素表示

简单来说,如果输入图像上某个形状看起来很像过滤器表示的曲线,那么所有点积加在一起将会得出一个很大的值!让我们看看移动过滤器时会发生什么。

在这里插入图片描述

这个值小了很多!这是因为图像的这一部分和曲线检测器过滤器不存在对应。记住,这个卷积层的输出是一个激活映射(activation map)。因此,在这个带有一个过滤器卷积的例子里(当筛选值为曲线检测器),激活映射将会显示出图像里最像曲线的区域。在该例子中,28 x 28 x 1 的激活映射的左上角的值为 6600。高数值意味着很有可能是输入内容中的曲线激活了过滤器。激活地图右上角的值将会是 0,因为输入内容中没有任何东西能激活过滤器(更简单地说,原始图片中的这一区域没有任何曲线)。这仅仅是一组检测右弯曲线的过滤器。还有其它检测左弯曲线或直线边缘的过滤器。过滤器越多,激活映射的深度越大,我们对输入内容的了解也就越多。

声明: 我在本小节中描绘的过滤器(filter)只是为了描述卷积中的数学过程。在下图中你可以看到训练后的网络中第一个卷积层的过滤器的实际可视化。尽管如此,主要观点仍旧不变。当在输入内容中寻找特定特征时,第一层上的过滤器在输入图像上进行卷积运算和「激活」(即计算高数值)。

在这里插入图片描述

上图来自于斯坦福大学由 Andrej Karpathy 和 Justin Johnson 授课的 CS 231N 课程,推荐给渴望更深层理解 CNN 的人们:CS231n: Convolutional Neural Networks for Visual Recognition,链接:http://cs231n.stanford.edu/

网络中的更深处

在传统卷积神经网络架构中,卷积层之间还有其它类型的层。我强烈建议有兴趣的人阅读和它们有关的材料,并理解相应的功能和作用;但总的来说,它们提供的非线性和维度保留有助于提高网络的稳健性(robustness)并控制过拟合。一个典型的 CNN 结构看起来是这样的:

在这里插入图片描述

输入→卷积→ReLU→卷积→ReLU→池化→ReLU→卷积→ReLU→池化→全连接

我们稍后再来讨论关键的最后一层,先回顾一下学到了哪些。我们讨论了过滤器是如何在第一个卷积层检测特征的。它们检测边缘和曲线一类的低级特征。正如想象的那样,为了预测出图片内容的分类,网络需要识别更高级的特征,例如手、爪子与耳朵的区别。

第一个卷积层的输出将会是一个 28 x 28 x 3 的数组(假设我们采用三个 5 x 5 x 3 的过滤器)。当我们进入另一卷积层时,第一个卷积层的输出便是第二个卷积层的输入。解释这一点有些困难。第一层的输入是原始图像,而第二卷积层的输入正是第一层输出的激活映射。也就是说,这一层的输入大体描绘了低级特征在原始图片中的位置。在此基础上再采用一组过滤器(让它通过第 2 个卷积层),输出将是表示了更高级的特征的激活映射。这类特征可以是半圆(曲线和直线的组合)或四边形(几条直线的组合)。随着进入网络越深和经过更多卷积层后,你将得到更为复杂特征的激活映射。在网络的最后,可能会有一些过滤器会在看到手写笔迹或粉红物体等时激活。如果你想知道更多关于可视化卷积网络中过滤器的内容,可以查看 Matt Zeiler 和 Rob Fergus 的一篇讨论该问题的颇为杰出的研究论文。在 YouTube 上,Jason Yosinski 有一段视频十分视觉化地呈现了这一过程(如下)。有趣的是,越深入网络,过滤器的感受野越大,意味着它们能够处理更大范围的原始输入内容(或者说它们可以对更大区域的像素空间产生反应)。

完全连接层

检测高级特征之后,网络最后的完全连接层就更是锦上添花了。简单地说,这一层处理输入内容(该输入可能是卷积层、ReLU 层或是池化层的输出)后会输出一个 N 维向量,N 是该程序必须选择的分类数量。例如,如果你想得到一个数字分类程序,如果有 10 个数字,N 就等于 10。这个 N 维向量中的每一数字都代表某一特定类别的概率。例如,如果某一数字分类程序的结果矢量是 [0 .1 .1 .75 0 0 0 0 0 .05],则代表该图片有 10% 的概率是 1、10% 的概率是 2、75% 的概率是 3、还有 5% 的概率是 9(注:还有其他表现输出的方式,这里只展示了 softmax 的方法)。完全连接层观察上一层的输出(其表示了更高级特征的激活映射)并确定这些特征与哪一分类最为吻合。例如,如果该程序预测某一图像的内容为狗,那么激活映射中的高数值便会代表一些爪子或四条腿之类的高级特征。同样地,如果程序测定某一图片的内容为鸟,激活映射中的高数值便会代表诸如翅膀或鸟喙之类的高级特征。大体上来说,完全连接层观察高级特征和哪一分类最为吻合和拥有怎样的特定权重,因此当计算出权重与先前层之间的点积后,你将得到不同分类的正确概率。

在这里插入图片描述

训练(也就是:什么能让其有效)

下面是神经网络中的一个我尚未提及但却最为重要的部分。阅读过程中你可能会提出许多问题。第一卷积层中的滤波器是如何知道寻找边缘与曲线的?完全连接层怎么知道观察哪些激活图?每一层级的滤波器如何知道需要哪些值?计算机通过一个名为反向传播的训练过程来调整过滤器值(或权重)。

在探讨反向传播之前,我们首先必须回顾一下神经网络工作起来需要什么。在我们刚出生的时候,大脑一无所知。我们不晓得猫啊狗啊鸟啊都是些什么东西。与之类似的是 CNN 刚开始的时候,权重或过滤器值都是随机的。滤波器不知道要去寻找边缘和曲线。更高层的过滤器值也不知道要去寻找爪子和鸟喙。不过随着年岁的增长,父母和老师向我们介绍各式各样的图片并且一一作出标记。CNN 经历的便是一个介绍图片与分类标记的训练过程。在深入探讨之前,先设定一个训练集,在这里有上千张狗、猫、鸟的图片,每一张都依照内容被标记。下面回到反向传播的问题上来。

反向传播可分为四部分,分别是前向传导、损失函数、后向传导,以及权重更新。(前向传播和后向传播请参考这篇博客:https://blog.csdn.net/bitcarmanlee/article/details/78819025。)在前向传导中,选择一张 32×32×3 的数组训练图像并让它通过整个网络。在第一个训练样例上,由于所有的权重或者过滤器值都是随机初始化的,输出可能会是 [.1 .1 .1 .1 .1 .1 .1 .1 .1 .1],即一个不偏向任何数字的输出。一个有着这样权重的网络无法寻找低级特征,或者说是不能做出任何合理的分类。接下来是反向传播的损失函数部分。切记我们现在使用的是既有图像又有标记的训练数据。假设输入的第一张训练图片为 3,标签将会是 [0 0 0 1 0 0 0 0 0 0]。损失函数有许多种定义方法,常见的一种是 MSE (均方误差)。

在这里插入图片描述

假设变量 L 等同该数值。正如所料,前两张训练图片的损失将会极高。现在,我们直观地想一下。我们想要预测标记(卷积网络的输出)与训练标记相同(意味着网络预测正确)。为了做到这一点,我们想要将损失数量最小化。将其视为微积分优化问题的话,也就是说我们想要找出是哪部分输入(例子中的权重)直接导致了网络的损失(或错误)。

在这里插入图片描述

这是一个 dL/dW 的数学等式,W 是特定层级的权重。我们接下来要做的是在网络中进行后向传导,测定出是哪部分权重导致了最大的损失,寻找调整方法并减少损失。一旦计算出该导数,将进行最后一步也就是权重更新。所有的过滤器的权重将会更新,以便它们顺着梯度方向改变。
在这里插入图片描述

学习速率是一个由程序员决定的参数。高学习速率意味着权重更新的动作更大,因此可能该模式将花费更少的时间收敛到最优权重。然而,学习速率过高会导致跳动过大,不够准确以致于达不到最优点。

在这里插入图片描述

总的来说,前向传导、损失函数、后向传导、以及参数更新被称为一个学习周期。对每一训练图片,程序将重复固定数目的周期过程。一旦完成了最后训练样本上的参数更新,网络有望得到足够好的训练,以便层级中的权重得到正确调整。

测试

最后,为了检验 CNN 能否工作,我们准备不同的另一组图片与标记集(不能在训练和测试中使用相同的!)并让它们通过这个 CNN。我们将输出与实际情况(ground truth )相比较,看看网络是否有效!

企业如何使用 CNN

数据、数据、数据。数据越多的企业在竞争中越发彰显优势。你提供给网络的训练数据越多,你能进行的训练迭代也越多,紧接着权重更新也多,那么当用于产品时调整出的网络自然就好。Facebook (和 Instagram)可以使用它如今拥有的十几亿用户的图片,Pinterest 可以使用它站点上 500 亿花瓣的信息,谷歌可以使用搜索数据,亚马逊可以使用每天销售的数以百万计的商品数据。而你现在也知道它们使用数据背后的神奇之处了。


MaiweiE-com | WeChat ID:Yida_Zhang2

推荐文章

[1] 机器学习算法之——隐马尔科夫链(Hidden Markov Models, HMM)
[2] 机器学习算法之——支持向量机(Support Vector Machine, SVM)
[3] 机器学习算法之——逻辑回归(Logistic Regression)算法讲解及Python实现
[4] 机器学习算法之——梯度提升(Gradient Boosting) 上 算法讲解及Python实现
[5] 机器学习算法之——梯度提升(Gradient Boosting) 下 算法讲解及Python实现
[6] 机器学习算法之——决策树模型(Decision Tree Model)算法讲解及Python实现
[7] 机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解
[8] 机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)算法Python实现

传送门
在这里插入图片描述
关注微信公众号:迈微电子研发社,回复 “深度学习实用教程” 获取Github开源项目。

在这里插入图片描述

△微信扫一扫关注「迈微电子研发社」公众号

知识星球:社群旨在分享AI算法岗的秋招/春招准备攻略(含刷题)、面经和内推机会、学习路线、知识题库等。

在这里插入图片描述

△扫码加入「迈微电子研发社」学习辅导群

在这里插入图片描述

发布了50 篇原创文章 · 获赞 55 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Charmve/article/details/104872365