深度学习cnn卷积神经网络原理(图文详解)

Author: Chris Song

受Hubel和Wiesel对猫视觉皮层电生理研究启发,有人提出卷积神经网络(CNN),Yann Lecun 最早将CNN用于手写数字识别并一直保持了其在该问题的霸主地位。近年来卷积神经网络在多个方向持续发力,在语音识别、人脸识别、通用物体识别、运动分析、自然语言处理甚至脑电波分析方面均有突破。本文将会深度详解cnn卷积神经网络原理,对人工智能领域感兴趣的朋友请继续往下看。



卷积神经网络

-


这听起来像是一个奇怪的生物学和数学的结合,但是这些网络已经成为计算机视觉领域最具影响力的创新之一。2012年是神奇网络成长的第一年,Alex Krizhevsky用它们赢得了当年的ImageNet竞赛(基本上是计算机视觉年度奥运会),把分类错误记录从26%降到了15%,这个惊人的提高从那以后,许多公司一直在以服务为核心进行深度学习。Facebook使用自动标记算法的神经网络,谷歌的照片搜索,亚马逊的产品推荐,Pinterest的家庭饲料个性化和Instagram的搜索基础设施。



然而,经典的,可以说是最流行的,这些网络的用例是用于图像处理。在图像处理中,让我们来看看如何使用这些CNN进行图像分类。



问题空间

-


图像分类是获取输入图像和输出类(猫,狗等)或类的概率最好描述图像的任务。对于人类来说,承认这项任务是我们从出生那一刻起学到的第一个技能之一,并且是成年人自然而不费吹灰之力的人。即使没有两次思考,我们也能够快速无缝地识别我们所处的环境以及周围的物体。当我们看到一张图像或者只是看着周围的世界时,大部分时间我们都能够立刻刻画这个场景,给每个对象一个标签,所有这些都没有自觉地注意到。这些能够快速识别模式的技能,从先前的知识概括,




投入和产出

-


当一台电脑看到一个图像(以图像作为输入)时,它会看到一个像素值的数组。根据图像的分辨率和大小,它将看到一个32×32×3的数字数组(3指的是RGB值)。为了说明这一点,假设我们有一个JPG格式的彩色图像,它的大小是480 x 480.代表性的数组将是480 x 480 x 3.这些数字中的每一个都有一个从0到255的值,它描述该点的像素强度。这些数字对于我们进行图像分类时毫无意义,这是计算机唯一可用的输入。这个想法是,你给计算机这个数组的数组,它会输出的数字,描述了图像是一个类的概率(.80为猫,.15为狗,0.05为鸟等)。



我们想要计算机做什么

-


现在我们知道这个问题以及输入和输出了,我们来思考如何解决这个问题。我们希望计算机做的是能够区分所有的图像,并找出使狗成为狗或使猫成为猫的独特功能。这也是下意识地在我们的脑海中继续的过程。当我们看一张狗的照片时,如果照片具有可识别的特征,例如爪子或四条腿,我们可以将其分类。以类似的方式,计算机能够通过查找诸如边缘和曲线等低级特征来执行图像分类,然后通过一系列卷积层来构建更抽象的概念。这是一个CNN的一般概述。我们来详细说明一下。



生物连接

-


但首先,有一点背景。当你第一次听说卷积神经网络这个术语的时候,你可能已经想到了一些与神经科学或生物学有关的东西,你会是对的。有点。CNNs确实从视觉皮层中获得了生物启发。视觉皮层具有对视野特定区域敏感的细胞区域。这个想法是由1962年在一个迷人的实验由胡贝尔和威塞尔(在扩展视频)在那里他们表明,大脑中的一些个体神经元细胞只有在某个方位的边缘存在的情况下才会响应(或发射)。例如,一些神经元在暴露于垂直边缘时发射,而另一些在显示水平或对角边缘时发射。Hubel和Wiesel发现,所有这些神经元都是以柱状结构组织的,并且能够产生视觉感知。在具有特定任务的系统内部(视觉皮层中寻找特定特征的神经元细胞)内部的专门组件的想法也是机器使用的,并且是CNN背后的基础。



结构体

-


