深度学习是否可以应用到游戏开发领域

雷锋网 AI 科技评论按:在深度学习仍然需要不少的数学和计算机编程能力的现在如果突然出现了一个不需要写任何公式和代码的深度学习应用开发平台,你会是什么感觉震惊?鄙夷

Verge 的一篇文章就近距离观察了这个新的可视化开发平台 Lobe,并询问了领域内的研究者和开发人员的意见我们是否应当和他们┅样充满信心还是抱有疑虑呢?雷锋网 AI 科技评论全文编译如下

Lobe 是一种新型的人工智能开发工具,它专注于可视化界面而不是编程

许多公司都在努力让人工智能技术更加易于使用但是很少有公司能够做到像

在构建我们的拼字游戏探测器时,我一开始确实遇到了一些困难(主要原因是没有给系统输入足够的数据)但是通过反复地修修补补、调整模型,这些问题得到了解决不久之后,我在浏览器中运行出叻一个拼字游戏识别程序

我的拼字游戏探测器简单易构建。

很明显我所构建的系统是相当简单的。但是我们也要看到这种技术是十汾具有潜力的,不要把它看作人工智能应用不妨将它想象为一只在家中训练好的听话的猴子,你已经教会了它识别你选择的视觉线索呮要猴子发现了你要求它寻找的东西,它除了发出「eee eee eee」的叫声啥也做不了!但是有这样一只猴子还是很方便的。有了合适的训练素材和┅点点耐心你可以教它做各种各样有用的事情,比如识别出恶性的痣和良性的痣之间的区别;或者观察婴儿监控器看看你的宝宝是否從婴儿床中跑了出来。如果你讲音频信号转化成了视觉数据的格式来表示声波你甚至可以让猴子识别出不同的声音。是的这都是我们鈳以使用 Lobe 构建的真实应用程序。

当然尽管 Lobe 通过其简单易用的特性吸引了机器学习的业余爱好者,这也并不意味着它就没有缺陷一些专镓争论道,这样的工具对这个学科进行的扁平化处理是没有益处的它知识使用可视化的替身代替了编程的过程,但实际上并不能教会用戶如何构建高质量的算法Jeremy Howard 是一位数据科学家和企业家,也是 Fast.AI 的联合创始人这是一个通过工具和教程使人们更容易使用深度学习技术的研究实验室。他说他早就预见到了这一切!

Howard 说道:「出于某种原因,每个一两年就会有人出来设计一个机器学习训练系统,这样的系統的功能包括从工具箱中拖拽出方框然后用线条将他们连接在一起。我还不是十分明白为什么构造这样的系统会如此吸引人但事实就昰如此」。「这样的系统往往会受到一定程度的关注因为专业社区之外的人认为这些工具让机器学习变得更加简单易用了,但是事实上咜们并没有做到这一点」

如果 Lobe 过度简化了机器学习,将会如何呢

Howard 说,这样的可视化界面并没有太大意义;这样构建深度学习系统的过程在本质上和编写代码是一样的但是它却比编程「更加笨拙,更加费时而且你一次性地从屏幕上看到的信息更少。」他指出要想构建最基础的应用(就像我设计的拼图游戏探测器)之外的任何东西,你仍然需要知道:「你想要使用哪些组件」「如何将他们连接在一起」这样的技术细节。但是由于 Lobe 这样的工具将这些信息封装在了方框和连接线中这些信息就不像在代码中那样容易获知了。「数据科学嘚难点不在于打字!」Howard 说道「难的是知道应该写些什么。

他还建议Lobe 的一些更加复杂的设定是出于美观的考虑,而不是实际的功能性「它们可以显示出你改变了模型架构,但事实上并没有人手动编写了架构」Howard 说道「这种通过把数字输入方框构建深度学习模型的想法說明它们完全不知道人们需要做的是什么。」

如果你赞同 Howard 对Lobe 的批评那么 Lobe 似乎是一种过于复杂的让人们开始构建机器学习模型的方式。(與其他免费的类似产品相比Lobe 可能会付费使用,尽管 Matas 说价格还没有最终敲定)但是即使像这样的可视化工具只是现有软件的一个皮肤,咜们仍然是有其价值的如今代码的流行的文化形象——那些不停滚动的,无穷无尽的难以理解的符号——是一种让人生畏的形象Lobe 使人們开始构建机器学习模型的过程不再那么可怕,反过来说它也可以帮助那些从最新的机器学习技术中受益的专业人士。

Jean-olivier Irisson 是这种现象的一個很好的例子作为位于「Villefranche-sur-Mer,」的法国海洋学实验室的助理教授,Irisson 在接受Verge 采访时说他对编程并不是一无所知,但是他在使用Lobe 之前对于深度學习并没有一个直接的经验现在他是Lobe 的封闭测试人员中的一份子,并且正在使用该公司的软件帮助实验室对浮游生物图片进行分类

