程序员为什么要学习深度学习?
深度学习本身就是一个非常庞大的知识体系。在本文中,我们想从程序员的角度来观察深度学习对程序员意味着什么,以及我们如何利用这样一门快速发展的学科来帮助程序员提高软件开发能力。
本文基于费在2016QCon全球软件开发大会(上海)上的演讲。
序
1973年,美国上映了一部热门科幻电影《西部世界》,三年后又有了续集《未来世界》。这部电影于80年代初引入中国,名为《未来世界》。那部电影令我震惊。影片中有很多机器人,表情丰富的面孔下有集成电路板。这让我觉得当时的未来世界是那么的遥远和神秘。
现在是2016,可能很多朋友都在看HBO斥巨资拍摄的同题材连续剧《西部世界》。如果说前两部还局限于机器人、人工智能这样的话题,2016这部新剧在剧情和人工智能思维上都有了很大的突破。我们不是在渲染机器人是否会威胁人类,而是在讨论“Dreamsaremainlymemories”等更多的哲学问题。
“记忆如何影响智力”这个话题非常值得我们思考,也给了我们很好的启示——今天的人工智能领域有了怎样的发展和进步。
我们今天讨论的话题不仅仅是简单的人工智能。如果你对深度学习感兴趣,相信你会在搜索引擎上搜索过类似的相关关键词。我在谷歌上用深度学习作为关键词得到了2630万个搜索结果。这个数字比一周前多了300多万。这个数字足以看出深度学习相关内容发展的速度,人们对深度学习越来越重视。
从另一个角度,我想让你看看深度学习在市场上有多受欢迎。从2011到现在,已经收购了超过140家专注于人工智能和深度学习的创业公司。仅2016年,这样的并购就有40多起。
其中最疯狂的是谷歌,它收购了11家人工智能创业公司,最著名的就是打败了李世石九段的DeepMind。苹果、英特尔和Twitter紧随其后。以英特尔为例。仅在今年,它就收购了三家初创公司,Itseez、Nervana和Movidius。这一系列的大并购是为了布局人工智能和深度学习领域。
我们在搜索深度学习的话题时,经常会看到一些晦涩难懂的术语,比如梯度下降、反向传播、卷积神经网络、受限玻尔兹曼机等等。
打开任何一篇技术文章,都会看到各种各样的数学公式。左边看到的不是高水平的学术论文,只是维基百科对玻尔兹曼机器的介绍。维基百科是科普内容,其复杂程度超过了大多数数学知识的能力。
在这样的背景下,我今天的话题可以总结为三点:第一,为什么要学习深度学习;二、深度学习的关键概念是神经网络,那么什么是神经网络呢?第三,作为程序员,当我们想成为深度学习开发者的时候,需要什么样的工具箱,从哪里开始开发。
为什么要研究深度学习?
首先说一下为什么要学习深度学习。在这个市场中,并不缺少时尚新技术的概念和词汇。深度学习有什么不同?我非常喜欢吴恩达曾经用过的一个比喻。
他把深度学习比作火箭。这枚火箭最重要的部分是它的引擎。目前在这个领域,引擎的核心是神经网络。众所周知,火箭除了发动机还需要燃料,所以大数据实际上构成了整个火箭的另一个重要部分——燃料。过去我们谈大数据,更多的是侧重于数据的存储和管理能力,而这些方法和工具更多的是对过去历史数据的统计和总结。
对于未来未知的事物,这些传统的方法无法帮助我们从大数据中得出预测的结论。如果考虑神经网络和大数据的结合,就能看到大数据的真正价值和意义。AndrewNg曾说,“我们相信(以神经网络为代表的深度学习)是我们获得最接近人工智能的最短途径”。这是我们为什么要研究深度学习的一个最重要的原因。
其次,随着我们的数据处理和计算能力的不断提高,以深度学习为代表的人工智能技术相对于传统的人工智能技术在性能上有了突飞猛进的发展。这主要得益于过去几十年计算机及相关产业的不断发展所带来的成就。在人工智能领域,性能是我们选择深度学习的另一个重要原因。
这是英伟达今年发布的一段视频,讲述了深度学习在无人驾驶领域的应用。我们可以看到,仅仅经过3000英里的训练,深度学习就能在自动驾驶上应用到什么程度。在今年年初进行的实验中,这个系统并不具备真正的智能能力,经常会出现各种吓人的情况,有些情况下甚至需要人工干预。
但是经过3000英里的训练,我们看到在各种复杂路况下,比如山路、高速公路、泥泞,无人驾驶都有非常惊人的表现。请注意,这个深度学习模型只训练了几个月,3000英里。
如果我们继续改进这个模型,这个处理能力会变得多么强大。这个场景中最重要的技术无疑是深度学习。我们可以得出一个结论,深度学习可以为我们提供强大的能力,如果程序员拥有了这项技术,那就等于给了每一个程序员更多的权力。
神经网络快速介绍
如果我们对深度学习没有任何怀疑,那么我们肯定会关心我需要掌握什么样的知识才能让我进入这个领域。最重要的关键技术是“神经网络”。说到“神经网络”,很容易混淆这两个完全不同的概念。
一个是生物神经网络,第二个是我们今天要讲的人工智能神经网络。可能在座的各位都有从事人工智能的朋友。当你问他关于神经网络的问题时,他会抛出许多奇怪的概念和术语让你听起来云里雾里,你只能望而却步。
对于人工智能神经网络这个概念,大部分程序员都会觉得和自己有很大的距离。因为很难有人花时间和你分享神经网络的本质是什么。而你从书上读到的理论和概念,也帮助你找到一个清晰简单的结论。
今天,我们从程序员的角度来看看什么是神经网络。我第一次了解神经网络的概念是通过一部电影——1991上映的《终结者2》。男主角施瓦辛格有一句台词:
" mycpuisanural-net processor;Alearningcomputer。”(我的处理器是神经处理单元,是可以学习的计算机)。从历史上看,人类对自身智能的探索,远早于对神经网络的研究。
1852年,意大利学者因为一次偶然的失误,将人的头颅掉进了硝酸盐溶液中,从而获得了第一次用肉眼关注神经网络的机会。这个意外加速了对人类智能奥秘的探索,开启了人工智能、神经元等概念的发展。
生物神经网络的发展和我们今天说的神经网络有关系吗?我们今天说的神经网络,除了一些术语,和生物神经网络没有任何关系。完全是数学和计算机领域的概念,这也是人工智能成熟的标志。这一点我们要分清,不要把生物神经网络和我们今天讲的人工智能混为一谈。
在20世纪90年代中期,Vapnik等人提出了支持向量机(SVM)。很快,这种算法在无需调整参数、效率高、全局最优解等许多方面显示出了比神经网络更大的优势。由于这些原因,SVM算法很快击败了神经网络算法,成为那个时期的主流。然而,神经网络的研究又一次陷入了冰河时代。
在被抛弃的十年里,几位学者仍然坚持他们的研究。其中最重要的人是加拿大多伦多大学的杰弗里·辛顿教授。2006年,他在著名杂志《科学》上发表论文,首次提出了“深度信念网络”的概念。
与传统的训练方法不同,“深度信念网络”有一个“预训练”过程,可以很容易地使神经网络中的权重找到一个接近最优解的值,然后利用“微调”技术对整个网络进行优化。这两项技术的应用大大减少了训练多层神经网络的时间。他在论文中对多层神经网络相关的学习方法给出了一个新的术语“深度学习”。
很快,语音识别领域出现了深度学习。然后在2012,深度学习技术在图像识别领域发力。Hinton和他的学生在ImageNet大赛中用多层卷积神经网络成功训练了一百万张包含1000个类别的图片,取得了15%的好分类错误率,比第二名高出了近11个百分点。
这一结果充分证明了多层神经网络识别效果的优越性。自此,深度学习开启了新的黄金时代。我们看到了今天深度学习和神经网络的火热发展,也正是从那个时候开始引爆。
用神经网络构造分类器,这个神经网络的结构是怎样的?
其实这个结构很简单,我们看到这个图是一个简单神经网络的示意图。神经网络本质上是一个“有向图”。图上的每个节点都借用了生物学术语,有了一个新名词——“神经元”。连接神经元的有向线(有向弧)被视为“神经”。这张图中的神经元不是最重要的,但是连接神经元的神经才是最重要的。每个神经部分都有指向性,每个神经元都会指向下一级的节点。
节点是分层的,每个节点指向下一个节点。同级节点不相连,不能跨越上级节点。每条弧上都有一个值,我们通常称之为“重量”。通过权重,可以使用公式来计算它们所引用的节点的值。重量值是多少?我们通过训练得到了结果。它们的初始赋值往往从随机数开始,然后将训练得到的最接近真实值的结果作为模型,可以重复使用。这个结果就是我们所说的经过训练的分类器。
节点分为输入节点和输出节点,中间称为隐含层。简单来说,我们有数据输入项,中间有不同层次的神经网络,也就是我们所说的隐层。之所以这样叫,是因为这些能级对我们来说是看不见的。输出结果也叫输出节点,输出节点是有限的,输入节点也是有限的。隐含层是模型中我们可以设计的部分,这是神经网络最简单的概念。
如果做一个简单的类比,我想用一个四层神经网络来解释。左边是输入节点,我们看到有几个输入项,可能代表不同苹果的RGB值、口味或者其他输入数据项。中间的隐藏层是我们设计的神经网络。这个网络现在有不同的层级,层级之间的权重是我们通过不断训练得到的一个结果。
最终的输出结果存储在输出节点中。每一次都像流向一样,神经有方向,通过不同的层进行不同的计算。在隐含层中,每个节点的输入结果被计算为下一层的输入项,最终结果将保存在输出节点中。输出值最接近我们的分类,如果得到某个值,就归入某个类别。这是使用神经网络的简单概述。
除了从左到右表示的结构图之外,还有一个常用的表达式,表示一个自下而上的神经网络。此时,输入层位于图形的底部,输出层位于图形的顶部。从左到右,广泛使用AndrewNg和LeCun的文献。在Caffe框架中,表达是自下而上的。
简单来说,神经网络并不神秘,它只是一个利用图的处理能力提取和学习特征的过程。Hinton在2006年的著名论文将深度学习总结为三个最重要的元素:计算、数据和模型。有了这三点,就可以实现深度学习系统。
程序员需要的工具箱
对于程序员来说,掌握理论知识是为了更好的编程实践。那么我们来看看程序员需要准备哪些工具来进行深度学习的实践。
五金器具
硬件方面,我们首先想到的是CPU,我们可能需要的计算能力。除了通常的CPU架构,还有带乘法器的CPU来提高计算能力。此外,在不同领域还会有DSP的应用场景,比如手写识别、语音识别,以及其他特殊的信号处理器。另一类是GPU,这是目前深度学习应用的热点领域。最后一类是FPGA(可编程逻辑门阵列)。
这四种方式各有利弊,每个产品都会有很大的不同。相比较而言,CPU虽然算力弱,但擅长管理和调度,比如读取数据、管理文件、人机交互等。,而且它的工具也很丰富。相对于DSP,管理能力较弱,但加强了具体的运算能力。
两者都是依靠高频来解决计算的问题,适用于递归运算量大,分裂不方便的算法。GPU管理能力较弱,但计算能力较强。但由于计算单元较多,更适合整块数据流式传输的算法。
FPGA在管理和运算处理方面很强,但是开发周期长,很难开发复杂的算法。在实时性方面,FPGA是最高的。从目前的发展来看,对于普通程序员来说,现实中常用的计算资源仍然是CPU和GPU,其中GPU是最热门的领域。
这是我前天为这次分享准备的AWS上p2的一个例子。仅通过几个命令就完成了实例更新、驱动安装和环境设置,总的资源创建和设置时间约为10分钟。之前,我花了两天时间来安装和调试上面提到的电脑。
另外,从成本上也可以做一个比较。p2.8xLarge实例的成本是每小时7.20美元。我自己的电脑总成本是多少?16904元。这个费用足够我用p 2.8x large 350小时以上了。一年使用AWS深度学习站可以抵消我所有的努力。随着技术的不断升级,我可以不断升级我的例子,让我用有限的成本获得越来越多的处理资源。这其实就是云计算的价值。
云计算和深度学习有什么关系?今年8月8日,IDG网站上发表了一篇文章来谈论这个话题。这篇文章做了这样的预测:如果深度学习的并行能力继续提高,云计算提供的处理能力继续发展,两者结合可能会产生新一代的深度学习,带来更大的冲击和影响。这是一个需要大家考虑和关注的方向!
软件
除了硬件的基础环境,深度学习。程序员会更关心与开发相关的软件资源。这里我列出一些用过的软件框架和工具。
Scikit-learn是最流行的Python机器学习库。它具有以下吸引人的特点:简单、高效、极其丰富的数据挖掘/数据分析算法实现;基于NumPy、SciPy和matplotlib,集成了从数据探索性分析、数据可视化到算法实现的全过程。开源,有非常丰富的学习文档。
Caffe专注于体积、神经网络和图像处理。但是Caffe好久没更新了。这个框架的主要开发者贾也在今年跳槽到了谷歌。也许曾经的霸主会让位于别人。
Theano是一个非常灵活的Python机器学习库。它在研究领域非常流行,使用起来非常方便,也很容易定义复杂的模型。Tensorflow的API和Theano很像。我也在今年的北京QCon大会上分享了关于Theano的话题。
Jupyter notebook是一个基于ipython的强大的python代码编辑器。它部署在网页上,可以非常方便地用于交互处理。非常适合算法研究和数据处理。
Torch是一个优秀的机器学习库。它是由一个相对较小的lua语言实现的。但是因为使用了LuaJIT,程序的效率非常出色。脸书专注于人工智能领域的Torch,甚至现在它已经推出了自己的升级框架Torchnet。
深度学习的框架那么多,有没有一种百花齐放的感觉?我今天要重点讲的是张量流。这是Google在2015推出的一个开源的面向机器学习的开发框架,也是Google的第二代深度学习框架。很多公司都用TensorFlow开发了很多有趣的应用,效果非常好。
TensorFlow可以做什么?答案是,它可以应用于回归模型和深度学习的神经网络。在深度学习中,它集成了分布式表示、卷积神经网络(CNN)、递归神经网络(RNN)和长短期记忆人工神经网络(LSTM)。
关于张量流要理解的第一个概念是张量。这个词在字典里的定义是张量,张量是一个多线性函数,可以用来表示某些向量、标量和其他张量之间的线性关系。其实这个表达很难理解。用我自己的语言解释张量只是一个“n维数组”。
使用TensorFlow,作为程序员,必须了解TensorFlow等几个基本概念:它用图来表示计算任务;在称为会话的上下文中执行图形;用张量来表示数据;通过变量维护状态;Feed和fetch可用于为任意操作赋值或从中获取数据。
总之,TensorFlow是一个带有状态图的数据流图计算环境。每个节点都在做数据操作,然后提供依赖性和方向性,提供完整的数据流。
TensorFlow安装很简单,但是官网提供的安装包支持的CUDA版本是7.5。考虑到CUDA 8令人兴奋的新功能以及即将正式发布的事实。可能你想考虑马上体验CUDA 8,所以只能通过编译Tensorflow源代码来获得。TensorFlow已经支持Python2.7和3.3+。
另外,使用Python语言的程序员需要安装一些必需的库,比如numpy,protobuf等等。对于卷积处理,cuDNN是公认的最佳开发库,请务必安装。常规Tensorsorflow的安装非常简单,一个命令就够了:
$ pip3安装—升级/anishathalye/neural-style .白俄罗斯现代印象派艺术家李奥尼德·阿夫列莫夫擅长用强烈的色彩表现城市和风景主题,尤其是他的雨景系列。他习惯用大色块营造光影效果,对反光物体和环境色彩的把握非常准确。
于是找了一张上海东方明珠电视塔的摄影作品。我希望通过Tensorflow学习李奥尼德·阿夫列莫夫的绘画风格,将这张东方明珠的照片处理成那种光影色彩丰富的作品风格。使用Tensorflow和上面提到的项目的代码,在一个AWS p2类型的实例上进行了一千次迭代,得到了如下所示的处理结果。
这个处理的代码只有350行,模型使用了一个在2014的ImageNet比赛中成名的明星VGG。这个模式很好,特点是“去depper”。
TensorFlow做出这样的作品,不仅仅是作为娱乐让大家开怀大笑,还可以做更多有趣的事情。如果把刚才的处理能力扩展到视频上,可以看到如下图的效果,它被处理成了这样一种新的视频风格,具有梵高的名作《星月夜》的风格。
试想一下,如果这种处理能力应用在更多的领域,会产生怎样神奇的效果?前景美好,给了我们无限遐想。事实上,我们目前从事的很多领域的应用开发都可以通过使用神经网络和深度学习来改变。对于深度学习来说,掌握并不难。每个程序员都可以轻松掌握这项技术,利用自己拥有的资源,让我们快速成为深度学习的程序开发者。
结束语
我们无法预测未来会是什么样。作家雷·库兹韦尔在2005年写了《奇点临近》一书。在这本书中,他明确告诉我们,那个时代即将到来。作为那个时代黎明前的人,我们有没有能力利用自己的学习能力来加快这个进程,实现这个梦想?
中国人工智能的发展
人工智能时代无疑已经到来。这个时代需要的当然是掌握了人工智能,解决了具体问题的工程师。坦白说,这种工程师在市场上还是比较少见的。职场上的薪资可以看出对这类工程师的需求程度。人工智能学科发展到今天,就学术本身而言,已经具备大规模产业化的能力。
因此,工程师尽快掌握人工智能的应用技术势在必行。目前网上关于人工智能的学习资料可以说是“汗流浃背”,那些有能力快速学习的工程师一定会在人工智能的大潮中脱颖而出。
中国人工智能产业发展的环境已经具备。无论从创业环境,人员素质,甚至市场上的机会,都完全具备产业变革的一切条件。与美国相比,在人工智能的诸多领域,中国队的表现也可以说是毫不让步。就人工智能技术而言,中国的工程师和世界上最好的技术团队在同一起跑线上。
时间不等人,中国的工程师有机会在这一领域大显身手。但值得注意的是,要避免两点:一是好高骛远,盲目与国外攀比。毕竟积累有其长短,也有其专精,要立足于现有的积累,寻求渐进的突破。二是急于求成,盲目追求市场。人工智能的工程化需要大量的基础积累,不是一朝一夕就能复制的。
我国科技人员在人工智能领域的成就有目共睹。在王永刚的一篇文章中,他统计了2013年到2015年SCI收录的“深度学习”论文,发现中国在2014年和2015年已经超过美国成为领头羊。
另一个让我惊讶的是,Google的JeffDean在2016发表了一篇题为《张量流:AsymstemforLarge-scale machine learning》的论文。文章的22位作者中,名字明显是中国的作者达到了1/5。如果要列出中国/中国人工智能领域的巨头,吴恩达、孙健、杨强、黄光斌、马毅、张大鹏...你可以很容易地列出一长串名字。
对于中国来说,目前的当务之急是人工智能技术的产业化。这样才能说科研/情报领域的优势转化为整体的、综合的优势。在这方面,中国是世界上最大的消费市场和制造大国,我们完全有机会借助市场优势成为这一领域的领导者。
硅谷的创新企业
虽然我去过硅谷很多次,但我从来没有能够在那里工作很长时间。在人工智能的市场上,我们听到更多的是谷歌、苹果、英特尔、亚马逊等一些大型科技公司的动作。然而,美国市场仍有大量小型初创企业在人工智能领域有着惊人的表现。仅以硅谷地区的公司为例:
Captricity,提供手写数据的信息提取;
VIVLab,为语音识别开发虚拟助理服务;
TERADEEP,利用FPGA提供高效的卷积神经网络方案;
还有NetraDyne,提供无人驾驶解决方案。
这个清单可以非常长,许多试图通过使用人工智能技术创造历史的团队正在构建他们的梦想。这些团队和他们所专注的领域,都是值得学习和体验的。