新年新起点,请收下这份诚意满满的“深度学习”教程
近几年 深度学习 的概念非常火,我们很幸运赶上并见证了这一波大潮的兴起。记得2012年之前提及深度学习,大部分人并不熟悉,而之后一段时间里,也有些人仍旧持怀疑的态度,觉得这一波浪潮或许与之前sparse coding类似,或许能持续火个两三年,但终究要被某个新技术新方法所取代,再后来,无论是学术界还是工业界,总有些研究者为自己没有在第一时间跟进这波浪潮感到后悔莫及。确实,从2012年AlexNet取得ImageNet的冠军开始,五年过去了,深度学习的方法仍旧占领着人工智能这片领域。
随着这波浪潮,有些人作为弄潮儿,兴起一波波巨浪,引领各个领域从传统方法到深度学习方法的转变,并希望能够通过了解其他领域的方法改进自己所从事的领域;有些人辛勤地工作,利用深度学习的方法为公司提高业绩,希望实时跟进并实现最新的技术;有些校园中的研究僧,一方面需要了解最新技术及其背后原理,另一方面还有发文章和找工作的压力;有些相关从业者,如编辑、记者,经常报道AI领域新闻,却从没有时间仔细研究深度学习;还有些非技术人员,总会在这些新闻后惊恐地询问“天网是否能在有生之年建成?”或是“AI对人类的威胁到了什么程度?”。
仅仅通过一节课程,或是一本书来解决以上所有问题明显是不可能的。鉴于国内机器学习资料还是偏少,而且大多是理论性质,并没有实践模块,我们从去年年底开始着手写一本深度学习相关的tutorial,并希望通过一章章真实的案例来带大家熟悉深度学习、掌握深度学习。这个tutorial中每一章内容都围绕着一个真实问题,从背景介绍到使用PaddlePaddle平台进行代码实验,完整地让大家了解整个问题如何用深度学习来解决,从此告别纸上谈兵。本篇课程可能要一些同学失望了,因为这一讲作为第一讲,只能考虑到大多数用户,设计成难度适中的课程,为大家提供一些深度学习最基本的概念,以便更轻松地入门深度学习。如果您是高端用户(能自己run起来深度学习模型或做过一些常识),建议您可以直接移步tutorial( https://github.com/PaddlePaddle/book )自学,当然如果感兴趣,欢迎继续关注我们系列的后续课程。
首先,对这个系列的后续深度学习课程做一个预告。在这份tutorial( https://github.com/PaddlePaddle/book )中,我们将覆盖如下内容:
1. 新手入门
2. 识别数字
3. 图像分类
4. 词向量
5. 情感分析
6. 文本序列标注
7. 机器翻译
8. 个性化推荐
本节课程中,我们主要带大家了解深度学习,通过它的一些有用或有趣的应用了解深度学习的基本原理和工作方式。
深度学习是什么
传统的机器学习中,我们要为每种任务定义其特定的解决方案。对于图像,曾经人们耗费大量精力设计各种描述子进行图像特征描述;对于文本,单单一个机器翻译任务就动辄多个模型的设计:如词语对齐、分词或符号化(tokenization)、规则抽取、句法分析等,每一步的错误都会积累到下一步,导致整个翻译结果不可信,且要追查一个错误会非常复杂。深度学习的优势,就是可以弥补以上问题,一方面减少了对大量手工特征的依赖,对于图像文本等领域可以直接从原数据进行建模;另一方面通过端到端的网络模型(即一个网络直接从输入到输出建模,而不需要中间步骤)减少了多步骤中错误累积的问题。
深度学习采用多层神经网络的方法,依赖大数据和强硬件。
1.大数据
在这个数据爆发的时代,普遍的认知是,大数据并不是问题。但实际上也不完全是这样。从领域角度,图像的通用分类和语言模型的训练或许可以从搜索引擎中获取大量样本,但对于细粒度图像分类(如不同类型的花的分类)或是 专业领域的对话数据(如法律咨询类)的数据就比较稀缺;从应用方法角度,图像、文本和语音都方便获取,但如果希望进行有监督训练,就必须有对应的标记(label),如标明一段语音对应的人,或是一段语音对应的文本,这就是个大工程了。这就需要我们利用已有资源,最简单的方法比如可以先利用大量无标记数据学习数据的特征,就可以减少数据标注规模。
2.强硬件
由于深度学习需要强计算处理能力,因此需要GPU显卡进行并行加速,拼硬件已经成为学界和工业界在研究深度学习网络时的一大共识。在2016年期间,英伟达和AMD的股票价格都实现了飞涨,如下图是GPU制造商英伟达(NVIDIA)公司今年的股价趋势。可以说这种跳跃式增长得益于GPU芯片在游戏、虚拟现实、自动驾驶、数据中心等各个高性能计算需求领域的应用。
GPU的每个显卡具有多个(通常是几十个)多处理器(Streaming Multiprocessors, SMs),每个多处理器中有上百个CUDA核。一个多线程程序的一个kernel实例在一个SM上执行,一个kernel实例上的操作会分配到不同cuda核中独立执行。所以只要程序分配得当,GPU中的处理器越多执行越快。如Titan X(GM100)显卡拥有24个多处理器,每个多处理器拥有128个CUDA核,整个显卡有3072个CUDA核, 其相对16核Xeon E5 CPU处理器要加速5.3~6.7倍[1],这对于实时性要求较高的应用意义非凡。
深度学习的应用
深度学习可以涵盖很多应用范围,我们这里可以先以几个有意思的应用,给大家一个基本概念, 工业界常用的例子会在后续课程中详细地举例。
1.极简版无人车
无人车概念近几年很火,从传统领域到互联网企业都多少有这个方向的研究者。对于初步接触神经网络的同学,我们先引入一个小任务。如下图所示为一个可遥控小车在车道上的运行轨迹,小车上方搭载GoPro摄像头。图中蓝线表示垂直基准线,红线表示每一时刻小车应驶方向。我们的目标是,基于人为操控小车的行驶方向和当前图像数据,给出其驾驶方案。
这里,可以用神经网络指定网络的输入输出分别是当前图像和应走的方向,整体作为一个回归问题来处理,其中输入图像用多层卷积神经网络来解析。这里可能有朋友会说,其实我只需要用基本图像处理技术(比如二值化图像后再检测连通域)找出来左右两条车道,再向前方车道线中点位置方向走不就行了吗?确实是可以这么干的,我们这里只是为了说明深度学习的端到端训练,举例个最简版的无人车,有清晰的车道线,并且没有红绿灯、障碍物等干扰。实际情况中,需要考虑跟踪前车、车道保持、障碍物检测、红绿灯检测等多种情况,因此需要多模型的设计和集成。单就最简单情况下车道检测的这个事情来说, 确实可以仅通过图像处理 人工策略达成目的,也不需要什么训练数据,但这就要求程序员每遇到一个badcase都需要人工修改策略,这样等下一位程序员接手这段代码的时候,就只能呜呜呜了。
2.拍摄照片油画化
2015年的一篇文章[5],将艺术家梵高和深度学习联系在了一起,文中实现了将艺术画style附体于日常拍摄照片,从而得到“艺术照”的效果。其做法是设计一个神经网络,定义该网络的损失函数为Diff(拍摄照片,生成作品) 与 Diff(艺术画,生成作品)这两个Diff的加权和。其中Diff表示两幅图片的差异。但如果通过每个像素的差异来计算这个Diff的话,显然不合理,对于拍摄照片和生成作品而言,像素值必然已经大变,而对于艺术画和生成作品而言,可能色调相似,但靠单个像素值去比就肯定是相差甚远了。所以我们其实想要的只是一个抽象的概念,如下图的例子,我们只需要生成的图包含“猫”,且画风和中间的艺术照相似。于是采用了神经网络的隐层作为度量他们Diff的空间。
图: http://phunter.farbox.com/post/mxnet-tutorial2
3.机器翻译
刚才的两个例子都是深度学习在图像中的应用,其在文本中同样意义重大。和图像不同的是,文本作为一个序列化信息,深度神经网络对这样数据的的处理和图像不太相同,但除此之外的基本思路就可以相互迁移了。比如已经了解了通过深度学习进行图像分类的方法,那么文本分类只是变化一下,将一短文本映射成特征向量从而进行分类,这可以通过将理解图片的卷积神经网络改为处理序列信息的循环神经网络完成。类似地,机器翻译(用计算机来进行不同语言之间的翻译)也可以通过类似的方法。以通过深度学习进行中译英为例,首先通过一个循环神经网络理解一句汉语(映射为文本语义信息,可以是一个向量,也可以是一个时序信息),称此过程为“编码”,再将这个文本语义信息通过另一个循环神经网络,每个时刻输出一个英语单词,称此过程为“解码”,通过这样的编码-解码结构即完成了机器翻译。我这里只是白话说出了机器翻译的大概思想,感兴趣的同学可以参考机器翻译一章的tutorial( https://github.com/PaddlePaddle/book/tree/develop/machine_translation )或追踪后续课程。
4.为你写诗
看完以上内容,如果想让你根据一个词创作一首诗,你想能怎么做呢?恐怕已经有同学想到了:用翻译的做法写诗。不错,机器翻译其实可以用到很多地方,只需要修改数据集就ok,如果我们想根据一个词,让机器“创作”一首诗,只需要将翻译模型的输入设置为这个词,而输出是诗句即可。不过,通常这么做是有问题的,因为这样做导致输入序列很短而输出很长,其间的依赖并不能充分发挥出来,硬将这样的两个序列绑在一起可能导致机器强硬地“背”下来如输入语料而没有真正理解语义。因此,有的工作中用短语生成第一句诗词,用第一句去生成第二句……;或者可以用前n-1句生成第n句诗词。感兴趣的同学可以自己试一下,也可以试用一下度秘里面写诗模块。
5.商品推荐
商品推荐是电商和新闻客户端们的关注热点,他们都关注用户兴趣的把控,其推荐系统的好坏往往会对用户留存和购买情况有较大影响。这里我们可以想见,最基本的推荐策略是爆款推荐(全民热点),和已浏览或是购买/收藏了的项目。对于大量用户没有过浏览记录的项目,传统推荐方法一般采用协同过滤,即推荐给用户相似用户的兴趣项,另一种方法是通过基于内容过滤推荐,即推荐给用户浏览项目的相似项,这其中就涉及到用户相似度和产品/项目相似度的获取。一方面,我们可以利用深度学习进行其相似度的建模,另一方面,我们还可以将用户特征和产品/项目特征映射到一个相同的空间进行特征比较,也就是将下图A(协同过滤)和B(基于内容过滤)策略改为C。
深度学习的缺陷
说过了神经网络的牛逼之处,我们再来看看它的一些缺陷,至少是目前难以解决的问题。
1.特斯拉事件
关注特斯拉的同学应该都有注意到,去年一位23岁的中国男青年,在驾驶特斯拉电动汽车沿京港澳高速河北邯郸段公路行驶时,前车躲避障碍物后,该男子躲闪不及撞上了道路清扫车,发生严重车祸导致死亡。
特斯拉官方并没有公布过其内部算法,我们只知道特斯拉的自动驾驶系统Autopolit中曾有以色列Mobileye公司提供的技术。Mobileye是一家基于视觉帮助减少交通事故的公司,其研发多年的高级驾驶辅助系统(ADAS)处于业内领先,主要基于单目摄像头传回的图像,通过深度神经网络进行车辆检测、车道识别等[3]。但Mobileye自己也表示曾经提醒过特斯拉公司,他们的这套系统只能起辅助作用, 并不完善,也不能完全保障车主。虽然特斯拉官方声明由于车主家属不愿提供更多信息,导致具体Autopolit错误原因无从定位,但原因或是因为中国独有的道路清扫车不曾出现在单目视觉的训练数据集,或是因为光照等特殊因素导致的图像质量问题,都说明无法仅通过视觉技术保障自动驾驶的安全性。我们不能将这起事故归结于是深度学习的缺陷,但在实际系统中, 我们目前确实难从一个端到端的系统中完全定位并解决问题,大家还可以看下面的例子进一步理解。
2.可解释性
在之前的“深度学习是什么”这一节中,我们讲到深度学习可以利用端到端的学习避免一些多步骤积累错误导致的问题,然而这其实也是一种缺陷。我们无从定位问题出在哪里。下面就以图像分类的一个badcase为例进行说明。
ImageNet竞赛2012年冠军工作AlexNet的作者Krizhevsky 曾提出,虽然AlexNet效果很棒,但为了最优化该数据集上的效果,不得不建立这样一个含有非常多参数的深度神经网络,而这样的网络非常容易过拟合。在15年的CVPR会议中,Anh Nguyen提出了一种生成样本的方法,该方法生成的样本可以“愚弄” 用于图像识别的深度神经网络[4],如下图所示的8幅图下面标注的文字分别为ImageNet竞赛数据集上效果最好的网络对该图的识别结果(置信度高于99.6%), 该网络将我们认为的这些波纹分别识别成了王企鹅、海星、棒球、电吉他、火车车厢、遥控器、孔雀、非洲灰鹦鹉。这种很容易“愚弄”神经网络的样本,被称为对抗样本。
深度学习希望模拟人脑中的神经元,通过一个神经网络进行参数拟合,但学习的过程不尽相同。事实上,当人去学习知识的时候,是“哪里不会点哪里”、“哪里错了改哪里”,即局部调整,而深度学习通常都是通过所有样本来决定整个网络的全部参数,希望在所有样本上获得全局最优解;当人们学习什么是“企鹅”的时候,既不会刻意地通过某几个的特征(如颜色、体态)去捕捉,也不需要看上千八百张图片才了解到这样一种模式,我们就知道如下三幅图,都是一个物种, 而神经网络想学到这样一个概念并不容易,往往需要企鹅的各个品种、各种pose的图片。
同样,当神经网络的结果有误时,我们无法像人脑学习一样局部修改部分参数,即便可以,对于端到端的神经网络,调整哪一块参数、如何调整也是无从下手。这就是深度学习可解释性方面的局限。
参考文献:
[1]https://www.nvidia.com/content/tegra/embedded-systems/pdf/jetson_tx1_whitepaper.pdf[2]https://www.quora.com/What-is-the-difference-between-Teslas-Autopilot-system-and-Googles-driver-less-car[3]http://wccftech.com/tesla-autopilot-story-in-depth-technology/4/[4]Nguyen A, Yosinski J, Clune J. Deep neural networks are easily fooled: High confidence predictions for unrecognizable images[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 427-436.[5]Gatys L A, Ecker A S, Bethge M. A neural algorithm of artistic style[J]. arXiv preprint arXiv:1508.06576, 2015.
以上内容转自GitChat,版权归GitChat和张睿卿所有,转载请联系GitChat。
欲知后续更多精彩tutorial,请关注“百度大脑”微信公众账号:baidubrain