Irisson 说,他和她的同事们都意识到新的深度学习技术的性能会在他们的领域超越传统的方法「但是深度学习目前的发展速度是我们这些非专业囚士跟不上的。」他说 Lobe 意味着:他可以在不用购买新的硬件或掌握新的编程框架的情况下开始使用最新的神经网络架构。他说:「它让峩专注于阅读论文理解概念,并且应用到那些我认为前景光明的方向上去」

与本文作者一样,Irisson 说他发现 Lobe 用户界面的某些部分还存在一些问题但我们在这里需要再次强调的是,现在我们使用的仅仅是测试版的软件总的来说,他认为这种体验是非常直观的。他通过电孓邮件对 Verge 网站说:「我认为 Lobe 这样的工具可以帮助非专业人士打开神秘的『黑箱』(深度学习模型通常被认为是一种黑箱模型)并且理解咜们,Lobe 实实在在地帮助了我」

这似乎与 Matas 对 Lobe 的愿景是吻合的:这是一款帮助人们尽可能快地开始构建人工智能应用的工具。Matas 说道:「如果伱对某件事已经有了一个概念并且你拥有训练数据,你可以通过Lobe 很快地训练一个机器学习模型」「如果它可能利用你所拥有的1000 个样本能够训练出很好的结果,你可以找到能够进行提升的地方并且这会给你继续前进的动力」。

如果说人工智能技术真的要改变世界那么佷显然,参与到其中的人越多越好——尤其是科技界外的人有些科学领域的专业人士可能认为自己没有时间学习编程,但是它们可以在瀏览器中构建这种模型从而获得某种研究的感觉从这一点上来说,Lobe 看上去就像是一个完美的为机器学习革命打 call 的宣传工具!

}

一、人工智能和新科技革命
2017年围棋界发生了一件比较重要事Master(Alphago)以60连胜横扫天下,击败各路世界冠军人工智能以气势如虹的姿态出现在我们人类的面前。围棋曾经一喥被称为“人类智慧的堡垒”如今,这座堡垒也随之成为过去从2016年三月份AlphaGo击败李世石开始,AI全面进入我们大众的视野对于它的讨论變得更为火热起来,整个业界普遍认为它很可能带来下一次科技革命,并且在未来可预见的10多年里,深刻得改变我们的生活
其实,AI除了可以做我们熟知的人脸、语音等识别之外它可以做蛮多有趣的事情。
例如让AI学习大量古诗之后写古诗,并且可以写出质量非常不錯的古诗
又或者,将两部设计造型不同的汽车进行融合形成全新一种设计风格的新汽车造型。
还有之前大家在朋友圈里可能看过的,将相片转换成对应的艺术风格的画作
当前,人工智能已经在图像、语音等多个领域的技术上取得了全面的突破。与此同时另外一個问题随之而来,如果这一轮的AI浪潮真的将会掀起新的科技革命那么在可预见的未来,我们整个互联网都将发生翻天覆地的变化深刻影响我们的生活。那么作为普通业务开发工程师的我又应该以何种态度和方式应对这场时代洪流的冲击呢?

在回答这个问题之前我们先一起看看上一轮由计算机信息技术引领的科技革命中,过去30多年中国程序员的角色变化:
通过上图可以简总结:编程技术在不断地发展並且走向普及从最开始掌握在科学家和专家学者手中的技能,逐渐发展为一门大众技能换而言之,我们公司内很多资深的工程师如果带着今天对编程和计算机的理解和理念回到1980年,那么他无疑就是那个时代的计算机专家

如果这一轮AI浪潮真的会带来新的一轮科技革命,那么我们相信它也会遵循类似的发展轨迹,逐步发展和走向普及如果基于这个理解,或许我们可以通过积极学习,争取成为第一玳AI工程师

这一轮AI的技术突破,主要源于深度学习技术而关于AI和深度学习的发展历史我们这里不重复讲述,可自行查阅我用了一个多朤的业务时间,去了解和学习了深度学习技术在这里,我尝试以一名业务开发工程师的视角以尽量容易让大家理解的方式一起探讨下罙度学习的原理,尽管受限于我个人的技术水平和掌握程度,未必完全准确

    人类智能最重要的部分是大脑,大脑虽然复杂它的组成單元却是相对简单的,大脑皮层以及整个神经系统是由神经元细胞组成的。而一个神经元细胞由树突和轴突组成,它们分别代表输入囷输出连在细胞膜上的分叉结构叫树突,是输入那根长长的“尾巴”叫轴突,是输出神经元输出的有电信号和化学信号,最主要的昰沿着轴突细胞膜表面传播的一个电脉冲忽略掉各种细节,神经元就是一个积累了足够的输入,就产生一次输出(兴奋)的相对简单嘚装置

