深度学习:21天实战Caffe
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2天 深度学习的过往

今天让我们缅怀历史,展望未来。

深度学习有着悠久而丰富的历史。在过去很长一段时期内备受冷落,而在最近5年,大规模训练数据(如ImageNet)和高性能计算硬件(GPU)的出现,为这个领域重新提供了燃料和助推器。

2.1 传统机器学习的局限性

传统机器学习技术在处理原始形态的自然数据方面有很大的局限性。

几十年来,构建模式识别或机器学习系统需要技艺高超的工程师和经验丰富的领域专家来设计特征提取器(Feature Extractor),将原始数据(如图像的像素值)转化为合适的中间表示形式或特征向量(Feature Vector),学习子系统(通常为分类器)可以对输入模式进行检测或分类,如图2-1所示。

图2-1 传统机器学习处理模式

深度学习方法则不需要人工设计特征提取器,而是由机器自动学习获得,特别适用于变化多端的自然数据,具有非常优良的泛化能力和鲁棒性。

深度学习不是一天建成的,有一个长期进化的过程,我们来一探究竟。

2.2 从表示学习到深度学习

在表示学习(Representation Learning)系统中,直接以原始数据形式提供机器输入,自动发现用于检测和分类的表示(Representation)。深度学习是一种多层表示学习方法,用简单的非线性模块构建而成,这些模块将上一层表示(从原始数据开始)转化为更高层、更抽象的表示。当一个学习系统由足够多这样简单的非线性模块构建时,可以学习非常复杂的功能。

对于分类问题,高层表示能强调重要的类别信息,同时抑制无关的背景信息。一幅图像总是以像素值数组形式提供网络输入,第一层学习到的特征为边缘信息,即图像某个位置是否存在特定朝向的边缘;第二层检测边缘信息按特定方式排列组成的基本图案,而不关心边缘位置的变化;第三层将基本图案组合起来,对应典型物体的部件,后续层检测由部件组成的物体,如图2-2所示。深度学习最关键的方面是这些特征层不是由专家设计的,而是使用通用学习方法自动从数据学习得到。这些从低到高的“表示”是人类无法预估的,完全由机器决定哪些特征是自己需要的,哪些是可以抑制的。

图2-2 表示学习中间特征

深度学习十分擅长在高维数据中发现复杂结构,可应用于科学、商业和政务等很多领域,在图像识别、语音识别中打破多项纪录。更惊人的是,在自然语言理解(特别是主题分类、句法分析、问答系统和语言翻译)中产生了大量有价值的结果。

深度学习只需少量人工介入,非常适合当前大规模计算系统和海量数据,在不久的将来会有更多的成功案例。当前正在开发的用于深度神经网络的新学习算法和架构将加快这个进程。

2.3 监督学习

机器学习(不论深浅)最普遍的形式是监督学习。

设想我们希望构建一个可以分类图像包含内容(房子、车、人和宠物)的系统。首先收集大量关于房子、车、人和宠物的图像数据集,每张图像都按照其类别打标签。

在训练阶段,向机器送入一张图像,产生一个得分向量,每个元素对应一个类别。我们希望真实类别在所有类别中得最高分(实际上在训练前是不会发生的)。我们通过计算目标函数来度量输出得分与期望形式得分的差异(或距离),之后机器改变内部可调参数来降低这个目标函数。可调参数为实数,常被称为权值,可被看作定义机器输入-输出函数的“旋钮”。在典型深度学习系统中,可能有上亿个可调权值,同时会有上亿个带标签的训练样本用于训练该机器。

为了恰当调节权值向量,学习算法计算梯度向量,表示每个权值增加一个微小值时目标函数的变化量,之后权值向量根据梯度向量的相反方向来调节。目标函数在所有训练样本上取平均,可看作权值向量所在高维空间的丘陵平面。负梯度向量指示当前平面最陡的下降方向,将目标函数带入距离最小值更近的地方,输出误差在平均意义上更低。