回到具体细节。有关CNN做的更详细的概述是,您将图像传递给一系列卷积,非线性,汇聚(下采样)和完全连接的图层,并获得输出。正如我们前面所说的那样,输出可以是一个类或者一个最能描述图像的类的概率。现在,困难的部分是了解每个层次都做了什么。所以让我们进入最重要的一个。



第一层 - 数学部分

-


CNN中的第一层始终是一个卷积层。首先要确保你记得这个转换(我将使用这个缩写很多)的输入是什么。就像我们之前提到的那样,输入是一个32×32×3的像素值数组。现在,解释一个conv层的最好方法就是想象一个闪烁在图像左上角的手电筒。假设这个手电筒照射的光线覆盖了5×5的区域。现在,让我们想象这个手电筒滑过输入图像的所有区域。在机器学习方面,这种手电筒被称为滤波器(有时也称为神经元或内核),而它所照射的区域称为接受场。现在这个过滤器也是一个数组数组(数字称为权重或参数)。一个非常重要的注意事项是,这个过滤器的深度必须和输入的深度相同(这可以确保数学运算出来),所以这个过滤器的尺寸是5 x 5 x 3。现在,我们来看看例如过滤器的第一个位置。这将是左上角。当滤波器在输入图像周围滑动或卷积时,它将滤波器中的值与图像的原始像素值相乘(也称为计算元素智能乘法)。所有这些乘法都被总结出来(从数学上讲,这将是总共75次乘法)。所以,现在你有一个单一的数字。记住,这个数字只是过滤器位于图像左上角的代表。现在,我们对输入音量上的每个位置重复这个过程。(下一步将过滤器向右移动1个单位,然后再向右移动1,依此类推)。输入卷上的每个唯一位置都会生成一个数字。将过滤器滑过所有位置后,您将发现所剩下的是一个28 x 28 x 1的数字数组,我们称之为激活图或功能图。你得到一个28×28阵列的原因是有一个5×5的滤波器可以放在一个32×32输入图像上的784个不同的位置。这784个数字被映射到一个28×28数组。



(快速注意:我使用的一些图像,包括上面的图像,来自Michael Nielsen的"Neural Networks and Deep Learning",强烈推荐)。


假设我们现在使用两个5 x 5 x 3滤镜而不是一个。那么我们的输出量将是28 x 28 x 2.通过使用更多的过滤器,我们能够更好地保留空间尺寸。在数学上,这是卷积层中发生的事情。



第一层 - 高层次的视角

-


但是,让我们从高层次谈论这个卷积实际上在做什么。每个这些过滤器都可以被认为是功能标识符。当我说功能时,我正在谈论的是直线边缘,简单的颜色和曲线。想想所有图像的共同点,最简单的特点。假设我们的第一个过滤器是7 x 7 x 3并且将成为曲线检测器。(在本节中,为了简单起见,让我们忽略过滤器深度为3单位的事实,并且只考虑过滤器和图像的顶部深度切片)。作为曲线检测器,过滤器将具有像素结构,沿曲线形状的区域是更高的数值(请记住,我们正在讨论的这些滤波器只是数字!)。



现在,让我们回到数学上的可视化。当我们在输入体积的左上角有这个滤波器时,它将计算该区域的滤波器和像素值之间的乘法。现在让我们举一个想要分类的图像的例子,让我们把我们的过滤器放在左上角。



请记住,我们所要做的就是将滤镜中的值与图像的原始像素值相乘。



基本上,在输入图像中,如果有一个通常类似于这个滤波器所代表的曲线的形状,那么所有相乘的相加将会产生一个大的值!现在让我们看看当我们移动过滤器时会发生什么。



价值低得多!信息信息范范信息亦范范范范范辛辛区信息预范信息 记住,这个conv层的输出是一个激活图。因此,在单一滤波器卷积的简单情况下(如果该滤波器是曲线检测器),激活图将显示图片中最有可能是曲线的区域。在这个例子中,我们的26 x 26 x 1激活图的左上角(26是因为7x7滤镜而不是5x5)将是6600.这个高值意味着在输入中可能有某种曲线导致过滤器激活的音量。在我们的激活地图右上角的值将是0,因为没有任何东西在输入音量导致过滤器激活(或者更简单的说,在原始图像的该区域中没有曲线)。请记住,这只是一个过滤器。信息范范范读范范范亦内范亦会信息及信息范信信息范辛辛 我们可以有其他的过滤器,用于向左弯曲或为直线边缘的线条。更多的过滤器,激活图的深度越大,我们对输入量的信息也越多。