树突和轴突都有大量的分支,轴突的末端通常连接到其他细胞的树突上连接点上是一个叫“突触”的结构。一个神经元的输出通过突触传递给成千上万个下游的神经元神经元可以调整突触的结合强度,并且有的突触是促进下游细胞的兴奋,有的是则是抑制┅个神经元有成千上万个上游神经元,积累它们的输入产生输出。
人脑有1000亿个神经元1000万亿个突触,它们组成人脑中庞大的神经网络朂终产生的结果即是人的智能。

  1. 一个神经元的结构相对来说是比较简单的于是,科学家们就思考我们的AI是否可以从中获得借鉴?神经え接受激励输出一个响应的方式,同计算机中的输入输出非常类似看起来简直就是量身定做的,刚好可以用一个函数来模拟
    通过借鑒和参考神经元的机制,科学家们模拟出了人工神经元和人工神经网络当然,通过上述这个抽象的描述和图比较难让大家理解它的机淛和原理。我们以“房屋价格测算”作为例子一起来看看:
    一套房子的价格,会受到很多因素的影响例如地段、朝向、房龄、面积、銀行利率等等,这些因素如果细分可能会有几十个。一般在深度学习模型里这些影响结果的因素我们称之为特征。我们先假设一种极端的场景例如影响价格的特征只有一种,就是房子面积于是我们收集一批相关的数据,例如50平米50万、93平米95万等一系列样本数据,如果将这些样本数据放到而为坐标里看则如下图:
    然后,正如我们前面所说的我们尝试用一个“函数”去拟合这个输入(面积x)和输出(价格y),简而言之我们就是要通过一条直线或者曲线将这些点“拟合”起来。
    假设情况也比较极端这些点刚好可以用一条“直线”擬合(真实情况通常不会是直线),如下图:
    那么我们的函数是一个一次元方程f(x) = ax +b当然,如果是曲线的话我们得到的将是多次元方程。峩们获得这个f(x) = ax +b的函数之后接下来就可以做房价“预测”,例如我们可以计算一个我们从未看见的面积案例81.5平方米,它究竟是多少钱
    這个新的样本案例,可以通过直线找到对应的点(黄色的点)如图下:
    粗略的理解,上面就是AI的概括性的运作方式这一切似乎显得过於简单了?当然不会因为,我们前面提到影响房价其实远不止一个特征,而是有几十个这样问题就比较复杂了,接下来这里则要繼续介绍深度学习模型的训练方式。这部分内容相对复杂一点我尽量以业务工程师的视角来做一个粗略而简单的阐述。

  2. 深度学习模型的訓练方式
    当有好几十个特征共同影响价格的时候自然就会涉及权重分配的问题,例如有一些对房价是主要正权重的例如地段、面积等,也有一些是负权重的例如房龄等。
    那么第一个步其实是给这些特征加一个权重值,但是最开始我们根本不知道这些权重值是多少?怎么办呢不管那么多了,先给它们随机赋值吧随机赋值,最终计算出来的估算房价肯定是不准确的例如,它可能将价值100万的房子计算成了10万。
    因为现在模型的估值和实际估值差距比较大于是,我们需要引入一个评估“不准确”程度的衡量角色也就是损失(loss)函数,它是衡量模型估算值和真实值差距的标准损失函数越小,则模型的估算值和真实值的察觉越小而我们的根本目的,就是降低这個损失函数让刚刚的房子特征的模型估算值,逼近100万的估算结果
    通过梯度下降和反向传播,计算出朝着降低损失函数的方向调整权重參数举一个不恰当的比喻,我们给面积增加一些权重然后给房子朝向减少一些权重(实际计算方式,并非针对单个个例特征的调整)然后损失函数就变小了。
    调整了模型的权重之后就可以又重新取一批新的样本数据,重复前面的步骤经过几十万次甚至更多的训练佽数,最终估算模型的估算值逼近了真实值结果这个模型的则是我们要的“函数”。
    为了让大家更容易理解和直观采用的例子比较粗畧,并且讲述深度学习模型的训练过程中间省略了比较多的细节。讲完了原理那么我们就开始讲讲如何学习和搭建demo。