在实际中,大多数工程师都使用随机梯度下降(Stochastic Gradient Descent, SGD)方法,包括输入少量样本、计算输出和误差、计算这些样本的平均梯度、根据梯度调节权值。对训练集中大量的小样本集重复该过程,直到目标函数平均值停止下降。它之所以被称作随机梯度下降法,是由于每个小样本子集提供了所有样本平均梯度的带噪声估计。相比更精确的优化技术,这个简单方法通常能更快地找到一组好的权值。训练完成后,在一组不同的样本(称为测试集)上测试系统性能,目的是测试机器泛化能力——它在训练阶段没有见过的新输入上产生合理输出的能力。

在很多机器学习实际应用中,在人工特征上使用线性分类器。二分类线性分类器计算特征向量元素的加权和。如果加权和高于某个门限,输入将被分到一个特定类别。

1960年以后,线性分类器的局限性开始被认识到,它只能将输入空间切分为非常简单的区域,即由一个超平面分离的半空间。对于像图像和语音识别这类问题,需要输入-输出函数对输入的非相关变化(位置变化、方向变化、光照变化、语音的高音和低音变化)不敏感,而对类别敏感(如白狼和萨摩耶犬)。在像素级别,两张不同姿态、不同环境下萨摩耶犬的照片会有极大的不同,而同样背景、同样位置的萨摩耶犬和白狼照片可能非常相似。对直接操作图像像素的线性分类器或其他“浅层”分类器可能不容易区分后两张照片,同时将前两张照片放在同一类。这就是为什么浅层分类器需要好的特征提取器——有选择性地产生图片中重要类别信息的表示,同时对无关信息如姿态具有不变性——以解决选择无关困境。

为了让分类器更强大,可以使用广义非线性特征以及核函数方法。但广义特征(如高斯核函数)泛化能力差,常规方法是手动设计好的特征提取器,而这需要大量工程经验和领域专家才能完成。

如果好的特征可以使用通用学习方法自动学到,上述问题都可以避免。这是深度学习的核心优势。

一个深度学习架构是将简单模块多层堆叠,大多数模块是具备学习能力的,能计算非线性输入-输出映射。每个模块将它的输入变换,提高可选择性和表示不变性。多个非线性层(5~20层)构成的系统可以实现非常复杂的函数,例如同时做到对类间差异敏感(区分萨摩耶犬和白狼)和对类内差异不敏感(萨摩耶犬在不同背景、姿势、光照和周边物体下的照片都能正确识别)。

2.4 反向传播算法

从最早的模式识别(Pattern Recognition)时期开始,研究者的目标就是用可训练的多层网络取代人工特征工程。但该解决方案并没有被广泛认可,直到20世纪80年代中期,研究者才证明多层架构可以通过SGD训练。只要模块是其输入和内部权值的相对平滑函数,就可以使用反向传播步骤计算梯度。在20世纪70、80年代,几个不同的研究组分别独立发现该思路可行且的确可用。

利用反向传播方法计算目标函数相对多层网络权值的梯度过程,其实就是《高等数学》中求导数链式法则的工程应用。

如图2-3(左)所示为一个具有双隐层深度前馈网络的前向传播计算流程,每层我们选择其中一个节点进行计算演示。

图2-3 前向传播(左)和反向传播(右)计算流程

从输入单元到第一个隐层H1计算如下:

对H1层的每个单元j,其值yj = f(zj), zj=∑iwijxi,其中i取值遍历所有输入层节点,zj是对前一层所有节点的加权和,这里省略了偏置项。网络中使用非线性函数 fzj进行非线性变换,得到该层输出yj

从H1到H2计算如下:

对H2层的每个单元k,其值yk = f(zk), zk=∑jwjk y j,其中j取值遍历所有H1层节点。

从H2到输出层计算如下:

对输出层的每个单元l,其值yl= f(zl), zl=∑kwk l y k,其中k取值遍历所有H2层节点。

如图2-3(右)所示为同一个深度前馈网络的反向传播计算流程,每层我们仍然选择其中一个节点进行计算演示。

每层首先计算相对于该层输出节点的误差梯度,即所有来自相对于后一层输入节点的误差梯度的加权和。之后使用链式法则将误差梯度传递至该层输入节点。输出单元的误差梯度通过对代价函数(或损失函数)求导得到,假设输出层单元l对应的代价函数项为E=0.5(yltl)2,其中tl为期望输出值,可计算相对于yl的偏导数为yltl。由于yl=f(zl),所以代价函数相对于zl的偏导数为:

从输出单元到第二个隐层H2计算如下:

对H2层的每个单元k,其误差梯度为,其中l取值遍历所有输出层节点。

同理,可得出H1层的误差梯度为,其中 k 取遍H2层所有节点。

输入层的误差梯度为,其中j取遍H1层所有节点。

通过上面的公式可以了解到,反向传播算法的关键一点就是代价函数相对于一个模块输入的导数(或梯度),可以通过目标函数相对于该模块输出的导数反向传播求得。反向传播公式可以重复应用,将梯度从顶层输出(网络产生预测的位置)通过所有模块传递到底(输入层)。所有这些中间梯度被计算出来后,再计算代价目标函数相对于每个模块内部权值的梯度就非常容易了。以输入层到H1层权值为例,其误差梯度为,其中i取遍输入层所有节点。

2.5 卷积神经网络

有一种特殊类型的深度前馈网络,训练更简单,泛化能力比相邻层用全连接更好,这就是卷积神经网络(ConvNet)。当神经网络被抛弃时,它却在多个领域取得成功,如今在计算机视觉社区被广泛接受。

ConvNet的四项基本原则:局部互联、共享权值、下采样以及使用多个卷积层

共享权值意味着更少的参数量,下采样保证了局部不变性,多特征图允许不同卷积核作为不同特征提取器,训练时使用反向传播算法。典型的ConvNet架构如图2-4所示。

图2-4 卷积神经网络架构

前几个阶段由两种层构成:卷积层和下采样层(pooling layer)。卷积层的单元组织为特征图(feature map),每个单元通过一组称为滤波器组的权值连接到上一层特征图的局部小块。局部小块的加权和将被非线性单元(如ReLU)处理。同一特征图的所有单元共享同一套滤波器组,而同一层的不同特征图使用不同的滤波器组。使用这种架构的原因有两方面:一方面,在一组类似图像的数据中,局部像素块具有高度相关性,形成不同的、易检测的基本图案;另一方面,图像和其他信号的局部统计具有位置无关性。

换句话说,如果一张图像存在某个基本图案,该图案可能出现在任意位置,那么不同位置单元共享相同权值可实现在数据的不同位置检测相同“模式”。一张特征图执行的滤波操作在数学上表述为离散卷积,“卷积层”名称由此而来。

卷积层的任务是检测前一层的局部连接特征,而下采样层是将语义相似的特征融合为一个。由于相对位置特征形成一个基本图案可能会有些许变化,可靠检测该图案可以使用粗粒度位置实现。

典型的下采样器计算每一张特征图(或某几张特征图)的局部小块最大值。相邻下采样器的输入源相互错开不少于一行或一列,因此可以降低表示维度,而且对平移、形变不敏感。

卷积层-非线性层-下采样层堆叠为一个基本处理栈,在一个完整的网络中可以重复多个基本处理栈后再接入更多的卷积层或全连接层。卷积网络的梯度反向传播过程与普通深度网络一样简单,所有滤波器组的权值都能得到训练。

深度神经网络揭示了很多自然信号具有复合结构的特点。高层特征可通过低层特征组合得到。图像中,棱边经过局部组合可构成基本图案,而基本图案组合成部件,部件又构成了物体。语音和文本也存在相似结构,即由声音(sound)到语音(phone),再到音素(phoneme)、音节(syllable)、单词(word)、句子(sentence)。下采样层可保证新的特征层表示不敏感于前一层元素在位置和表现上的变化。

早在20世纪90年代左右就已经有大量的卷积神经网络应用案例,从用于语音识别和文档阅读的时间延迟神经网络开始。文档阅读系统将ConvNet与实现语言约束的概率模型一起训练。到90年代末,该系统阅读全美国10%的支票。不久微软开发了一些基于ConvNet的光学字符识别(Optical Character Recognition, OCR)和手写体识别系统[2]。ConvNet在自然图像的目标检测(人脸和手的检测、人脸识别)中有大量实践[3][4][5]