免责声明:本节中描述的过滤器对描述卷积过程中数学的主要目的是简单的。在下面的图片中,您将看到一些经过训练的网络的第一个conv层过滤器的实际可视化示例。尽管如此,主要论点仍然是一样的。第一层上的过滤器在输入图像周围进行卷积,并在其正在查找的特定功能位于输入体积中时"激活"(或计算高值)。



(快速提示:上面的图片来自斯坦福大学的由Andrej Karpathy和Justin Johnson教授,推荐给那些希望更深入了解CNN的人。)



越来越深入的网络

-


现在在传统的卷积神经网络架构中,在这些conv层之间还有其他层。我强烈鼓励有兴趣的读者了解他们的功能和效果,但是从一般意义上说,他们提供了非线性和维度维度,有助于提高网络的鲁棒性和控制过拟合。一个经典的CNN架构看起来就像这样。



然而,最后一层是一个重要的层面,我们稍后会介绍。让我们退一步看看迄今为止我们已经学到了什么。我们讨论了第一个conv层中的过滤器是用来检测的。他们检测低级功能,如边缘和曲线。正如人们所想象的,为了预测图像是否是一种对象,我们需要网络能够识别更高层次的特征,如手或爪子或耳朵。那么让我们来思考第一个conv层之后的网络输出结果。这将是一个28×28×3的体积(假设我们使用三个5×5×3滤波器)。当我们经过另一个conv层时,第一个conv层的输出成为第二个的输入conv层。现在,这看起来有点难以想象。当我们在谈论第一层时,输入只是原始图像。然而,当我们谈论第二层次的时候,输入是第一层产生的激活图。因此,输入的每一层都基本上描述了原始图像中某些低级特征出现的位置。现在当你在上面应用一组过滤器时(通过第二个过滤器)conv层),则输出将是代表更高级特征的激活。这些特征的类型可以是半圆(曲线和直边的组合)或正方形(几个直边的组合)。当您浏览网络并通过更多的转发层时,您将获得代表越来越复杂功能的激活地图。在网络结束时,您可能会有一些过滤器在图像中有手写时激活,过滤器在看到粉红色的物体时激活,等等。如果您想要了解关于在ConvNets中可视化过滤器的更多信息,Matt Zeiler和Rob Fergus一个很好的研究论文讨论的话题。杰森Yosinski也有一个视频在YouTube上提供了一个很好的视觉表现。另一个值得注意的事情是,当你深入到网络中时,过滤器开始具有越来越大的接受范围,这意味着他们能够从原始输入量的较大区域中考虑信息(另一种放置方式它们对像素空间的较大区域更敏感)。



完全连接层

-


现在,我们可以检测到这些高级功能,蛋糕上的糖霜就是连接一个完全连接的层到网络的尽头。这个图层基本上需要一个输入量(无论输出是在其之前的conv或ReLU还是pool层),并输出一个N维向量,其中N是程序必须从中选择的类的数量。例如,如果你想要一个数字分类程序,N将是10,因为有10个数字。这个N维向量中的每个数字表示某个类别的概率。例如,如果用于数字分类程序的结果向量是[0.1.175 0 0 0 0 0 .05],那么这代表10%的概率,即图像是1,10%的概率图像是2,图像是3的概率是75%,图像是9的概率是5%(注意:还有其他方法可以表示输出,但我只是展示了softmax方法)。完全连接图层的工作方式是查看上一层的输出(我们记得它应该代表高级特征的激活图),并确定哪些特征与特定类最相关。例如,如果程序预测某些图像是狗,则在激活图中将具有高值,例如爪子或4条腿等的高级特征。类似地,如果程序预测某图像是鸟,它将在激活地图中具有很高的价值,代表像翅膀或喙等高级特征。基本上,FC层看着什么高级特征与特定类最强关联,并具有特定的权重,以便当你计算权重与上一层之间的乘积,




培训(又名:什么使这个东西工作)

-


现在,这是我故意没有提到的神经网络的一个方面,它可能是最重要的部分。阅读时可能有很多问题。第一个conv层中的过滤器如何知道要查找边和曲线?完全连接的图层如何知道要查看的激活图?每层中的过滤器如何知道有什么值?计算机能够调整其过滤值(或权重)的方式是通过称为反向传播的训练过程。