在2个月前人工智能对我来说,只是一个高大上的概念但是,经过一个多月的业余时间的认真学习我发现还是能够学到一些东西,并且跑一些demo和应用絀来的

  1. (1)部分数学内容的复习,高中数学、概率、线性代数等部分内容(累计花费了10个小时,挑了关键的点看了下其实还是不太夠,只能让自己看公式的时候相对没有那么懵)
    (2)Python基础语法学习。(花费了3个小时左右我以前从未写过Python,因为后面Google的TensorFlow框架的使用是基于Python的)
    (3)Google的TensorFlow深度学习开源框架(花费了10多个小时去看)
    数学基础好或者前期先不关注原理的同学,数学部分不看也可以开始做全憑个人选择。

  2. 深度学习框架我们可以粗略的理解为是一个“数学函数”集合和AI训练学习的执行框架。通过它我们能够更好的将AI的模型運行和维护起来。
    深度学习的框架有各种各样的版本(Caffe、Torch、Theano等等)我只接触了Google的TensorFlow,因此后面的内容都是基于TensorFlow展开的,它的详细介绍这裏不展开讲述建议直接进入官网查看。非常令人庆幸的是TensorFlow比较早就有中文社区了尽管里面的内容有一点老,搭建环境方面有一些坑泹是已经属于为数不多的中文文档了,大家且看且珍惜

测试是否安装成功,可以采用官方的提供的一个短小的例子demo生成了一些三维数據, 然后用一个平面拟合它们(官网的例子采用的初始化变量的函数是initialize_all_variables,该函数在新版本里已经被废弃了):

经过200次的训练模型的参数逐漸逼近最佳拟合的结果(W: [[0.100 0.200]], b: [0.300]),另外我们也可以从代码的“风格”中,了解到框架样本训练的基本运行方式虽然,官方的教程后续会涉忣越来越多更复杂的例子但从整体上看,也是类似的模式
准备数据:获得有标签的样本数据(带标签的训练数据称为有监督学习);
設置模型:先构建好需要使用的训练模型,可供选择的机器学习方法其实也挺多的换而言之就是一堆数学函数的集合;
损失函数和优化方式:衡量模型计算结果和真实标签值的差距;
真实训练运算:训练之前构造好的模型,让程序通过循环训练和学习获得最终我们需要嘚结果“参数”;
验证结果:采用之前模型没有训练过的测试集数据,去验证模型的准确率
其中,TensorFlow为了基于python实现高效的数学计算通常會使用到一些基础的函数库,例如Numpy(采用外部底层语言实现)但是,从外部计算切回到python也是存在开销的尤其是在几万几十万次的训练過程。因此Tensorflow不单独地运行单一的函数计算,而是先用图描述一系列可交互的计算操作流程然后全部一次性提交到外部运行(在其他机器学习的库里,也是类似的实现)所以,上述流程图中蓝色部分都只是设置了“计算操作流程”,而绿色部分开始才是真正的提交数據给到底层库进行实际运算而且,每次训练一般是批量执行一批数据的


,更多技术干货请访问

}

点击上方 “CSDN” 关注我们

编者按: 夲文选自图书 《Deep Learning》中文版 第十二章部分内容《深度学习》由全球知名的三位专家Ian Goodfellow、Yoshua Bengio和Aaron Courville撰写,是深度学习领域奠基性的经典教材

在本章Φ,我们将介绍如何使用深度学习来解决计算机视觉、语音识别、自然语言处理以及其他商业领域中的应用首先我们将讨论在许多最重偠的AI 应用中所需的大规模神经网络的实现。接着我们将回顾深度学习已经成功应用的几个特定领域。

尽管深度学习的一个目标是设计能夠处理各种任务的算法然而截至目前深度学习的应用仍然需要一定程度的特化。例如计算机视觉中的任务对每一个样本都需要处理大量的输入特征(像素),自然语言处理任务的每一个输入特征都需要对大量的可能值(词汇表中的词) 建模

深度学习的基本思想基于联结主义:盡管机器学习模型中单个生物性的神经元或者说是单个特征不是智能的,但是大量的神经元或者特征作用在一起往往能够表现出智能我們必须着重强调神经元数量必须很大这个事实。

相比20世纪80年代如今神经网络的精度以及处理任务的复杂度都有一定提升,其中一个关键嘚因素就是网络规模的巨大提升在过去的30年内,网络规模是以指数级的速度递增的然而如今的人工神经网络的规模也仅仅和昆虫的神經系统差不多。由于规模的大小对于神经网络来说至关重要因此深度学习需要高性能的硬件设施和软件实现。

传统的神经网络是用单台機器的CPU 来训练的如今,这种做法通常被视为是不可取的现在,我们通常使用GPU 或者许多台机器的CPU 连接在一起进行计算在使用这种昂贵配置之前,为论证CPU 无法承担神经网络所需的巨大计算量研究者们付出了巨大的努力。

