等风来:深度学习的大时代
深度学习(Deep Learning),这是一个在近几年火遍各个领域的词汇,似乎所有的算法只要跟它扯上关系,瞬间就显得高大上起来。但其实,从2006年Hinton在Science上的论文算起,深度学习发展至今才不到十年。
格灵深瞳·07/09 13:15评论(0)收藏(0)字体:宋
作者:张德兵 格灵深瞳计算机视觉工程师
深度学习(Deep Learning),这是一个在近几年火遍各个领域的词汇,似乎所有的算法只要跟它扯上关系,瞬间就显得高大上起来。但其实,从2006年Hinton在Science上的论文算起,深度学习发展至今才不到十年。
在这短短几年时间里,深度学习颠覆了语音识别、图像分类、文本理解等众多领域的算法设计思路,渐渐形成了一种从训练数据出发,经过一个端到端(end-to-end)的模型,然后直接输出得到最终结果的一种新模式。这不仅让一切变得更加简单,而且由于深度学习中的每一层都可以为了最终的任务来调整自己,最终实现各层之间的通力合作,因而可以大大提高任务的准确度。随着大数据时代的到来以及GPU等各种更加强大的计算设备的发展,深度学习如虎添翼,可以充分利用各种海量数据(标注数据、弱标注数据或者仅仅数据本身),完全自动地学习到抽象的知识表达,即把原始数据浓缩成某种知识。当然,深度学习不见得是最完美的框架,离最终所谓的智能也还差得很远,而且目前还基本没有理论上的有效性解释。但是,无论如何,深度学习之风已经势不可挡!
深度学习本质上其实就是多层神经网络,而神经网络这个东西几十年前大家就开始研究了。我们知道,神经网络的一层,其实就是一个线性变换加上一个简单的非线性操作,而多层神经网络其实就是多个简单的非线性函数的复合。一层、两层的网络用途比较有限,往往很难刻画输入与输出之间的复杂关系。但是深层的网络,历史上又一直无法进行有效训练。这大概是因为有以下三个难点难以突破:
一、优化方面。
(1)优化策略的核心就是梯度下降法,但对于一个深层的网络,它的函数的梯度也非常复杂。于是,误差反向传播算法就经常在参数初始值选择不当的时候产生梯度消失或者梯度爆炸现象,导致优化无法正常进行。
(2)深层网络由于是高度非线性的,有着太多的局部极值,很难保证能够得到一个可以接受的好的解。
二、数据方面。
早期,各种数据集往往都非常小,经常是几百几千的规模。人们都侧重于解决如何在小数据情形下的算法过拟合问题,典型的就是SVM。这时候,复杂的多层神经网络根本用不上,他们在数据量不足的情况下会过拟合的非常严重。
三、计算能力方面。
深度学习的经典模型卷积神经网络(CNN)其实在上世纪八九十年代就出现了,而且其中LeNet-5模型在简单的手写体识别问题上已经取得了很大的成功。但是当时的计算能力无法支持更大规模的网络,而LeNet-5在复杂物体识别上的表现也并不好,所以影响了人们对这一系列算法的进一步研究。
由于以上种种原因,神经网络一度曾经非常低调。直到2006年,著名的学者Geoffrey Hinton在Science上发表了一篇论文,给出了训练深层网络的新思路。大概想法是先分层进行预训练,然后把预训练的结果当成模型参数的初始值,再从头进行正常的训练过程。这个想法现在看起来很简单,但对于全连型的深层网络来说却是非常有效的。
关于语音识别:
2009年,Hinton把深层神经网络介绍给做语音识别的学者们。然后2010年,语音识别就产生了巨大突破。本质上是把传统的混合高斯模型(GMM)替换成了深度神经网络(DNN)模型,但相对识别错误率一下降低20%多,这个改进幅度超过了过去很多年的总和。这里的关键是把原来模型中通过GMM建模的手工特征换成了通过DNN进行更加复杂的特征学习。在此之后,在深度学习框架下,人们还在不断利用更好的模型和更多的训练数据进一步改进结果。现在语音识别已经真正变得比较成熟,并且被广泛商用,且目前所有的商用语音识别算法没有一个不是基于深度学习的。
关于视觉问题:
人们初步看到了深度网络的优势,但还是有很多人质疑它。语音识别是成功了,那么图像分类呢?2012年之前,深度学习好像还是只能处理像MNIST手写体分类这样的简单任务。说来也巧,这时候正举行了两届ImageNet比赛。这是一个比手写体分类复杂得多的图像分类任务,总共有100万张图片,分辨率300x300左右,1000个类别。前两届的冠军采用的都是传统人工设计特征然后学习分类器的思路。第一届是2010年,当时冠军的准确率(top 5精度)是71.8%,而2011年是74.3%。由于Hinton经常被其它研究人员“嘲讽”说深度学习在图像领域没有用,于是2012年,Hinton和他的学生Alex等人参赛,把准确率一下提高到84.7%。当然,他们的成功借助了ImageNet这个足够大的数据集,借助了GPU的强大计算能力,借助了比较深层的CNN网络,借助了随机梯度下降(SGD)和Dropout等优化技巧,借助了训练数据扩充策略(Data Augmentation)。但无论如何,他们靠着深度学习震惊了机器学习领域,从此大量的研究人员开始进入这个领域,一发不可收拾。2013年是89%,2014年是93.4%,截止到现在(2015年5月份),ImageNet数据集的精度已经达到了95%以上,某种程度上跟人的分辨能力相当了。
不仅仅是图像分类,在更广泛的视觉问题上,深度学习都产生了重大影响。简要列举几个如下:
一、人脸识别(Face Verification)。LFW数据库上的结果,从最早的90%左右的正确率,一路被研究人员刷到了99.5%以上。人脸相关的应用受此影响,也越来越多。
二、通用物体检测。ImageNet上的检测任务结果,MAP从最早的0.3左右,一路提高到0.66,感觉提高空间还有不少。
三、图像分割。现在深度学习已经可以做到输入是一张图片,输出就是逐个像素分割后的结果,中间也不需要任何预处理,并且精度远超非深度学习的结果。
四、光学字符识别(OCR)。这里指一般意义的字符序列识别。这个问题的传统做法也是非常复杂的,需要进行字符分割,各种预处理,然后单个字符预测完成后如何拼成完整输出等等。深度学习的做法也是端到端的,输入是图片形式的文字,输出直接就是识别结果了,简单、方便还更准确。所以,现在很多简单点的验证码,想作为图灵测试,分辨人还是robot的话,已经没太大用处了。
五、玩游戏——DeepMind团队的杰作。基于深度学习和强化学习(Reinforcement Learning),计算机已经可以自己学习玩一些简单游戏了,整个过程不需要任何人的干预。对于打砖块这样的简单游戏,甚至已经超过了普通玩家的水平。
简单总结一下视觉的部分。我们经常在媒体上看到深度学习在某领域又超过人的水平了。还有些乐观的人说,深度学习可以处理所有人的视觉在0.1秒内可以解决的问题。这些或许言过其实,不过毫无疑问体现了深度学习带给人们的强烈震撼!
关于文本理解:
除了语音和图像之外,另一个机器学习的重要前沿阵地就是文本理解了,深度学习的大量研究人员都集中于此。这里简单介绍三点。
一、关于文本,一个很重要的工作是词向量(word2vec)。
词向量是指通过对大量文本的学习(不需要标注),根据前后文自动学习到每个词的语义,然后把每个词映射为一个紧凑的实数向量形式的表达,而且具有很多好的性质,比如vec(中国)减去vec(北京)约等于vec(英国)减去vec(伦敦)。这里强调一句,这种向量化的紧凑表达形式在深度学习中是非常重要和普适的。任何抽象的知识都可以建模成这种紧凑的向量形式。类似的还有很多扩展性工作,比如,人们研究如何把一句话映射为一个向量,甚至把一段文字映射为一个向量。
二、文本的各个词之间是有顺序的,而传统做法总是采用词袋模型忽略掉这些顺序。
为了更好的挖掘和利用这个性质,人们渐渐倾向于采用递归神经网络(RNN)来描述它。RNN也不是什么新鲜事物,其实就是允许节点之间的连接有环的存在。不过就像我们之前说的,大数据、GPU、优化、深度学习在其它领域的突破等等又给它带来了新的活力。RNN做文本理解的大概思路是,按顺序处理一段话的每个单词,在它看到后面内容的时候,它的某些参数里还保留着对前面看到过的信息的“整合和抽象”。没错,它是有一定的记忆功能的,而且不需要人为告诉它应该记住什么,它会从训练数据中自然的进行学习,然后记忆在“环”里。可以想像,RNN的结构比普通神经网络复杂,而且优化过程更加困难,但目前已经有了BPTT、LSTM等很多解决方案,在这方面有着很多的相关工作,总体来看,结果让人觉得很有希望。
三、最近产生了深度图灵机(Deep Turing Machine)。
它简单来说就是RNN加上一块专门用于记忆的部分。这是个更加一般化的计算模式,和图灵机计算能力等价。它的记忆体其实就是一个实数矩阵。呵呵,我们又一次见到了这种连续的紧凑向量或者矩阵的表达形式。它可以记录信息而且方便梯度传递,经常被研究人员拿来各种建模,是构建端到端的模型,进行统一优化的利器。
深度学习工具:
说了这么多,大家可能还是云里雾里。毕竟各种模型都有很多细节,而且还有很多的所谓“trick”,甚至深度学习也曾经因此而戏称为是一种“艺术”而不是“科学”。
所以下面列举几个工具包,并配上一点非常简单的说明,方便大家进行实战演练。
0.首先你最好要有个能支持cuda的GPU。否则纯CPU是很慢的,尤其是处理图像的问题。
1.Theano(基于Python), http://deeplearning.net/tutorial/系列教材就是基于Theano工具的。它的最大优点是支持自动符号求导,避免了初学者很害怕的BP推导。有很多扩展包,比如keras等,支持各类模型。其实列举这一个就够了。因为,如果仔细的话,你会在这个网站看到无数的深度学习相关工作链接,足够慢慢扩展到深度学习的所有前沿研究和工具了。
2.Torch (https://github.com/torch/torch7/wiki/Cheatsheet)。基于lua编程语言(类matlab)。用的人非常多,因此很多常见模块的实现都很全面。
3.DeepLearnToolbox (https://github.com/rasmusbergpalm/DeepLearnToolbox)。基于matlab。代码逻辑清楚,适合跟着代码学习深度学习的每个细节。
4.Caffe (http://caffe.berkeleyvision.org/)。纯c++。科学研究中很多学者常用的工具,文档也很齐全。做物体检测相关任务的话,非常推荐!
5.Cuda-convnet2 (https://code.google.com/p/cuda-convnet2/)。效率高,支持单机多卡。ImageNet 2012年冠军Alex的作品!不过代码有点抽象难改,而且只支持GPU并且是特定的几款GPU(也就是说是Alex大神是做过特定GPU优化的)。做简单的分类、回归问题推荐!不支持RNN。
6.Cxxnet (https://github.com/dmlc/cxxnet)。纯c++。优点:支持多机多卡训练,适合公司级的部署。