在我们进入反向传播之前,我们必须先退后一步,讨论神经网络的工作需求。现在我们都出生了,我们的思想是新鲜的。我们不知道什么是猫,狗或鸟。以类似的方式,在CNN开始之前,权重或筛选值是随机的。过滤器不知道寻找边缘和曲线。在更高层的过滤器不知道寻找爪子和喙。然而,随着年龄的增长,我们的父母和老师向我们展示了不同的图片和图片,并给了我们相应的标签。被赋予形象和标签的想法是CNN经历的培训过程。在深入研究之前,我们假设我们有一套训练集,其中包含成千上万的狗,猫和鸟的图像,每个图像都有一个这个图像是什么动物的标签。


所以反向传播可以分为4个不同的部分,正向传递,丢失函数,反向传递和权重更新。在正向传球过程中,您将会看到一张训练图像,我们记得这是一个32 x 32 x 3的数字数组,并将其传递给整个网络。在我们的第一个训练样例中,由于所有的权值或过滤值都是随机初始化的,因此输出结果可能类似[.1.1.1.1.1.1.1.1.1.1],基本上是输出不特别优先考虑任何数字。网络以其当前的权重无法查找这些低级特征,因此无法就分类的可能性作出任何合理的结论。这转到损失功能反向传播的一部分。请记住,我们现在使用的是培训数据。这个数据有一个图像和一个标签。例如,假设输入的第一个训练图像是3,图像的标签是[0 0 0 1 0 0 0 0 0 0]。损失函数可以用许多不同的方式来定义,但常见的是MSE(均方误差),是实际预测的平方的1.5倍。



假设变量L等于该值。正如你可以想象的那样,第一对训练图像的损失将非常高。现在,让我们直观地思考这个问题。我们希望达到预测的标签(ConvNet的输出)与训练标签相同的点(这意味着我们的网络得到了预测权)。为了达到这个目的,我们希望最小化损失量我们有。将这看作是微积分中的一个优化问题,我们想要找出哪些输入(权重在我们的情况下)是最直接导致网络损失(或错误)的因素。



这是dL / dW的数学等价物,其中W是特定层的权重。现在,我们要做的是通过网络进行反向传递,即确定哪些权重对损失贡献最大,并设法调整损失,从而减少损失。一旦我们计算出这个导数,我们就会进入权重更新的最后一步。这是我们取得所有过滤器的权重,并更新它们,使它们在梯度的相反方向变化。



该学习速率是由程序员选择的参数。高学习率意味着在权重更新中采取更大的步骤,因此,模型可能花费较少的时间来收敛于最优权重集合。但是,如果学习速度过高,可能会导致跳跃过大,不够精确,无法达到最佳点。



正向传递,丢失函数,反向传递和参数更新的过程是一次训练迭代。程序将重复这个过程,对每组训练图像(通常称为批次)进行固定次数的迭代。一旦你完成了最后一个训练样例的参数更新,希望网络应该被训练得足够好,这样层的权重才能被正确地调整。



测试

-


最后,为了看看我们的CNN是否有效,我们有一套不同的图像和标签(在训练和测试之间不能一蹴而就),并通过CNN传递图像。我们将输出与实际情况进行比较,看看我们的网络是否正常工作!



公司如何使用CNNs

-


数据,数据,数据。那些拥有这个神奇的4字母词的公司就是那些比其他竞争者具有内在优势的公司。您可以为网络提供的培训数据越多,您可以进行的培训迭代次数越多,您可以进行的权重更新越多,调整到网络的时间越长。Facebook(和Instagram)可以使用目前拥有的十亿用户的所有照片,Pinterest可以使用其网站上500亿个引脚的信息,Google可以使用搜索数据,Amazon可以使用数百万个产品每天都买。现在你知道他们如何使用它的魔法了。



结尾

-


虽然这篇文章应该是理解CNN的好开始,但这绝不是一个全面的概述。在这篇文章中没有讨论的东西包括非线性和合并层以及网络的超参数,如过滤器大小,步长和填充。还没有讨论网络架构,批量归一化,消失梯度,丢失,初始化技术,非凸优化,偏差,丢失函数的选择,数据增强,正则化方法,计算考虑,反向传播的修改等主题)。



相关阅读