3.2 深度学习简介
深度学习是人工智能领域的一项重要技术。说到深度学习,大家第一个想到的可能是AlphaGo,通过一次又一次的学习、更新算法,最终在人机大战中打败围棋世界冠军。对于一个智能系统来讲,深度学习的能力大小,决定着它在多大程度上能达到用户对它的期待。
深度学习的过程可以概括描述为:
• 构建一个网络并且随机初始化所有连接的权重。
• 将大量的数据情况输出到这个网络中。
• 网络处理这些动作并且进行学习。
• 如果这个动作符合指定的动作,将会增强权重;如果不符合,则会降低权重。
• 系统通过如上过程调整权重。
• 在成千上万次的学习之后,其所学专项的能力超过人类的表现。
3.2.1 深度神经网络
1. 深度神经网络定义
神经网络包括输入层、隐藏层、输出层。通常来说,隐藏层达到或超过3层,就可以称为深度神经网络,深度神经网络极端可以达到上百层、数千层,如图3-16所示。
图3-16 深度神经网络模型
2. 常见激活函数
在深度学习中,如果每一层输出都是上层输入的线性函数,那么不管有多少次隐藏层的运算,输出结果都是输入的线性组合,与不采用隐藏层时的效果相当,这种情况就是最原始的感知机(Perceptron)。
比如下面的三个函数:
x = 2*t+3 (2-1)
y = 3*x+4 (2-2)
y = 3*(2*t+3)+4 = 6*t+13 (2-3)
在上面的三个函数中,前两个函数都是线性的,将它们组合在一起形成新的函数,见式(2-3),仍然是一个线性函数,两个隐藏层与一个隐藏层是等效的。
在这种情况下,可以引入非线性函数作为激活函数,使输出信息可以逼近任意函数。这种非线性函数,称为激活函数(也称为激励函数)。
常见的激活函数包括Sigmoid函数、Tanh函数和ReLU函数,如图3-17所示。
Sigmoid函数的输出范围为0~1,x很小时,y趋近于0,x越大,值越大,最终趋近于1。
Tanh函数的输出范围为-1到1。
ReLU函数x值大于0的时候,信号原样输出,x值小于0的时候无输出。
图3-17 常见的激活函数
3.2.2 卷积神经网络及原理
卷积神经网络(Convolutional Neural Network,CNN)是深度学习中最重要的概念之一。卷积神经网络具有表征学习(Representation Learning)能力,能够按其阶层结构对输入信息进行平移不变分类(Shift-Invariant Classification),因此也被称为“平移不变人工神经网络”(Shift-Invariant Artificial Neural Networks,SIANN)。20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现,其独特的网络结构可以有效降低神经网络的复杂性。1998年,Yann LeCun提出了LeNet神经网络,标志着第一个采用卷积思想的神经网络面世。进入21世纪后,随着深度学习理论的提出和数值计算设备的改进,卷积神经网络得到了快速发展,并被应用于计算机视觉、自然语言处理等领域。
卷积神经网络仿造生物的视知觉(Visual Perception)机制构建,可以进行监督学习和无监督学习,其隐藏层内的卷积核参数共享和层间连接的稀疏性,使得卷积神经网络能够以较小的计算量对格点化(Grid-Like Topology)特征,例如像素和音频,进行学习,有稳定的效果且对数据没有额外的特征工程(Feature Engineering)要求。
1. 卷积神经网络历史
对卷积神经网络的研究可追溯至日本学者福岛邦彦(Kunihiko Fukushima)提出的neocognitron模型。在其1979和1980年发表的论文中,福岛仿造生物的视觉皮层(Visual Cortex)设计了以“neocognitron”命名的神经网络。neocognitron是一个具有深度结构的神经网络,并且是最早被提出的深度学习算法之一,其隐藏层由S层(Simple Layer)和C层(Complex Layer)交替构成。其中S层单元在感受野(Receptive Field)内对图像特征进行提取,C层单元接收和响应不同感受野返回的相同特征。neocognitron的S层-C层组合能够进行特征提取和筛选,部分实现了卷积神经网络中卷积层(Convolution Layer)和池化层(Pooling Layer)的功能,被认为是启发了卷积神经网络的开创性研究。
第一个卷积神经网络是1987年由Alexander Waibel等提出的时间延迟网络(Time Delay Neural Network,TDNN)。TDNN可应用于语音识别问题,它使用快速傅里叶变换预处理的语音信号作为输入,其隐藏层由两个一维卷积核组成,以提取频率域上的平移不变特征。由于在TDNN出现之前,人工智能领域在反向传播算法(Back-Propagation,BP)的研究中已取得了突破性进展,因此,TDNN得以使用BP框架内进行学习。在比较试验中,TDNN的表现超过了同等条件下的隐马尔可夫模型(Hidden Markov Model,HMM),而后者是20世纪80年代语音识别的主流算法。
1988年,Wei Zhang提出了第一个二维卷积神经网络:平移不变人工神经网络(SIANN),并将其应用于检测医学影像。独立于Wei Zhang,Yann LeCun在1989年同样构建了应用于计算机视觉问题的卷积神经网络,即LeNet的最初版本。LeNet包含2个卷积层,2个全连接层,共计6万个学习参数,规模远超TDNN和SIANN,且在结构上与现代的卷积神经网络十分接近。1989年,LeCun对权重进行随机初始化后,使用了随机梯度下降(Stochastic Gradient Descent,SGD)进行学习,这一策略被其后的深度学习研究所保留。此外,LeCun于1989年在论述其网络结构时首次使用了“卷积”一词,“卷积神经网络”也因此得名。
1993年,LeCun的工作由贝尔实验室(AT&T Bell Laboratories)完成代码开发并被部署于NCR(National Cash Register Coporation)的支票读取系统。但总体而言,由于数值计算能力有限、学习样本不足,加上同一时期以支持向量机(Support Vector Machine,SVM)为代表的核学习(Kernel Learning)方法的兴起,这一时期为各类图像处理问题设计的卷积神经网络停留在了研究阶段,应用端的推广较少。
1998年,在LeNet的基础上,Yann LeCun及其合作者构建了更加完备的卷积神经网络LeNet-5,并在手写数字的识别问题中取得成功。LeNet-5沿用了LeCun的策略,并在原有设计中加入了池化层对输入特征进行筛选。LeNet-5及其后产生的变体定义了现代卷积神经网络的基本结构,其构筑中交替出现的卷积层一池化层被认为能够提取输入图像的平移不变特征。LeNet-5的成功使卷积神经网络的应用得到关注,微软在2003年使用卷积神经网络开发了光学字符读取(Optical Character Recognition,OCR)系统。其他基于卷积神经网络的应用研究也得到展开,包括人像识别、手势识别等。
2006年,深度学习理论被提出以后,卷积神经网络的表征学习能力得到了关注,并随着数值计算设备的更新得到发展。自2012年的AlexNet开始,得到GPU计算集群支持的复杂卷积神经网络,多次成为ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge,ILSVRC)的优胜算法,包括2013年的ZFNet、2014年的VGGNet、GoogLeNet和2015年的ResNet。
2. 卷积神经网络原理
以动物识别为例子,我们描述一下对小狗进行识别训练时的整个流程。当小狗的图片(数字化格式)被送入卷积神经网络时,需要通过多次的卷积(Convolutional)→池化(Pooling)运算,最后通过全连接层(Fully-Connected Layer),输出为属于猫、狗等各个动物类别的概率,如图3-18所示。
图3-18 卷积神经网络的工作过程
(1)卷积
卷积是一个数学名词,它的产生是为了能较好地处理“冲击函数”。“冲击函数”是狄拉克为了解决一些瞬间作用的物理现象而提出的符号。后来卷积被广泛用于信号处理,使输出信号能够比较平滑地过渡。
图3-19展示了一维卷积神经网络的工作原理,图中的输入层有1行7列的数据信息,经过1行3列的卷积核进行运算,得到1行5列的输出信息。卷积核相当于小滑块,自左向右滑动。当卷积核停留在某个位置时,将相应的输入信号与卷积核作一个卷积运算,运算结果呈现在输出信号层中。例如,在图3-19中,卷积核是一维的[-1,0,1],如果停留在第二个位置,对准的信号分别是[-2,1,-1],相当于两个向量的内积,结果为:
-2*(-1)+1*0+(-1)*1=1
因此,本次卷积运算的输出信号为1。另外,卷积核每次滑动步长为1,共进行5次计算,相当于共有5个神经元(不包括用作偏置项的神经元)。
图3-19 一维卷积神经网络的工作原理
图3-20简单阐述了利用卷积运算使信号平滑过渡的过程。当有一个较大信号(如100),甚至可能是嗓音时,经过卷积运算,可以起到降噪作用,如图3-20中的最大输出信息已经降为58,且与周边的信号更接近。通过精心设计卷积核,我们有机会得到更理想的结果,比如调整卷积核尺寸、调整卷积核内相应的权重值等。在图像处理中,利用边缘检测卷积核(如Sobel算子),能清晰地识别出图像的边缘。由于卷积核与信号处理有很多的相关性,因此,也有人称卷积核为滤波器(Filters)。
图3-20 卷积运算使信号平滑过渡
图3-21简要描述了二维卷积神经网络的工作原理。这时候的卷积核为3×3矩阵,与左侧输入信息中相应位置的3×3子集进行点积运算,得到输出信号。
图3-21 二维卷积神经网络的工作原理
(2)池化
Pooling层(池化层)的输入一般来源于上一个卷积层,主要作用有两个:一是保留主要的特征,同时减少下一层的参数和计算量,防止过拟合;二是保持某种不变性,包括Translation(平移)、Rotation(旋转)、Scale(尺寸)。常用的池化方法有均值池化(Mean-Pooling)和最大池化(Max-Pooling)。
图3-22展示了将上一次卷积运算的结果作为输入,分别经过最大池化及均值池化运算后的结果。先将输入矩阵平均划分为若干对称子集,再计算子集中的最大值和平均值。
图3-22 两种池化的结果
当然,具体到图像的卷积运算,还要考虑红、绿、蓝(Red、Green、Blue,RGB)三种颜色,图像已经不是简单的二维矩阵,而应该是三维矩阵。但是卷积运算的原理是相同的,即使用一个规模较小的三维矩阵作为卷积核,当卷积核在规定范围内滑动时,计算出相应的输出信息。
(3)全连接层
卷积运算中的卷积核的基本单元是局部视野,它的主要作用是将输入信息中的各个特征提取出来,它是将外界信息翻译成神经信号的工具;当然,经过卷积运算的输出信号,彼此之间可能不存在交集。通过全连接层(Fully Connected Layer),我们就有机会将前述输入信号中的特征提取出来,供决策参考。当然,全连接的个数是非常多的,N个输入信号,M个全连接节点,那就有N×M个全连接,由此带来的计算代价也是非常高的。
3. 深度学习的不足
深度学习技术在取得成功的同时,也存在着一些问题:一是面向任务单一;二是依赖于大规模有标签数据;三是几乎是个“黑箱”模型,可解释性不强。
目前无监督的深度学习、迁移学习、深度强化学习和贝叶斯深度学习等也备受关注。深度学习具有很好的可推广性和应用性,但并不是人工智能的全部。
3.2.3 经典深度学习模型
1. LeNet
LeNet-5是一个较为简单的神经网络。图3-23显示了其结构。将字母K的这张图通过卷积核扫描,得到不同的特征图,然后进一步得到细节更多的特征图,最终通过全连接的网络,把所有数值输出到最终结果,通过激活函数得出是哪个数字的概率。
图3-23 LeNet-5神经网络结构
2. AlexNet
2012年,Alex Krizhevsky在ILSVRC(ImageNet大规模视觉识别排战赛)提出的CNN模型,其效果大幅度超越传统方法,获得了ILSVRC 2012年冠军,该模型被称作AlexNet,如图3-24所示。
这也是首次将深度学习用于大规模图像分类中。
图3-24 AlexNet神经网络
3. VGGNet
VGGNet(Visual Geometry Group Net)是牛津大学计算机视觉组和Google DeepMind公司的研究员共同研发的深度卷积神经网络。VGG Net主要探究了卷积神经网络的深度和其性能之间的关系,通过反复堆叠3×3的小卷积核和2×2的最大池化层,VGGNet成功地搭建了16~19层的深度卷积神经网络。与之前的State-Of-The-Art的网络结构相比,错误率大幅度下降;同时,VGGNet的泛化能力非常好,在不同的图片数据集上都有良好的表现。到目前为止,VGGNet依然经常被用来提取特征图像。
4. GoogleNet
2014年,GoogleNet在ILSVRC上获得了冠军,采用了NIN (Network In Network)模型思想,由多组Inception模块组成。
从AlexNet之后,涌现了一系列CNN模型,不断地在ImageNet上刷新成绩,如图3-25所示。随着模型变得越来越深及精妙的结构设计,Top-5的错误率也越来越低,降到了3.5%附近。而在同样的ImageNet数据集上,人眼的辨识错误率大概在5.1%,也就是说,目前的深度学习模型的识别能力已经超过了人眼。
图3-25 深度学习模型的识别能力