21世纪早期,ConvNet已经成功应用到检测、分割和识别图像中的物体和区域。所有这些任务有相对充裕的带标签数据,例如交通标志识别、生物图像分割(特别是连接组),以及自然图像中人脸检测、文本检测、行人检测和人体检测。近期ConvNet成功用于人脸检测[6]

更重要的是,图像可以在像素级别打标签,在技术上有所应用,包括自动行驶机器人、自动驾驶汽车。比如Mobileye和NVIDIA准备将基于ConvNet的方法应用于即将发布的汽车视觉系统中。其他应用如自然语言理解和语音识别中,ConvNet的重要性也在不断加强。

除了上述成功案例,ConvNet被主流计算机视觉和机器学习社区所忽视,直到2012年的ImageNet比赛才改变了这一状况。那一年深度卷积网络应用到百万量级的数据集,包括1000个不同类别,获得优异成绩,几乎将之前最好的比赛结果错误率降低一半[7]。GPU的使用、ReLU方法及一种新的规整化技术——Dropout,以及数据增强技术造就了该方案的成功,为计算机视觉领域带来巨大变革。目前几乎所有的识别和检测问题都将ConvNet作为主流处理方法,某些任务达到甚至超过了人类的能力[8][9][10]。基于ConvNet的视觉系统的突出性能引无数互联网和IT公司竞折腰,包括Google、Facebook、Microsoft、IBM、Yahoo! 、Twitter和Adobe,以及国内的BAT、迅速增长的创业公司纷纷对该技术发起研究,开发工程并部署基于ConvNet的图像理解产品和服务。

2.6 深度学习反思

读史使人明智,通过历史可以找到前人的闪光点,指导后人少踩坑。

深度学习也有坑。深度学习看似万能,实则有很多调参技巧在里面,掌握得当可以快速获得模型,否则可能费力不讨好。

模型参数远大于数据量时,相当于求解一个欠定方程,存在多解的可能性大,容易产生过拟合问题。

模型参数远小于数据量时,相当于求解超定方程,可能无解,或者有解但准确率很低,这属于欠拟合问题。

模型参数与数据量匹配时,相当于求解恰定方程,既能避免过拟合,又能兼顾准确率,但模型参数量和数据量怎样才能做到匹配,是一个工程问题。

所以,如果你选择用某个模型处理数据,那么应该考虑这个因素,越大的模型越难训练,因为需要与之匹配的数据量、一系列避免过拟合的方法才能训练得到一个较为理想的模型。幸运的是,我们可以将大模型首先在较大的数据集(如ImageNet)上预训练,得到模型,再对特定数据集(如人脸数据)进行精调(fine-tuning),即可得到较为理想的结果。

2.7 练习题

1.复习高等数学求导链式法则。

2.复习线性代数矩阵乘法。

2.8 参考资料

[1] 本部分内容参考并翻译自:Deep learning, Yann LeCun, YoshuaBengio, Geoffrey Hinton

[2] Simard, D., Steinkraus, P. Y. & Platt, J. C. Best practices for convolutional neural networks. In Proc. Document Analysis and Recognition 958-963 (2003)

[3] Vaillant, R., Monrocq, C. &LeCun, Y. Original approach for the localisation of objects in images. In Proc. Vision, Image, and Signal Processing 141, 245-250 (1994)

[4] Nowlan, S. & Platt, J. in Neural Information Processing Systems 901-908 (1995)

[5] Lawrence, S., Giles, C. L., Tsoi, A. C. & Back, A. D. Face recognition: aconvolutional neural-network approach. IEEE Trans. Neural Networks 8, 98-113 (1997)

[6] Taigman, Y., Yang, M., Ranzato, M.&Wolf, L.Deepface: closing the gap to human-level performance in face verification. In Proc. Conference on Computer Vision and Pattern Recognition 1701-1708 (2014)

[7] http://image-net.org/challenges/LSVRC/2012/results.html

[8] Surpassing Human-Level Face Verification Performance on LFW with GaussianFace, arXiv:1404.3840v1

[9] Delving Deep into Rectifiers:Surpassing Human-Level Performance on ImageNet Classification, arXiv:1502.01852v1

[10] Mastering the game of Go with deep neural networks and tree search, NATURE | VOL 529 |28 JANUARY 2016