卷积神经网络(CNN)新手指南
卷积 神经网络 (Convolutional Neural Network,CNN)新手指南
引言
卷积神经网络:听起来像是生物与数学还有少量计算机科学的奇怪结合,但是这些网络在计算机视觉领域已经造就了一些最有影响力的创新。2012年神经网络开始崭露头角,那一年Alex Krizhevskyj在ImageNet竞赛上(ImageNet可以算是竞赛计算机视觉领域一年一度的“奥运会”竞赛)将分类错误记录从26%降低到15%,这在当时是一个相当惊人的进步。从那时起许多公司开始将深度学习应用在他们的核心服务上,如Facebook将神经网络应用到他们的自动标注算法中,Google(谷歌)将其应用到图片搜索里,Amazon(亚马逊)将其应用到产品推荐服务,Pinterest将其应用到主页个性化信息流中,Instagram也将深度学习应用到它们的图像搜索架构中。
然而最经典的,或者说最流行的神经网络使用范例是将其用于图像处理领域。提到图像处理,本文主要介绍的是如何使用卷积神经网络来进行图像分类。
问题空间
图像分类是将输入图像(猫、狗等)进行分类输出或者将其分类成最能描述图像特征的类别的任务。对于人类来说,认知是我们出生之后就学会的第一个技能,也是作为成年人来说非常自然和轻松的技能。我们可以毫不犹豫迅速识别出我们周围的环境以及物体,当我们看到一张图片或者观察周遭环境时,大部分时间我们都能马上对场景做出判断并且给每个物体都打上标识,这些甚至都不需要刻意去观察。这些技能能够迅速识别其模式,从我们以前的经验中做出推论,然后将其运用至不同的图片或者环境中——这些都是我们与机器不同的地方。
输入与输出
当计算机看到一张图片时(即输入一张图片),它所看到的是一系列的像素值。根据图片的分辨率与大小,计算机将看到的是一个32×32×3的数字阵列(3指代的是RGB—颜色值)。我们稍微将一下这个,假设我们有一张480 x 480的JPG格式图片,它的表达阵列即为480 x 480 x 3。这些数字中的每一个值都可以从0取到255,它描述了在这一点上的像素强度。这些数字虽然对于我们进行图像分类时没有任何意义,但其却是计算机在图像输入时唯一获取的数据。这个理念就是你给电脑指定相关数据排列,它将图像是一个特定的类别的可能性进行输出(如80—猫,15—狗,05—鸟等)。
我们希望电脑做什么
现在我们了解到问题是在输入和输出上,让我们来考虑如何解决这个问题。我们希望电脑能做到的是在所有的给定图像中分辨出不同的类别,它能找到那些“狗之所以是狗”或者“猫之所以是猫”的特性。这个就是在我们的头脑中潜意识里进行认知识别的过程,当我们看到一张狗的图像时,我们能够将其分类因为图像上有爪子或者四条腿等明显的特征。以类似的方式计算机能够进行图像分类任务,通过寻找低层次的特征如边缘和曲线,然后运用一系列的卷积层建立一个更抽象的概念。这是卷积神经网络应用的一个总体概述,接下来我们来探讨下细节。
生物联系
首先要稍微普及下一点背景知识,当你第一次听到卷积神经网络这个词时,你也许会想这是是不与神经科学或者生物学有关?恭喜你,猜对了一部分。卷积神经网络的确从生物学上的视觉皮层得到启发,视觉皮层有微小区域的细胞对于特定区域的视野是十分敏感的。
1962年,Hubel和 Wiesel发现大脑中的部分神经元只对一定的方向的边缘做出回应。例如,当暴露在垂直边缘或者一些当水平或对角线边缘时,一些神经元才会做出回应。Hubel和 Wiesel发现,所有这些神经元都被架构在一个柱状结构中,这样的架构使它们能够产生视觉感知。系统中的特定成员可以完成特定任务这种理念(神经细胞在视觉皮层中寻找特定的特征)也能很好地应用在机器学习上,这也是卷积神经网络的基础。
架构
对于卷曲神经网络更详细的介绍是将图片通过一系列的卷积、非线性、池(采样)、全连接层,然后得到一个输出。正如我们前面所说的,输出是一个类或者一个图像类别的可能性概率。现在,困难的部分是了解每一层的任务。
第一层—数学
卷积神经网络的第一层是卷积层,第一件事是你要记住卷曲层的输入时什么。像我们之前提到的,输入的是一个32×32×3的系列像素值。解释卷积层的最好方式是想象一个手电筒正在图像的左上方进行照射,假设手电照射的区域是5 x 5的范围。再想象下这个手电筒在输入图像的各个区域进行滑动。在机器学习术语中,这个手电筒叫做过滤器(有时候也称为神经元或者核心),它照射着的区域被称为接受场。这个过滤器也是一系列的数据(这些数据被称为权重或者参数)。必须提到的是这个过滤器的深度必须是和输入的深度相同(这样才能保证数学正常工作),所以这个过滤器的尺寸是5×5×3。现在,让我们先拿第一个位置的过滤器为例。由于过滤器在输入图像上是滑动或卷积的,它是相乘的值在滤波器的原始图像的像素值(又名计算元素的乘法),这些乘法全部相加(从数学上讲,这将是75次乘法总和)。所以现在你有一个数字。请记住,这个数字只是当过滤器在图像的左上角时才有代表性,现在我们在每一个位置上重复这个过程。(下一步将过滤器移动到右边的1个单位,然后再向右移动1个单位,等等),每一个输入层上独特的位置都会产生一个数字。将过滤器滑动完所有位置的,你会发现剩下的是一个28×28×1的系列数字,我们称之为激活图或者特征图。你得到一个28×28阵列的原因是有784个不同的位置,一个5×5的过滤器可以适配一个32×32的输入图像,这组784个数字可以被映射到一个28×28阵列。
目前我们使用两个5 x 5 x 3的过滤器,我们的输出量将是28×28×2。通过使用更多的过滤器,我们能够更好地维持空间尺寸。在数学层面上来说,这些是在一个卷积层中进行的任务。
第一层—高阶视角
让我们从高阶角度来谈谈这个卷积层的任务,这些过滤器中每个都可以被认为是特征标识符。当我说特征时,我说的是如直边、简单的颜色和曲线等。思考一下,所有的图像都有同样的最简单的特征。我们的第一个过滤器是7×7×3,而且是一个曲线探测器。(在这一部分让我们忽略一个事实,过滤器是3个单位深的,只考虑顶部过滤器的深度和图像。)作为一个曲线检测器,过滤器将有一个更高的数值且有曲线的形状的像素结构(记住关于这些过滤器,我们考虑的只是数字)。
现在,让我们回到数学可视化部分。当我们在输入的左上角有了这种滤波器后,它会在哪个区域的过滤器和像素值之间计算乘积。现在让我们以一个我们要分类的图像为例,把我们的过滤器放在左上角。
记住,我们需要做的是使用图像中的原始像素值在过滤器中进行乘积。
基本上在输入图像中,如果有一个形状是类似于这种滤波器的代表曲线,那么所有的乘积累加在一起会导致较大的值!现在让我们看看当我们移动我们的过滤器时会发生什么。
检测值竟然要低得多!这是因为在图像中没有任何部分响应曲线检测过滤器。记住,这个卷积层的输出是一个激活图。因此,在简单的情况下一个过滤器的卷积(如果该过滤器是一个曲线检测器),激活图将显示其中大部分可能是在图片中的曲线区域。在这个例子中,我们的28×28×1激活图左上方的值将是6600,这种高值意味着很可能是在输入中有某种曲线导致了过滤器的激活。因为没有任何东西在输入使过滤器激活(或更简单地说,在该地区的原始图像没有一个曲线),其在我们的激活图右上方的值将是0。记住,这仅仅只是一个过滤器。这个过滤器将检测线向外和右边的曲线,我们可以有其他的曲线向左或直接到边缘的过滤器线条。过滤器越多,激活图越深,我们从于输入中获取的信息也就越多。
声明:在这一节中描述的过滤器是简化的,其主要目的是描述在一个卷积过程中的数学过程。在下图中你会看到一些对训练过的网络中第一个卷积层的过滤器的实际显示示例,尽管如此,主要的论据仍然是相同的。
进一步深入网络
现在展示一个传统的卷积神经网络结构,还有其他层在这些层之间穿插转换。强烈建议那些有兴趣的读者去了解他们的功能和作用,但一般来说他们提供的非线性和尺寸留存有助于提高网络的鲁棒性,同时还能控制过度拟合。一个经典的卷积神经网络架构看起来是这样的:
然而,最后一层是非常重要的内容,不过我们将在后面提到。让我们退后一步,回顾一下我们目前提到的东西。我们谈到了第一个卷积层的过滤器被设计用来探测。他们检测到低阶的特征如边缘和曲线。正如想象的那样,为了预测图像的类型,我们需要神经网络能够识别更高阶的特征,如手、爪子、耳朵。让我们考虑经过第一层卷积层后网络的输出是什么,这将是一个28×28×3的体量(假设我们使用三个5×5×3过滤器)。当穿过另一个卷积层时,卷积层的第一输出成为第二卷积层的输入,这有难以视觉化想象。当我们谈论第一层时,输入的只是原始图像。然而,当我们谈论第二个卷积层时,输入是第一层的结果激活图(S)。因此,每一层的输入基本上是描述某些低阶特征在原始图像中的位置。现在当你应用一组过滤器(通过第二卷积层),输出将被激活且代表更高阶的特征。这些特征的类型可能是半圆(曲线和直线边缘的组合)或方形(几个直边的组合)。当通过网络、更多的卷积层,可以激活地图,代表更多和更复杂的特征。在神经网络的结束,可能有一些激活的过滤器,表示其在图像中看到手写字迹或者粉红色的物体时等等。另一个有趣的事情是当你在网络往更深的地方探索时,过滤器开始有越来越大的接受场,这意味着他们能够从一个更大的区域或者更多的原始输入量接收信息。
全连接层
现在我们可以检测到这些高阶特征,锦上添花的是在神经网络的末端连接一个全连接层。这层基本上将一个输入量(无论输出是卷积或ReLU或池层)和输出一个N是程序选择类别的N维向量,具体过程如下图所示。这个全连接层的工作方式是,它着眼于前一层的输出(代表高阶特征的激活图),并确定哪些功能是最相关特定的类。例如如果该程序预测,一些图像是一只狗,它在激活图中会有高的值,代表高阶特征如一个爪子或4条腿等。类似地,如果该程序是预测一些图像是鸟的功能,它在激活图中会有高阶值,代表高阶特征如如翅膀或喙等。
训练过程
训练工程作为神经网络的一个部分,我之前故意没有提到,因为它有可能是最重要的一部分。阅读时你可能会遇到有很多问题,例如第一个卷积层中过滤器如何知道寻找边缘和曲线?全连接层如何知道激活图在哪里?每一层的过滤器如何知道有什么样的值?计算机能够调整其过滤值(或权重)的方式是通过一个称为 反向传播 的训练过程。
在我们介绍反向传播之前,我们必须先回顾下谈谈神经网络运行所需要的是什么。在我们出生的那一刻,我们的思想是全新的,我们不知道什么是猫,什么是鸟。类似地,在卷积神经网络开始之前,权重或过滤器的值是随机的,过滤器并不知道去寻找边缘和曲线,在更高阶的层过滤器不知道去寻找爪子和喙。然而当我们稍微大了一点之后,我们的父母和老师给我们展示了不同的图片和图像,并给了我们一个相应的标签。给图像以标签这个想法既是卷积神经网络(CNNs)的训练过程。在讲到它之前,让我们稍微介绍下我们有一个训练集,其中有成千上万的狗,猫和鸟类的图像,每一个图像有一个标签对应它是什么动物的图片。
反向传播可以分为4个不同的部分: 前向传播、损失计算、反向传播、权重更新 。在 前向传播 的过程中,你需要一个数字阵列为32×32×3的训练图像,并将其传递通过整个网络。在我们的第一个训练例子中,所有的权重或过滤器的值被随机初始化,输出可能是类似[.1 .1 .1 .1 .1 .1 .1 .1 .1 .1]的东西,基本上是一个不能优先考虑任何数字的输出。目前权重的网络是无法寻找那些低阶的功能,因此也无法对分类可能性作出任何合理的结论。这就到了反向传播中的 损失计算 部分。我们现在使用的是训练数据,此数据有一个图像和一个标签。比方说,第一个输入的训练图像是一个3,则该图像的标签将是[ 0 0 1 0 0 0 0 0 ]。损失计算可以按许多不同的方式定义,但常见的是MSE(均方差)—½倍(实际预测)的平方。
假设变量L等于这个值,正如你想象的,对于第一组训练图像来说损失将是非常高的。现在,让我们更直观地来进行思考。我们想得到一个点的预测标签(ConvNet的输出)作为训练相同的训练标签(这意味着我们的网络预测正确)。为了实现则这个,我们要尽量减少我损失量。可视化在微积分上只是一个优化问题,我们需要找出哪些输入是(在我们的例子中的权重)最直接导致网络的损失(或错误)所在。
这是一个dL/DW的数学等价,其中W是在一个特定层的权重。现在我们要做的通过网络是执行一个 反向传播 过程,检测哪个权重损失最大并且寻找方法来调整它们使损失降低。一旦我们将这个计算过程进行完,就可以到最后一步— 权重更新 。把所有的过滤器的权重进行更新,使它们在梯度方向上进行改变。
学习速率是由程序员选择的一个参数。一个高的学习率意味着更多步骤是在权重更新部分,因此它可能需要更少的时间为最佳的权重在模型上进行收敛。然而学习率太高,可能会导致跨越太大而不够精准达到最佳点。
前向传播、损失计算、反向传播、参数更新的过程也称为一个epoch。程序会对于每一个固定数量的epoch、每个训练图像重复这一过程。在最后一个训练例子中完成了参数更新后,网络应该都训练的足够好了,各层的权重也应该调参正确了。
测试
最后要来测试我们的卷积神经网络是否工作,将不同的图片和标签集通过卷积神经网络,将输出结果与真实值进行对比,即可测试出其是否正常运行。
业界如何使用卷积神经网络
数据,数据,数据。 给一个卷积神经网络的更多的训练数据,可以做的更多的训练迭代,也就能实现更多的权重更新,对神经网络进行更好的调参。Facebook(还有Instagram)可以使用数以亿计的用户目前的所有照片,Pinterest可以使用在其网站上的500亿的信息,谷歌可以使用搜索数据,亚马逊可以使用每天数以百万计的产品购买数据。
现在你知道他们是如何使用这些的魔法了,有兴趣的话可以自己尝试一下。
PS : 本文由雷锋网 (搜索“雷锋网”公众号关注) 独家编译,未经许可拒绝转载!
via Adit Deshpande