深度学习史上最全总结(文末有福利)
深度学习(Deep Learning),这是一个在近几年火遍各个领域的词汇,似乎所有的算法只要跟它扯上关系,瞬间就显得高大上起来。但其实,从2006年Hinton在Science上的论文算起,深度学习发展至今才不到十年。
四大金刚镇楼
在这短短几年时间里,深度学习颠覆了语音识别、图像分类、文本理解等众多领域的算法设计思路,渐渐形成了一种从训练数据出发,经过一个端到端(end-to-end)的模型,然后直接输出得到最终结果的一种新模式。这不仅让一切变得更加简单,而且由于深度学习中的每一层都可以为了最终的任务来调整自己,最终实现各层之间的通力合作,因而可以大大提高任务的准确度。随着大数据时代的到来以及GPU等各种更加强大的计算设备的发展,深度学习如虎添翼,可以充分利用各种海量数据(标注数据、弱标注数据或者仅仅数据本身),完全自动地学习到抽象的知识表达,即把原始数据浓缩成某种知识。
当然,深度学习不见得是最完美的框架,离最终所谓的智能也还差得很远,而且目前还基本没有理论上的有效性解释。但是,无论如何,深度学习之风已经势不可挡!
深度学习本质上其实就是多层神经网络,而神经网络这个东西几十年前大家就开始研究了。我们知道,神经网络的一层,其实就是一个线性变换加上一个简单的非线性操作,而多层神经网络其实就是多个简单的非线性函数的复合。一层、两层的网络用途比较有限,往往很难刻画输入与输出之间的复杂关系。但是深层的网络,历史上又一直无法进行有效训练。这大概是因为有以下三个难点难以突破:
由于以上种种原因,神经网络一度曾经非常低调。直到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%以上,某种程度上跟人的分辨能力相当了。
不仅仅是图像分类,在更广泛的视觉问题上,深度学习都产生了重大影响。简要列举几个如下:
人脸识别——LFW数据库上的结果,从最早的90%左右的正确率,一路被研究人员刷到了99.5%以上。人脸相关的应用受此影响,也越来越多。
通用物体检测——ImageNet上的检测任务结果,MAP从最早的0.3左右,一路提高到0.66,感觉提高空间还有不少。
图像分割——现在深度学习已经可以做到输入是一张图片,输出就是逐个像素分割后的结果,中间也不需要任何预处理,并且精度远超非深度学习的结果。
光学字符识别——这里指一般意义的字符序列识别。这个问题的传统做法也是非常复杂的,需要进行字符分割,各种预处理,然后单个字符预测完成后如何拼成完整输出等等。深度学习的做法也是端到端的,输入是图片形式的文字,输出直接就是识别结果了,简单、方便还更准确。所以,现在很多简单点的验证码,想作为图灵测试,分辨人还是robot的话,已经没太大用处了。
玩游戏——DeepMind团队的杰作。基于深度学习和强化学习(Reinforcement Learning),计算机已经可以自己学习玩一些简单游戏了,整个过程不需要任何人的干预。对于打砖块这样的简单游戏,甚至已经超过了普通玩家的水平。
简单总结一下视觉的部分。我们经常在媒体上看到深度学习在某领域又超过人的水平了。还有些乐观的人说,深度学习可以处理所有人的视觉在0.1秒内可以解决的问题。这些或许言过其实,不过毫无疑问体现了深度学习带给人们的强烈震撼!
除了语音和图像之外,另一个机器学习的重要前沿阵地就是文本理解了,深度学习的大量研究人员都集中于此。这里简单介绍三点。
说了这么多,大家可能还是云里雾里。毕竟各种模型都有很多细节,而且还有很多的所谓“trick”,甚至深度学习也曾经因此而戏称为是一种“艺术”而不是“科学”。
所以下面列举几个工具包,并配上一点非常简单的说明,方便大家进行实战演练。
首先你最好要有个能支持cuda的GPU,否则纯CPU是很慢的,尤其是处理图像的问题。
Theano(基于Python), http://deeplearning.net/tutorial/系列教材就是基于Theano工具的。它的最大优点是支持自动符号求导,避免了初学者很害怕的BP推导,有很多扩展包,比如keras等,支持各类模型。其实列举这一个就够了。因为,如果仔细的话,你会在这个网站看到无数的深度学习相关工作链接,足够慢慢扩展到深度学习的所有前沿研究和工具了。
Torch (https://github.com/torch/torch7/wiki/Cheatsheet),基于lua编程语言(类matlab)。用的人非常多,因此很多常见模块的实现都很全面。
DeepLearnToolbox (https://github.com/rasmusbergpalm/DeepLearnToolbox),基于matlab。代码逻辑清楚,适合跟着代码学习深度学习的每个细节。
Caffe (http://caffe.berkeleyvision.org/),纯c++,科学研究中很多学者常用的工具,文档也很齐全。做物体检测相关任务的话,非常推荐!
Cuda-convnet2 (https://code.google.com/p/cuda-convnet2/),效率高,支持单机多卡。ImageNet2012年冠军Alex的作品!不过代码有点抽象难改,而且只支持GPU并且是特定的几款GPU(也就是说是Alex大神是做过特定GPU优化的)。做简单的分类、回归问题推荐!不支持RNN。
Cxxnet (https://github.com/dmlc/cxxnet),纯c++。优点:支持多机多卡训练,适合公司级的部署。
深度学习不管未来发展如何,至少在目前看来是非常有效的一种机器学习方法。但是,它的不确定性也让很多人又爱又恨。