描述如何实现高效的数值CPU 代码已经超出了本书的讨論范围但是我们在这里还是要强调通过设计一些特定的CPU 上的操作可以大大提升效率。例如在2011 年,最好的CPU 在训练神经网络时使用定点运算能够比浮点运算跑得更快通过调整定点运算的实现方式,Vanhoucke et al. (2011) 获得了3 倍于一个强浮点运算系统的速度因为各个新型CPU都有各自不同的特性,所以有时候采用浮点运算实现会更快一条重要的准则就是,通过特殊设计的数值运算我们可以获得巨大的回报。除了选择定点运算戓者浮点运算以外其他的策略还包括了如通过优化数据结构避免高速缓存缺失、使用向量指令等。机器学习的研究者们大多会忽略这些實现的细节但是如果某种实现限制了模型的规模,那该模型的精度就要受到影响

许多现代神经网络的实现基于图形处理器(Graphics Processing Unit, GPU)。图形处理器最初是为图形应用而开发的专用硬件组件视频游戏系统的消费市场刺激了图形处理硬件的发展。GPU为视频游戏所设计的特性也可以使神經网络的计算受益

在许多情况下,单个机器的计算资源是有限的因此,我们希望把训练或者推断的任务分摊到多个机器上进行

分布式的推断是容易实现的,因为每一个输入的样本都可以在单独的机器上运行这也被称为数据并行(data parallelism)。

同样地模型并行(model parallelism) 也是可行的,其中哆个机器共同运行一个数据点每一个机器负责模型的一个部分。对于推断和训练这都是可行的。

在训练过程中数据并行从某种程度仩来说更加困难。对于随机梯度下降的单步来说我们可以增加小批量的大小,但是从优化性能的角度来说我们得到的回报通常并不会線性增长。使用多个机器并行地计算多个梯度下降步骤是一个更好的选择不幸的是,梯度下降的标准定义完全是一个串行的过程:第t 步嘚梯度是第t 03 1 步所得参数的函数

解决。在这个方法中几个处理器的核共用存有参数的内存。每一个核在无锁的情况下读取这些参数并計算对应的梯度,然后在无锁状态下更新这些参数由于一些核把其他的核所更新的参数覆盖了,因此这种方法减少了每一步梯度下降所獲得的平均提升但因为更新步数的速率增加,总体上还是加快了学习过程Deanet al. (2012) 率先提出了多机器无锁的梯度下降方法,其中参数是由参数垺务器(parameterserver) 管理而非存储在共用的内存中分布式的异步梯度下降方法保留了训练深度神经网络的基本策略,并被工业界很多机器学习组所使鼡(Chilimbi et al., 2014; Wu et al., 2015)学术界的深度学习研究者们通常无法负担那么大规模的分布式学习系统,但是一些研究仍关注于如何在校园环境中使用相对廉价的硬件系统构造分布式网络(Coates et al., 2013)

在许多商业应用的机器学习模型中,一个时间和内存开销较小的推断算法比一个时间和内存开销较小的训练算法偠更为重要对于那些不需要个性化设计的应用来说,我们只需要一次性地训练模型然后它就可以被成千上万的用户使用。在许多情况丅相比开发者,终端用户的可用资源往往更有限例如,开发者们可以使用巨大的计算机集群训练一个语音识别的网络然后将其部署箌移动手机上。

减少推断所需开销的一个关键策略是模型压缩(model compression)(Bucilua et al., 2006)模型压缩的基本思想是用一个更小的模型取代替原始耗时的模型,从而使嘚用来存储与评估所需的内存与运行时间更少

当原始模型的规模很大,且我们需要防止过拟合时模型压缩就可以起到作用。在许多情況下拥有最小泛化误差的模型往往是多个独立训练而成的模型的集成。评估所有n 个集成成员的成本很高有时候,当单个模型很大(例如如果它使用Dropout 正则化) 时,其泛化能力也会很好

这些巨大的模型能够学习到某个函数f(x),但选用的参数数量超过了任务所需的参数数量只昰因为训练样本数是有限的,所以模型的规模才变得必要只要我们拟合了这个函数f(x),我们就可以通过将f 作用于随机采样点x 来生成有无穷哆训练样本的训练集然后,我们使用这些样本训练一个新的更小的模型使其能够在这些点上拟合f(x)。为了更加充分地利用这个新的小模型的容量最好从类似于真实测试数据(之后将提供给模型) 的分布中采样x。这个过程可以通过损坏训练样本或者从原始训练数据训练的生成模型中采样完成

此外,我们还可以仅在原始训练数据上训练一个更小的模型但只是为了复制模型的其他特征,比如在不正确的类上的後验分布(Hinton et al., )

一般来说,加速数据处理系统的一种策略是构造一个系统这个系统用动态结构(dynamicstructure) 描述图中处理输入所需的计算过程。在给定一個输入的情况中数据处理系统可以动态地决定运行神经网络系统的哪一部分。单个神经网络内部同样也存在动态结构给定输入信息,決定特征(隐藏单元) 哪一部分用于计算这种神经网络中的动态结构有时被称为条件计算(conditional

动态结构计算是一种基础的计算机科学方法,广泛應用于软件工程项目应用于神经网络的最简单的动态结构基于决定神经网络(或者其他机器学习模型) 中的哪些子集需要应用于特定的输入。

深度网络的专用硬件实现

自从早期的神经网络研究以来硬件设计者就已经致力于可以加速神经网络算法的训练和/或推断的专用硬件实現。读者可以查看早期的和更近的专用硬件深度网络的评论(Lindseyand Lindblad, 1994; Beiu et al., 2003; Misra and Saha, 2010)

的数字(基于数字的二进制表示)、模拟(Graf and Jackel,1989; Mead and Ismail, 2012)(基于以电压或电流表示连续值的物理实現) 和混合实现(组合数字和模拟组件)。近年来更灵活的现场可编程门阵列(04eld programmable gated array, FPGA)实现(其中电路的具体细节可以在制造完成后写入芯片) 也得到了长足發展

al., 2007)。这已成为近年来更迫切的问题因为深度学习在工业产品中越来越受欢迎,并且由于更快的硬件产生的巨大影响已经通过GPU 的使用嘚到了证明激励当前对深度网络专用硬件研究的另一个因素是单个CPU 或GPU 核心的进展速度已经减慢,并且最近计算速度的改进来自核心的并荇化(无论CPU 还是GPU)这与20 世纪90 年代的情况(上一个神经网络时代) 的不同之处在于,神经网络的硬件实现(从开始到芯片可用可能需要两年) 跟不上快速进展和价格低廉的通用CPU 的脚步因此,在针对诸如手机等低功率设备开发新的硬件设计并且想要用于深度学习的一般公众应用(例如,具有语音、计算机视觉或自然语言功能的设施) 时研究专用硬件能够进一步推动其发展。

位之间的精度足以满足使用或训练基于反向传播嘚深度神经网络的要求显而易见的是,在训练期间需要比在推断时更高的精度并且数字某些形式的动态定点表示能够减少每个数需要嘚存储空间。传统的定点数被限制在一个固定范围之内(其对应于浮点表示中的给定指数)而动态定点表示在一组数字(例如一个层中的所有權重) 之间共享该范围。使用定点代替浮点表示并且每个数使用较少的比特能够减少执行乘法所需的硬件表面积、功率需求和计算时间而塖法已经是使用或训练反向传播的现代深度网络中要求最高的操作。

长久以来计算机视觉就是深度学习应用中几个最活跃的研究方向之┅。因为视觉是一个对人类以及许多动物毫不费力但对计算机却充满挑战的任务(Ballard et al., 1983)。深度学习中许多流行的标准基准任务包括对象识别和咣学字符识别

计算机视觉是一个非常广阔的发展领域,其中包括多种多样的处理图片的方式以及应用方向计算机视觉的应用广泛:从複现人类视觉能力(比如识别人脸) 到创造全新的视觉能力。举个后者的例子近期一个新的计算机视觉应用是从视频中可视物体的振动识别楿应的声波(Davis et al., 2014)。大多数计算机视觉领域的深度学习研究未曾关注过这样一个奇异的应用它扩展了图像的范围,而不是仅仅关注于人工智能Φ较小的核心目标|| 复制人类的能力无论是报告图像中存在哪个物体,还是给图像中每个对象周围添加注释性的边框或从图像中转录符號序列,或给图像中的每个像素标记它所属对象的标识大多数计算机视觉中的深度学习往往用于对象识别或者某种形式的检测。由于生荿模型已经是深度学习研究的指导原则因此还有大量图像合成工作使用了深度模型。尽管图像合成(“无中生有”) 通常不包括在计算机视覺内但是能够进行图像合成的模型通常用于图像恢复,即修复图像中的缺陷或从图像中移除对象这样的计算机视觉任务

由于原始输入往往以深度学习架构难以表示的形式出现,许多应用领域需要复杂精细的预处理计算机视觉通常只需要相对少的这种预处理。图像应该被标准化从而使得它们的像素都在相同并且合理的范围内,比如[0; 1] 或者[031; 1]将[0; 1] 中的图像与[0; 255] 中的图像混合,通常会导致失败将图像格式化为具有相同的比例,严格上说是唯一一种必要的预处理许多计算机视觉架构需要标准尺寸的图像,因此必须裁剪或缩放图像以适应该尺寸然而,严格地说即使是这种重新调整比例的操作并不总是必要的一些卷积模型接受可变大小的输入,并动态地调整它们的池化区域大尛以保持输出大小恒定(Waibel et al., 1989)其他卷积模型具有可变大小的输出,其尺寸随输入自动缩放例如对图像中的每个像素进行去噪或标注的模型(Hadsell et al., 2007)。

數据集增强可以被看作一种只对训练集做预处理的方式数据集增强是减少大多数计算机视觉模型泛化误差的一种极好方法。在测试时可鼡的一个相关想法是将同一输入的许多不同版本传给模型(例如在稍微不同的位置处裁剪的相同图像),并且在模型的不同实例上决定模型嘚输出后一个想法可以被理解为集成方法,并且有助于减少泛化误差

其他种类的预处理需要同时应用于训练集和测试集,其目的是将烸个样本置于更规范的形式以便减少模型需要考虑的变化量。减少数据中的变化量既能够减少泛化误差也能够减小拟合训练集所需模型的大小。更简单的任务可以通过更小的模型来解决而更简单的解决方案泛化能力一般更好。这种类型的预处理通常被设计为去除输入數据中的某种可变性这对于人工设计者来说是容易描述的,并且人工设计者能够保证不受到任务影响当使用大型数据集和大型模型训練时,这种预处理通常是不必要的并且最好只是让模型学习哪些变化性应该保留。例如用于分类ImageNet

节中讲到的一样,我们很容易通过增加训练集的额外副本来增加训练集的大小进而改进分类器的泛化能力。这些额外副本可以通过对原始图像进行一些变化来生成但是并鈈改变其类别。对象识别这个分类任务特别适合于这种形式的数据集增强因为类别信息对于许多变换是不变的,而我们可以简单地对输叺应用诸多几何变换如前所述,分类器可以受益于随机转换或者旋转某些情况下输入的翻转可以增强数据集。在专门的计算机视觉应鼡中存在很多更高级的用以增强数据集的变换。这些方案包括图像中颜色的随机扰动(Krizhevskyet

语音识别任务是将一段包括了自然语言发音的声学信号投影到对应说话人的词序列上令X = (x(1), x(2), …, x(T)) 表示语音的输入向量(传统做法以20ms 为一帧分割信号)。许多语音识别的系统通过特殊的手工设计方法預处理输入信号从而提取特征,但是某些深度学习系统(Jaitly and Hinton, 2011) 直接从原始输入中学习特征令y = (y1; y2,…, yN) 表示目标的输出序列(通常是一个词或者字符的序列)。自动语音识别(automatic speech recognition,ASR) 任务指的是构造一个函数f*ASR使得它能够在给定声学序列X 的情况下计算最有可能的语言序列y:

其中P*是给定输入值X 时对应目标y 的真实条件分布。

随后当研究组使用了越来越大的带标签的数据集,加入了各种初始化、训练方法以及调试深度神经网络的结构之後他们发现这种无监督的预训练方式是没有必要的,或者说不能带来任何显著的改进

用语音识别中词错误率来衡量,在语音识别性能仩的这些突破是史无前例的(大约30%的提高)在这之前的长达十年左右的时间内,尽管数据集的规模是随时间增长的(见Deng and Yu (2014) 的图2.4)但基于GMM-HMM 的系统的傳统技术已经停滞不前了。这也导致了语音识别领域快速地转向深度学习的研究在大约两年的时间内,工业界大多数的语音识别产品都包含了深度神经网络这种成功也激发了ASR 领域对深度学习算法和结构的新一波研究浪潮,并且影响至今

其中的一个创新点是卷积网络的應用(Sainath et al., 2013)。卷积网络在时域与频域上复用了权重改进了之前的仅在时域上使用重复权值的时延神经网络。这种新的二维卷积模型并不是将输叺的频谱当作一个长的向量而是当成一个图像,其中一个轴对应着时间另一个轴对应的是谱分量的频率。

中一样一个深度循环神经網络(Graves et al., 2013) 每个时间步的各层都有状态变量,两种展开图的方式导致两种不同深度:一种是普通的根据层的堆叠衡量的深度另一种是根据时间展开衡量的深度。这个工作把TIMIT 数据集上音素的错误率记录降到了新低17:7%关于应用于其他领域的深度循环神经网络的变种可以参考Pascanu et al. (2014a); Chung et

自然语言處理(natural language processing,NLP) 是让计算机能够使用人类语言例如英语或法语。为了让简单的程序能够高效明确地解析计算机程序通常读取和发出特殊化的语訁。而自然语言通常是模糊的并且可能不遵循形式的描述。自然语言处理中的应用如机器翻译学习者需要读取一种人类语言的句子,並用另一种人类语言发出等同的句子许多NLP 应用程序基于语言模型,语言模型定义了关于自然语言中的字、字符或字节序列的概率分布

與本章讨论的其他应用一样,非常通用的神经网络技术可以成功地应用于自然语言处理然而,为了实现卓越的性能并扩展到大型应用程序一些领域特定的策略也很重要。为了构建自然语言的有效模型通常必须使用专门处理序列数据的技术。在很多情况下我们将自然語言视为一系列词,而不是单个字符或字节序列因为可能的词总数非常大,基于词的语言模型必须在极高维度和稀疏的离散空间上操作为了使这种空间上的模型在计算和统计意义上都高效,研究者已经开发了几种策略

语言模型(language model) 定义了自然语言中标记序列的概率分布。根据模型的设计标记可以是词、字符甚至是字节。标记总是离散的实体最早成功的语言模型基于固定长度序列的标记模型,称为n-gram一個n-gram 是一个包含n 个标记的序列。

神经语言模型(neural language model, NLM) 是一类用来克服维数灾难的语言模型它使用词的分布式表示对自然语言序列建模(Bengio et al., 2001b)。不同于基於类的n-gram 模型神经语言模型在能够识别两个相似的词,并且不丧失将每个词编码为彼此不同的能力神经语言模型共享一个词(及其上下文) 囷其他类似词(和上下文之间) 的统计强度。模型为每个词学习的分布式表示允许模型处理具有类似共同特征的词来实现这种共享。例如洳果词dog和词cat映射到具有许多属性的表示,则包含词cat的句子可以告知模型对包含词dog的句子做出预测反之亦然。因为这样的属性很多所以存在许多泛化的方式,可以将信息从每个训练语句传递到指数数量的语义相关语句维数灾难需要模型泛化到指数多的句子(指数相对句子長度而言)。该模型通过将每个训练句子与指数数量的类似句子相关联克服这个问题

在许多自然语言应用中,通常希望我们的模型产生词(洏不是字符) 作为输出的基本单位对于大词汇表,由于词汇量很大在词的选择上表示输出分布的计算成本可能非常高。在许多应用中V 包含数十万词。表示这种分布的朴素方法是应用一个仿射变换将隐藏表示转换到输出空间,然后应用softmax 函数假设我们的词汇表V 大小为|V|。洇为其输出维数为|V|描述该仿射变换线性分量的权重矩阵非常大。这造成了表示该矩阵的高存储成本以及与之相乘的高计算成本。因为softmax 偠在所有|V| 输出之间归一化所以在训练时以及测试时执行全矩阵乘法是必要的|| 我们不能仅计算与正确输出的权重向量的点积。因此输出層的高计算成本在训练期间(计算似然性及其梯度) 和测试期间(计算所有或所选词的概率) 都有出现。对于专门的损失函数可以有效地计算梯喥(Vincent et al., 2015),但是应用于传统softmax 输出层的标准交叉熵损失时会出现许多困难

结合n-gram 和神经语言模型

n-gram 模型相对神经网络的主要优点是n-gram 模型具有更高的模型容量(通过存储非常多的元组的频率),并且处理样本只需非常少的计算量(通过查找只匹配当前上下文的几个元组)如果我们使用哈希表或樹来访问计数,那么用于n-gram 的计算量几乎与容量无关相比之下,将神经网络的参数数目加倍通常也大致加倍计算时间当然,避免每次计算时使用所有参数的模型是一个例外嵌入层每次只索引单个嵌入,所以我们可以增加词汇量而不会增加每个样本的计算时间。一些其怹模型例如平铺卷积网络,可以在减少参数共享程度的同时添加参数以保持相同的计算量然而,基于矩阵乘法的典型神经网络层需要與参数数量成比例的计算量

因此,增加容量的一种简单方法是将两种方法结合由神经语言模型和n-gram 语言模型组成集成(Bengio et al., 2001b, 2003)。

对于任何集成洳果集成成员产生独立的错误,这种技术可以减少测试误差集成学习领域提供了许多方法来组合集成成员的预测,包括统一加权和在验證集上选择权重Mikolovet al. (2011a) 扩展了集成,不是仅包括两个模型而是包括大量模型。我们也可以将神经网络与最大熵模型配对并联合训练(Mikolov et al., 2011b)该方法鈳以被视为训练具有一组额外输入的神经网络,额外输入直接连接到输出并且不连接到模型的任何其他部分额外输入是输入上下文中特萣n-gram 是否存在的指示器,因此这些变量是非常高维且非常稀疏的

模型容量的增加是巨大的(架构的新部分包含高达|sV | n 个参数),但是处理输入所需的额外计算量是很小的(因为额外输入非常稀疏)

机器翻译以一种自然语言读取句子并产生等同含义的另一种语言的句子。机器翻译系统通常涉及许多组件在高层次,一个组件通常会提出许多候选翻译由于语言之间的差异,这些翻译中的许多翻译是不符合语法的例如,许多语言在名词后放置形容词因此直接翻译成英语时,它们会产生诸如“apple red”的短语提议机制提出建议翻译的许多变体,理想情况下應包括“red apple”翻译系统的第二个组成部分(语言模型) 评估提议的翻译,并可以评估“red apple”比“apple red”更好

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信