2016-01-06 19:54:43 Real_Myth 阅读数 1244
  • 从零开始深度学习(仅视频课)

    本页面购买不发书!!!仅为视频课购买!!! 请务必到https://edu.csdn.net/bundled/detail/59 下单,方可购买课程+图书。 本页面,仅为观看视频页面,如需购买图书,请务必到https://edu.csdn.net/bundled/detail/59下单购买。 本课程由浅入深的讲授人工智能、机器学习、深度学习的原理和实现,尤其会重点介绍搜索引擎和自然语言处理等热门技术,不但会用生动的例子帮助学员理解理论知识,还会手把手详细示范动手实践环节,让你能够亲自实现一个智能问答系统。

    2012 人正在学习 去看看 陈可心

深度学习:推动NLP领域发展的新引擎

文 / 雷欣,李理

从2015年ACL会议的论文可以看出,目前NLP最流行的方法还是机器学习尤其是深度学习,所以本文会从深度神经网络的角度分析目前NLP研究的热点和未来的发展方向。

我们主要关注Word Embedding、RNN/LSTM/CNN等主流的深度神经网络在NLP中的应用,这已经是目前主流的研究方向。此外,已经在机器学习或其它领域比较热门的方法,比如Multi-Model、Reasoning、Attention and Memory等,很有可能是未来NLP研究的热点,我们将着重关注。

Word Embedding

在Word2vec被Mikolov提出之后,由于它能把一个词表示成一个向量(可以理解为类似隐语义的东西),这样最小的语义单位就不是词而是词向量的每一维了。比如我们训练一个模型用来做文本分类,如果训练数据里都是用“计算机”,但测试数据里可能用的是“电脑”,用词作为最基本单位(比如Bag of Words),我们学出来的模型会做出错误的判断。但是如果我们用一个很大的未标注的语料库来训练一个Word2vec,我们就能知道“计算机”和“电脑”语义是相似的,因此它们的词向量也会是类似的,比如100维的词向量某一维和计算机相关,那么“计算机”和“电脑”的词向量在这一维度都会比较大,用它作为基本单位训练模型后,我们的模型就能利用这一维特征正确地实现分类。当然如果数据量足够大,可以把模型的参数和词向量一起训练,这样得到的是更优化的词向量和模型。

但是Word2vec忽略了一些有用的信息,比如词之间的关系(句法关系)、词的顺序、以及没有利用已有的外部资源。针对这些问题,有很多改进的工作。

引入词的关系

最常见的思路就是用Dependency Parser,把抽取出来的Relation作为词的Context。

改进Bag of Words

有人认为词(Word)的粒度也太大,可以到Character级别的,或者Morpheme级别的。

外部资源和知识库

Word2vec只使用了词的上下文的共现,没有使用外部的资源如词典知识库等,因此也有不少工作对此进行改进。

RNN/LSTM/CNN

RNN相关的模型如LSTM基本上算是解决结构化问题的标准方法了,相比于普通的FeedForward Network,RNN是有“记忆”能力的。

普通的神经网络只会在学习的时候“记忆”,也就是通过反向传播算法学习出参数,然后就不会有新的“记忆”了。训练好了之后,不管什么时候来一个相同的输入,都会给出一个相同的输出。对于像Image Classification这样的问题来说没有什么问题,但是像Speech Recognition或者很多NLP的Task,数据都是有时序或结构的。比如语音输入是一个时序的信号,前后帧的数据是相关的;而NLP的很多问题也都是序列或者层次的结构。

RNN拥有“记忆”能力,如图1所示,前一个输出是会影响后面的判断的。比如前一个词是He,那么后面出现is的概率比出现“are”的概率高得多。最简单的RNN直接把前一个时间点的输出作为当前输入的一部分,但是会有Gradient Vanishing的问题,从而导致在实际的模型中不能处理Long Distance的Dependency。目前比较流行的改进如LSTM和GRU等模型通过Gate的开关,来判断是否需要遗忘/记忆之前的状态,以及当前状态是否需要输出到下个时间点。比如语言模型,如果看到句子“I was born in China, …. I can speak fluent Chinese. ”,如果有足够的数据,LSTM就能学到类似这样东西:看到“I was born in”,就记住后面的单词“China”,当遇到“speak”时,就能知道后面很可能说“Chinese”。而遇到“Chinese”之后,其实就可以“忘掉”“China”了。

图片描述
图1 RNN拥有“记忆”能力

CNN(LeNet)最早是Yann Lecun提出用来解决图像识别的问题的一种深度神经网络。通过卷积来发现位置无关(Translational Invariance)的Feature,而且这些Feature的参数是相同的,从而与全连接的神经网络相比大大减少了参数的数量,如图2所示。

图片描述
图2 CNN深度神经网络

最近CNN相关的改进模型也被用于NLP领域。今年的ACL上有很多RNN/LSTM/CNN用来做机器翻译(Machine Translation)、语义角色标注(Sematic Role Labeling)等。

Multi-model Deep Learning

这是当下的一个热门,不只考虑文本,同时也考虑图像,比如给图片生成标题(Caption)。当然这和传统的NLP任务不太一样,但这是一个非常有趣的方向,有点像小朋友学习看图说话。

这样的实际应用非常多,比如像Facebook或者腾讯这样的社交平台每天都有大量的图片上传,如果我们能给图片生成标题或者摘要,就可以实现图片的文本搜索以及语义分析。

图3来自Google DeepMind的论文,根据图片自动生成Caption,很好地为图片做了文本摘要。

图片描述
图3 根据图片自动生成Caption(图片来自Google DeepMind的论文Show and Tell: A Neural Image Caption Generator)

Reasoning, Attention and Memory

前面说RNN/LSTM是试图模拟人类大脑的记忆机制,但除了记忆之外,Attention也是非常有用的机制。

Attention

最早Attention是在《Recurrent Models of Visual Attention》这篇文章提出来的,它的主要思想是:人在看一个视觉场景时并不是一次看完,而是把注意力集中在某个区域,然后根据现有的数据决定下一次把注意力放到哪个地方(笔者的理解:比如我们看到的图片是一条蛇,我们先看到蛇的头部和它弯曲的角度,根据我们对于蛇的先验知识,那么我们可能推断它的身体在右下的某个地方,我们的注意力可能就会直接跳到那个部分)。

这篇文章提出的RAM(Recurrent Attention Model)模型:它把Attention当成一个顺序决策问题,决策Agent能够与视觉环境交互,并且有一个目标。

这个Agent有一个传感器能探测视觉场景的一部分,它通过这些局部数据抽取一些信息,但是它可以自主控制传感器的运动,也能做出决策来影响环境的真实状态。每次行动都会有奖励/惩罚(可能是延迟的,就像下棋一样,短时间看不出好坏,但多走两步就能看出来了),而Agent的目标就是最大化总的奖励。这个模型优化的目标函数是不可导的,但可以用强化学习来学出针对具体问题的策略(笔者的理解:比如识别一条蛇,我可能有一种探测路径,但识别章鱼,我可能有另一种路径)。

另外,关于Attention,Google DeepMind的一篇论文《DRAW:A Recurrent Neural Network For Image》有一段非常好的解释:

当一个人绘画或者重建一个视觉场景时,他能自然地用一种顺序迭代的方式,每次修改后重新评估它。粗糙的轮廓逐渐被更精确的形状代替,线条被锐化,变暗或者擦除,形状被修改,最终完成这幅图画。

从上面的分析可以看出,Attention除了模仿人类视觉系统的认知过程,还可以减少计算量,因为它排除了不关心的内容。而传统的模型如CNN,其计算复杂度就非常高。另外除了计算减少的好处之外,有选择地把计算资源(注意力)放在关键的地方而不是其它(可能干扰)的地方,还有可能提高识别准确率。就像一个人注意力很分散,哪都想看,反而哪都看不清楚。

Attention最早是在视觉领域应用,当然很快就扩展到NLP和Speech。

  1. 用来做机器翻译:Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio. Neural Machine Translation by Jointly Learning to Align and Translate. 2015. In Proceedings of ICLR.
  2. 做Summary:Alexander M. Rush, Sumit Chopra, Jason Weston. A Neural Attention Model for Sentence Summarization. 2015. In Proceedings of EMNLP.

  3. Word Embedding: Wang Ling, Lin Chu-Cheng, Yulia Tsvetkov, et al. Not All Contexts Are Created Equal: Better Word Representations with Variable Attention. 2015. In Proceedings of EMNLP.

  4. Speech领域:Attention-Based Models for Speech Recognition. Jan Chorowski*, University of Wroclaw; Dzmitry Bahdanau, Jacobs University, Germany; Dmitriy Serdyuk, Université de Montréal; Kyunghyun Cho, NYU; Yoshua Bengio, U. Montreal. 2015. In Proceedings of NIPS.

  5. 其它的应用,比如Multimodel,Image的Caption生成:Kelvin Xu, Jimmy Ba, Ryan Kiros, et al. Show, Attend and Tell: Neural Image Caption Generation with Visual Attention. 2015. In Proceedings of ICML. Karl Moritz Hermann, Tomáš Kočiský, Edward Grefenstette, et al. Teaching Machines to Read and Comprehend. 2015. In Proceedings of NIPS.

前面最早的Attention Model是不可导的,只能用强化学习来优化,也被叫做Hard Attention,也就是把注意力集中在离散的区域;后来也有Soft的Attention,也就是在所有的区域都有Attention,但是连续分布的。Soft的好处是可导,因此可以用梯度下降这样的方法来训练模型,和传统的神经网络更加接近。但坏处就是因为所有的区域都有值(非零),这就增加了计算量。用个不恰当的比方,一个是稀疏矩阵,一个是稠密的矩阵,计算量当然差别就很大。

也有一些工作尝试融合Soft和Hard Attention的优点。

Memory的扩展

前面说到RNN,如LSTM,有Memory(记忆),很多模型对此也进行了拓展。

比如Neural Turing Machine (Neural Turing Machines. Alex Graves, Greg Wayne, Ivo Danihelka. arXiv Pre-Print, 2014),NTM用一句话描述就是有外部存储的神经网络。如图4所示。

图片描述
图4 NTM

Turing Machine有一个Tape和一个读写头,Tape可以视为Memory,数据都放在Tape上,TM的控制器是一个“程序”,它读入Tape上的输入,然后把处理结果也输出到Tape上。此外Turing Machine还有个当前的State。

而NTM的控制器是一个神经网络(Feedforward的或者Recurrent的如LSTM),其余的都类似,只是把古董的Tape换成了现代的寻址更方便的Memory,Input和Output也分离出去的(看起来更像是现代体系结构下的计算机)。

我们传统的编程其实就是编写一个Turing Machine,然后放到Universal Turing Machine上去运行(UTM和TM是等价的,UTM是能运行TM的TM)。传统的编程比如写一个“Copy”程序,我们知道输入,也知道期望的输出,那么我们人脑来实现一个程序,我们用程序这种“语言”来表达我们的想法(算法)。

而NTM呢?它希望给点足够多的输入/输出对(训练数据),Controller(神经网络)能学习出“程序”来。

程序真的可以“学习”出来吗?程序员怎么“证明”它写的算法的正确性呢?

关于人类学习的归纳和演绎的争论。我觉得人类的学习都是归纳的,我们每天看到太阳从西边出来,因此“归纳”出太阳从西边出来这个结论,但是我们永远无法证明(演绎)出这个结论。演绎似乎只有“上帝”(或者数学家,哈哈,他们是上帝他们定义一些公理,然后不断演绎出整个体系,比如欧氏几何的五大公理演绎出那么多定理)才有的特权,他定义了宇宙的运转规律,然后一切都在这个规律下运作(演绎)。而人类似乎只能猜测上帝定义的规律,然后用这个猜测的规律进行演绎。如果没有发现破坏规律的现象,那么万事大吉,否则只能抛弃之前的猜测,重新猜测上帝的想法。但是上帝创造的规律能被受这个规律约束的智慧生命发现吗?也许得看上帝在创造这个规律时的心情?

普通的计算机程序读取输入,然后进行一些计算,把临时的一些结果放到Memory里,也从Memory里读取数据,最终把结果输出。只不过需要我们用计算机程序语言来指定其中的每一个操作步骤。而NTM也是一样。它对于每一个输入,都读取一下现有的内存,然后根据现有的内存和输入进行计算,然后更新内存。只不过这些操作是通过输入和输出“学习”出来的。

因为神经网络学习时需要连续可导,所以NTM的内存和我们现在用的计算机内存不同,现在的计算机都是离散的01,而NTM的内存是个连续的值。计算机的写只能是离散的01值,而NTM的写入是连续的实数(当然受限于硬件肯定是有限的浮点数)。而且和前面的Attention相联系,我们会发现它也是一种Soft Attention——对于某个程序,比如Copy,它的Attention是连续的变化规律(假设我们是用一个for循环来复制输入到连续的内存)。文章的作者尝试了一些简单程序,比如Copy、Associative等,NTM(LSTM作为controller)都比LSTM要好不少。不过Binary Heap Sort这种复杂一点的程序,NTM就没有学习出来,它学出来一个HashTable(这是让我等码农失业的节奏吗?)。

你也许会问NTM似乎对应的是TM,那和NLP有什么关系呢?

NLP是人类的语言,比机器的语言复杂。我们可以首先研究一下简单的机器语言,或许会有所启发。

但事实上NTM也可以用来做QA(问答)。

IBM做了著名的Watson,让人觉得似乎机器能真正的理解语言了。不过很多业内人士觉得离我们期望的机器理解语言还差得远,当然他们做了很多很有用的工作。

《Empirical Study on Deep Learning Models for QA》就是IBM Watson团队的尝试。在Facebook的人工构造QA数据集上融合并对比了当下热门三种DL方法:Neural Machine Translation、Neural Turing Machine及Memory Networks。得出的结论是:融合Memory组件和Attention机制在解决QA问题上具有巨大潜力。

我们可以看到在今年NIPS的RAM Workshop上很多用类似NTM这样的模型来做QA或者相关任务的文章。Facebook人工智能研究院(FAIR)在NLP的主要工作都是在RAM上。

Language的复杂性

相对于Image和Speech,Language似乎更加复杂一些。

视觉和听觉作为人类与外界沟通最主要的两种感觉,经历了长期的进化。大部分动物都有发达的视觉与听觉系统,很多都比人类更加发达。拿视觉来说,老鹰的视力就比人类发达的多,而且很多动物夜间也有很强的视力,这是人类无法比拟的。但是人类的视觉应该有更多高层概念上的东西,因为人类大脑的概念很多,因此视觉系统也能处理更多概念。比如人类能利用钢铁,对汽车有细微的视觉感受,但是对于一条狗来说可能这些东西都是Other类别,它们可能只关注食物、异性、天敌等。

听觉系统也是如此,很多动物的听觉范围和精度都比人类高得多。但它们关注的内容也很少,大部分是猎物或者天敌的声音。

我觉得人类与大部分动物最大的区别就是社会性,社会性需要沟通,因此语言就非常重要。一些动物群落比如狼群或者猴群也有一定的社会性,像狼群狩猎是也有配合,猴群有严格的等级制度,但是相对于人类社会来说就简单得多。一个人能力相当有限,但是一个人类社会就非常强大,这其实就跟一个蚂蚁非常简单,但是整个蚁群非常智能类似。

作为沟通,人类至少有视觉和听觉两种主要的方式,但最终主要的沟通方式语言却是构建在听觉的基础上的。为什么进化没有选择视觉呢?当然也许有偶然的因素,但是我们可以分析(或者猜测)一下可能的原因。

你也许会说声音可以通过不同的发音来表示更多的概念,而且声音是时序信号,可以用更长的声音表示更复杂的概念。

但这是说不通的,人类能比动物发出更多不同种类的声音,这也是进化的结果。用脸部或者四肢也能表达很多不同的概念,就像残疾人的手语或者唇语,或者科幻小说《三体》里的面部表情交流。如果进化,面部肌肉肯定会更加发达从而能够表示更多表情。

至于时序就更没有什么了,手语也是时序的。

当然声音相对于视觉还是有不少优势的:

  1. 声音通过声波的衍射能绕过障碍物,这是光无法办到的(至少人类可见的光波是不行的)
  2. 衍生的结果就是声音比光传播得远
  3. 晚上声音可以工作,视觉不行(其实夜视能力也是进化出来的)
  4. 声音是四面八方的,视觉必须直面(当然有些动物的视角能到360度),背对你的人你是看不到他的表情的。

可以做很多分析,但不管怎么样,历史没法重新选择,事实就是人类的进化选择了声音,因此Speech就成了Language的一部分了。

因此单独说Speech而不说Language其实是没有太大意义的。

当然后来Language为了便于保存,又发展出文字这样的东西,而文字却是通过视觉来感受的,不过视觉只是把文字映射到概念而已。一些文字如汉字的象形还是和视觉形象有关联的,不过越到后来越抽象,就和视觉没有太大关系了。

人类思考的方式也是和语言相关的,数学就是一种语言,这是人类抽象现实世界的先进工具。

上面一大堆啰嗦,目的就是想说明Language是和人类的概念紧密相连的,因此远比Image/Vision更复杂。

人类社会之所以能进步,就是通过社会化的分工与协作,让不同的人进化不同的能力,从而使得整个社会全方位发展。而语言文字在其中发挥着至关重要的作用,通过语言文字的传播,人类积累的智慧就可以跨越时空传递。

回到我们的NLP或者NLU或者说机器理解人类语言,为什么我们对机器理解人类语言这么关注呢,因为语言基本等同于智力。机器能够理解语言也就基本能达到人工智能的目标,这也是为什么我们会认为如果机器能够通过图灵测试那么它就是智能的了。

语言其实是人类表达概念或者说知识的一种方式,人类的大脑通过进化已经很适应这种表示方式了。但这种逻辑的表示方式是抽象之后比较上层的表示(大脑神经元层级是怎么表示的还不太清楚)。目前主流的方法是深度神经网络,目的是模拟底层的大脑结构。这种方法是不错的一个想法。之前的NLP使用的方法都是规则的,其实也就是基于逻辑的,现在已经不太主流了。

但是不管用什么方法,现在的现实情况是人类已经使用语言来存储知识和表示概念,机器就得面对这种现实能够学会这种交流方式。因为我们没有时间也不可能让它们进化出另外一种表达方式。当然它们自己交流可以用自己的语言,比如TCP/IP语言,它们学习知识可以和人类那样给定很多输入/输出训练数据学习出来,也可以把训练好的模型直接从一个机器“复制”到另外一个机器,这是人类做不到的——至少目前还做不到。我们不能把爱因斯坦的物理模型复制到我的大脑里,也许未来医学和神经科学高度发达之后可以实现。但是目前来看把机器看成人类能力的拓展更可行。

深度学习的一个方向Representation Learning其实就是有这个想法,不过目前更多关注的是一些具体任务的Feature的表示。更多是在Image和Speech领域,用在Language的较少,Word2vec等也可以看成表示概念的方式,不过这种向量的表示太过简单且没有结构化。更少有工作考虑用神经网络怎么表示人类已有的复杂知识。现在的知识表示还是以几十年前基于符号的形式逻辑的为主。

我们现在甚至有很多结构化的数据,比如企业数据库、维基百科的、Google的Freebase以及内部的Knowledge Graph。但目前都是用人类习惯的表示方式,比如三元组、图或者实体关系。但这样的表示方式是高层的抽象的,大脑里的神经元似乎不能处理,因此现在的Deep Neural Network很难整合已有的这些知识库进行推理等更有用的事情。

总结

从上面的分析我们大致可以看到最近NLP的发展趋势:深度神经网络尤其是RNN的改进,模拟人脑的Attention和Memory,更加结构化的Word Embedding或者说Knowledge Representation。我们看到了很多很好的进展,比如NIPS的RAM Workshop,很多大公司都在尝试。但是Language的问题确实也非常复杂,所以也不太可能短期就解决。不过也正是这样有挑战的问题,才能让更多有才华的人投身到这个领域来推动它的发展。

作者简介

雷欣,人工智能科技公司出门问问&Ticwatch智能手表CTO,美国华盛顿大学西雅图分校博士,前斯坦福研究所(SRI)研究工程师,前Google美国总部科学家,语音识别领域十多年研究及从业者,领导开发了Google基于深度神经网络的离线语音识别系统。

李理,人工智能科技公司出门问问工程师,擅长NLP和knowledge graph。


本文为《程序员》2016年1月特别专题原创文章,未经允许不得转载。订阅2016年《程序员》(含iPad、Android及印刷版)请访问 http://dingyue.programmer.com.cn(责编/周建丁 zhoujd@csdn.net)

2018-12-14 10:03:35 weixin_44046073 阅读数 124
  • 从零开始深度学习(仅视频课)

    本页面购买不发书!!!仅为视频课购买!!! 请务必到https://edu.csdn.net/bundled/detail/59 下单,方可购买课程+图书。 本页面,仅为观看视频页面,如需购买图书,请务必到https://edu.csdn.net/bundled/detail/59下单购买。 本课程由浅入深的讲授人工智能、机器学习、深度学习的原理和实现,尤其会重点介绍搜索引擎和自然语言处理等热门技术,不但会用生动的例子帮助学员理解理论知识,还会手把手详细示范动手实践环节,让你能够亲自实现一个智能问答系统。

    2012 人正在学习 去看看 陈可心

当人类第一次构思可编程计算机时,就已经在思考计算机能否变得智能(尽管 这距造出第一台计算机还有一百多年)。如今,人工智能已经成为一个具有众多实际应用和活跃研究课题的领域,并且正在蓬勃发展。而这一轮AI的技术发展,主要源于深度学习技术。那么问题来了:
什么是深度学习
深度学习的概念源于人工神经网络的研究,是通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。
深度学习是机器学习中一种基于对数据进行表征学习的方法,亦是机器学习研究中的一个新领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。深度学习是无监督学习的一种。
深度学习作为大数据分析的重要工具,其发展得益于大数据、强大的计算能力和长期逐步积累的计算方法。
深度学习与AI的关系
如果说,海量的数据是进行AI 研究的前提,那么,深度学习就是AI研究的关键性工具,二者缺一不可。
就如同飞船起飞一样,除了充足的燃料之外,强劲的引擎也是必不可少的。假如燃料不足,则飞船就无法进入预定轨道。而引擎不够强劲,飞船甚至不能升空。
在AI研究中,深度学习模型就像引擎,而海量的训练数据就好比燃料。
深度学习在各领域的应用变革
深度学习的快速发展,令整个AI领域的实际应用范围得到了拓展。衣食住行。。。。我们生活中的太多地方,都在被深度学习所改变。
AI的推动引擎——深度学习
如今,人工智能已经成为一个具有众多实际应用和活跃研究课题的领域,并且正在蓬勃发展。而这一轮AI的技术发展,主要源于深度学习技术。
作者:关崇来源:51CTO播客|2018-10-19 16:24
 收藏
  分享
【51CTO.com原创稿件】当人类第一次构思可编程计算机时,就已经在思考计算机能否变得智能(尽管 这距造出第一台计算机还有一百多年)。如今,人工智能已经成为一个具有众多实际应用和活跃研究课题的领域,并且正在蓬勃发展。而这一轮AI的技术发展,主要源于深度学习技术。那么问题来了:
什么是深度学习
深度学习的概念源于人工神经网络的研究,是通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

深度学习是机器学习中一种基于对数据进行表征学习的方法,亦是机器学习研究中的一个新领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。深度学习是无监督学习的一种。
深度学习作为大数据分析的重要工具,其发展得益于大数据、强大的计算能力和长期逐步积累的计算方法。
深度学习与AI的关系
如果说,海量的数据是进行AI 研究的前提,那么,深度学习就是AI研究的关键性工具,二者缺一不可。
就如同飞船起飞一样,除了充足的燃料之外,强劲的引擎也是必不可少的。假如燃料不足,则飞船就无法进入预定轨道。而引擎不够强劲,飞船甚至不能升空。
在AI研究中,深度学习模型就像引擎,而海量的训练数据就好比燃料。
深度学习在各领域的应用变革
深度学习的快速发展,令整个AI领域的实际应用范围得到了拓展。衣食住行。。。。我们生活中的太多地方,都在被深度学习所改变。
深度学习与无人驾驶
在这里插入图片描述
深度学习在无人驾驶领域主要用于图像处理,也就是在摄像头上。当然也可以用于雷达的数据处理,但是基于图像极大丰富的信息以及难以手工建模的特性,深度学习能最大限度的发挥其优势。
深度学习可以用于感知,识别周围环境,各种对车辆有用的信息;也可以用于决策,比如AlphaGo的走子网络(Policy Network),就是直接用DNN训练, 如何基于当前状态作出决策。
深度学习与疾病检测
密歇根大学的研究人员使用图像识别技术来检测黑色素瘤这种最致命的、但在早期可以治疗的癌症。众所周知,黑色素瘤不仅致命,而且还难以准确筛查。该团队通过训练一个神经网络来区分痣和可疑病变的特征(质地和结构),以便更好地识别。
该团队称在检测黑色素瘤方面,定性和定量评估的实验结果表明这种方法的表现超过了迄今为止最佳的算法。
深度学习与文娱投资
各内容平台可以通过深度学习技术对流量进行建模预测,辅助其作出IP投资采买决策。流量预测模型参考的因素极多且非常复杂,包括社会舆论、对该IP的讨论度、粉丝群体的反馈、前期宣发效果,以及题材、角色和平台的拟合度等,甚至排播形式的不同也会产生不同的模型。
而这个流量预测模型的数据来源也很复杂,包括观影数据、搜索数据、社交行为、舆论监督等。
在这里插入图片描述
此外还需要实时监控整个互联网的舆情,内容上线之后,模型可以快速修正,从而保证较高的精准率。
深度学习与语音识别
语音识别技术已经发展了几十年,近年突然变得炙手可热,这归功于深度学习终于使得语音识别的准确率提升到足矣让这项技术在实验测试以外的实际场景中应用。
在这里插入图片描述
目前,语音识别技术正逐步渗入到我们日常生活的方方面面。语音识别技术内置在我们的手机、游戏机和智能手表中,它甚至能将我们的整个家庭智能化。比如许多智能音箱,不单可以和“主人”聊天还可以提醒“主人”起床、收快递….
结语
在过去几十年中,深度学习的发展大量借鉴了我们关于人脑、统计学和应用数学的知识。近年来,得益于更强大的计算机、更大的数据集和能够训练更深网络的技术,深度学习的普及性和实用性都有了突破的发展和更广阔的前景。小编相信,在不远的未来,深度学习技术定将取得更为耀眼成绩,同时也热切期待在深度学习的加持下,AI技术可以升华到一个全新领域,为人们的生产、生活带来更大的便利。

2017-05-31 19:48:26 zhonghua18517 阅读数 4278
  • 从零开始深度学习(仅视频课)

    本页面购买不发书!!!仅为视频课购买!!! 请务必到https://edu.csdn.net/bundled/detail/59 下单,方可购买课程+图书。 本页面,仅为观看视频页面,如需购买图书,请务必到https://edu.csdn.net/bundled/detail/59下单购买。 本课程由浅入深的讲授人工智能、机器学习、深度学习的原理和实现,尤其会重点介绍搜索引擎和自然语言处理等热门技术,不但会用生动的例子帮助学员理解理论知识,还会手把手详细示范动手实践环节,让你能够亲自实现一个智能问答系统。

    2012 人正在学习 去看看 陈可心

参考书籍《Tensorflow实战Google深度学习框架》郑泽宇等

     深度学习最早兴起于图像识别,但是在短短的几年之内,深度学习推广到了机器学习的各个领域,并且都有很出色的表现。具体领域包含图像识别、语音识别、自然语言处理、机器人、生物信息处理、化学、电脑游戏、搜索引擎、网络广告投放、医学自动诊断和金融等各大领域均有应用。

计算机视觉

计算机视觉是深度学习技术最早实现突破性成就的领域。随着2012年深度学习算法AlexNet赢得图像分类比赛ILSVRC冠军,深度学习开始被人们熟知。ILSVRC是基于ImageNet图像数据集举办的图像识别比赛,在计算机视觉领域拥有极高的影响力。从12年15年之间,通过对深度学习算法的不断探究,ImageNet图像分类的错误率以每年4%速度递减;到15年,深度学习算法的错误率仅为4%,已经成功超过人工标注的错误率5%,实现了计算机领域的一个突破。

在ImageNet数据集上,深度学习不仅突破了图像分类的技术瓶颈,同时也突破了物体识别技术的瓶颈。物体识别比图像分类的难度更高。图像分类只需判断图片中包含了哪一种物体;但在物体识别中,不仅要给出包含了哪些物体,还要给出包含物体的具体位置。13年,在ImageNet数据集上使用传统机器算法实现物体识别的平均正确率均值(mean average precision,MAP)为0.23;而在16年时,使用了6种不同深度学习模型的集成算法将MAP提高到0.66。

技术进步的同时,工业界也将图像分类、物体识别应用于各种产品中,如无人驾驶、Youtube、地图、图像搜索等。谷歌可通过图像处理技术归纳出图片中的主要内容并实现以图搜图的功能。这些技术在国内的百度、阿里、腾讯等公司已经得到了广泛的应用。

在物体识别问题上,人脸识别是一类应用非常广泛的技术。它可以应用到娱乐行业、安防以及风控行业。在娱乐行业中,基于人脸识别的相机自动对焦、自动美颜基本已成为每款自拍软件的必备功能。在安防、风控领域,人脸识别应用更是大大提高了工作效率并节省了人力成本。除此,还可用于保证账户的登陆和资金安全,如支付宝的人脸识别登陆等等。

传统机器学习算法很难抽象出足够有效的特征,使得学习模型既可区分不同的个体,又可以尽量减少相同个体在不同环境的影响。深度学习技术可从海量数据中自动学习更加有效的人脸识别特征表达。在人脸识别数据集LFW上,基于深度学习算法的系统DeepID2可以达到99.47%的正确识别率。

在计算机识别领域,光学字符识别也是使用深度学习较早的领域之一。光学字符识别,就是使用计算机程序将计算机无法理解的图片中的字符(如数字、字母、汉字等符号),转化为计算机可以理解的文本形式。如常用的MINIST手写体字库,最新的深度学习算法可以达到99.77%的正确率。谷歌将数字识别技术应用到了谷歌地图的开发中,开发的数字识别系统可以识别任意长度的数字,在SVHN数据集上可达到96%的正确率,到2013年,谷歌利用这个系统抽取了超过1亿个门牌号码,大大加速了谷歌地图的制作过程。此外,光学字符识别在谷歌图书中也有应用,谷歌图书通过文字识别技术将扫描的图书数字化,从而实现图书内容的搜索功能。

语音识别

深度学习在语音识别领域同样取得突破性进展。2009年深度学习的概念被引入语音识别领域,并对该领域产生了重大影响。短短几年之间,深度学习的方法在TIMIT数据集上将给予传统混合高斯模型(GMM)的错误率从21.7%降低到了使用深度学习模型的17.9%。到2012年,谷歌基于深度学习建立的语音识别模型已经取代了混合高斯模型,并成功将谷歌语音识别的错误率降低了20%。随着当今数据量的加大,使用深度学习的模型无论在正确率的增长数值上还是在增长比率上都要优于混合高斯模型。这样的增长在语音识别的历史上从未出现,深度学习之所以有这样的突破性进展,最主要的原因是其可以自动的从海量数据中提取更加复杂且有效的特征,而不是如混合高斯模型中需要人工提取特征

基于深度学习的语音识别已经应用到了各个领域,如同声传译系统、苹果公司推出的Srri系统,科大讯飞的智能语音输入法、百度和腾讯也开发了相关产品。同声传译系统不仅要求计算机能够对输入的语音进行识别,还要求计算机将识别出来的结果翻译成另外一门语言,并将翻译好的结果通过语音合成的方式输出。微软研发的同声传译系统已经成功应用到Skype网络电话中。

自然语言处理

在过去几年之中,深度学习已经在语言模型、机器翻译、词性标注、实体识别、情感分析、广告推荐以及搜索排序等方向取得突出性成就。深度学习在自然语言处理问题上能够更加智能、自动地提取复杂特征。在自然语言处理领域,使用深度学习实现智能特征提取的一个非常重要的技术是单词向量。单词向量是深度学习解决很多上述自然语言处理问题的基础

传统解决自然语言所表达的语义的方法主要依靠建立大量的语料库,通过这些语料库,可以大致刻画自然语言中单词之间的关系。然而语料库的建立需要花费很多人力物力,而且扩张能力有限,单词向量提供了一种更加灵活的方式来刻画单词的含义。单词向量会将每个单词表示成一个相对较低维度的向量(比如100维),对于语义相近的单词,其对应的单词向量在空间上的距离也应该接近。因而单词的相似度可用空间距离来描述。单词向量不需要人工的方式来设定,它可以从互联网海量非标注文本中学习得到

通过对自然语言中单词更好的抽象与表达,深度学习在自然语言处理的很多核心问题上都有突破性进展,比如机器翻译。根据谷歌实验的结果,在主要的语言翻译上,使用深度学习可以讲机器翻译算法的质量提高55%到85%。

情感分析是自然语言处理问题中一个非常经典的应用。情感分析最核心的问题就是从一段自然语言中判断作者对评价的主体是好评还是差评。情感分析在工业界有着非常广泛的应用。随着互联网的发展,用户会在各种不同的地方表达对于不同产品的看法。对于服务业或制造业,及时掌握用户对其产品的 或者服务的评价是提高用户满意度非常有效的途径。在金融业,通过分析用户对不同产品和公司的态度可以对投资选择提供帮助。在情感分析问题上,深度学习可以大幅提高算法的准确率。在开源的Sentiment Treebank数据集上,使用深度学习的算法可将语句层面的情感分析正确率从80%提高到85.4%;在短语层面上,可将正确率从71%提高到80.7%。



2018-11-30 14:52:33 cdknight_happy 阅读数 155
  • 从零开始深度学习(仅视频课)

    本页面购买不发书!!!仅为视频课购买!!! 请务必到https://edu.csdn.net/bundled/detail/59 下单,方可购买课程+图书。 本页面,仅为观看视频页面,如需购买图书,请务必到https://edu.csdn.net/bundled/detail/59下单购买。 本课程由浅入深的讲授人工智能、机器学习、深度学习的原理和实现,尤其会重点介绍搜索引擎和自然语言处理等热门技术,不但会用生动的例子帮助学员理解理论知识,还会手把手详细示范动手实践环节,让你能够亲自实现一个智能问答系统。

    2012 人正在学习 去看看 陈可心

我们总是希望深度学习库运行得更快,能够扩展到更大的数据集。一种自然的方法是,看看我们是否可以从向这个问题投入更多硬件中获益,就像同时使用多个gpu。

然后,库设计人员会问:如何跨设备并行计算?更重要的是,我们如何在引入多线程时同步计算?运行时依赖引擎是这些问题的通用解决方案。

在本文中,我们研究了使用运行时依赖调度来加速深度学习的方法。我们的目的是解释运行时依赖调度如何既能加速又能简化多设备深度学习。我们还探讨了一种通用依赖引擎的潜在设计,这种引擎既可以是独立于库的,也可以是独立于操作的。

本文的大部分讨论都是从MXNet依赖引擎中获得灵感的。我们讨论的依赖跟踪算法最初是由Yutian Li和Mingjie Wang开发的。

1 依赖调度

虽然大多数用户希望利用并行计算,但我们大多数人更熟悉串行程序。因此,一个自然的问题是:我们如何编写串行程序并构建一个库以异步方式自动并行我们的程序?

例如,在下面的代码中,我们可以按任意顺序运行B = A + 1和C = A + 2,或者并行运行:

    A = 2
    B = A + 1
    C = A + 2
    D = B * C

但是,手工编写序列代码是相当困难的,因为最后一个操作D = B * C需要等待前面的两个操作都完成之后才能开始。下面的依赖关系图/数据流图说明了这一点。
在这里插入图片描述
依赖引擎是一个库,它接受一系列操作,并根据依赖模式(可能是并行的)对它们进行调度。因此在本例中,依赖项库可以并行运行B = a + 1和C = a + 2,并在这些操作完成后运行D = B * C。

2 依赖调度中的问题

依赖引擎减轻了编写并发程序的负担。然而,随着操作的并行化,新的依赖跟踪问题出现了。在本节中,我们将讨论这些问题。

2.1 数据流依赖

数据流依赖关系描述如何在其他计算中使用一个计算的结果。每个依赖引擎都必须解决数据流依赖问题。
在这里插入图片描述
因为我们在前一节中讨论了这个问题,所以这里包含了相同的图。拥有数据流跟踪引擎的库包括Minerva和Purine2。

2.2 内存复用

什么时候应该回收分配给数组的内存?在串行处理中,这很容易确定。我们只是在变量超出作用域后回收内存。然而,如下图所示,这在并行处理中有点困难。
在这里插入图片描述
在这个例子中,因为这两个计算都需要使用来自A的值,所以在完成之前我们不能回收内存。引擎必须根据依赖关系调度内存回收操作,并确保在B = A + 1和C = A + 2完成之后执行这些操作。

2.3 随机数生成

随机数生成器是机器学习中常用的一种生成器,它给依赖引擎带来了有趣的挑战。考虑下面的例子:
在这里插入图片描述
在这个例子中,我们按顺序生成随机数。虽然这两个随机数生成似乎可以并行化,但通常不是这样。伪随机数生成器(PRNG)不是线程安全的,因为在生成新数字时,它可能导致某些内部状态发生突变。即使PRNG是线程安全的,序列化数字生成也是可取的,这样我们就可以得到可重复的随机数。

2.4 案例研究:一个多gpu神经网络的依赖引擎

在上一节中,我们讨论了在设计依赖引擎时可能遇到的问题。在考虑如何设计一个通用引擎来解决这些问题之前,让我们先考虑一个依赖引擎如何在神经网络的多gpu训练中提供帮助。下面的伪代码Python程序演示了在双层神经网络上的一个批次的训练过程。

    # Example of one iteration Two GPU neural Net
    data = next_batch()
    data[gpu0].copyfrom(data[0:50])
    data[gpu1].copyfrom(data[50:100])
    # forward, backprop on GPU 0
    fc1[gpu0] = FullcForward(data[gpu0], fc1_weight[gpu0])
    fc2[gpu0] = FullcForward(fc1[gpu0], fc2_weight[gpu0])
    fc2_ograd[gpu0] = LossGrad(fc2[gpu0], label[0:50])
    fc1_ograd[gpu0], fc2_wgrad[gpu0] =
      FullcBackward(fc2_ograd[gpu0] , fc2_weight[gpu0])
      _, fc1_wgrad[gpu0] = FullcBackward(fc1_ograd[gpu0] , fc1_weight[gpu0])
    # forward, backprop on GPU 1
    fc1[gpu1] = FullcForward(data[gpu1], fc1_weight[gpu1])
    fc2[gpu1] = FullcForward(fc1[gpu1], fc2_weight[gpu1])
    fc2_ograd[gpu1] = LossGrad(fc2[gpu1], label[50:100])
    fc1_ograd[gpu1], fc2_wgrad[gpu1] =
         FullcBackward(fc2_ograd[gpu1] , fc2_weight[gpu1])
         _, fc1_wgrad[gpu1] = FullcBackward(fc1_ograd[gpu1] , fc1_weight[gpu1])
    # aggregate gradient and update
    fc1_wgrad[cpu]  = fc1_wgrad[gpu0] + fc1_wgrad[gpu1]
    fc2_wgrad[cpu]  = fc2_wgrad[gpu0] + fc2_wgrad[gpu1]
    fc1_weight[cpu] -= lr *  fc1_wgrad[cpu]
    fc2_weight[cpu] -= lr *  fc2_wgrad[cpu]
    fc1_weight[cpu].copyto(fc1_weight[gpu0] , fc1_weight[gpu1])
    fc2_weight[cpu].copyto(fc2_weight[gpu0] , fc2_weight[gpu1])

在这个程序中,数据0到50复制到GPU 0,数据50到100复制到GPU 1。计算出的梯度在CPU中聚合,然后CPU执行一个简单的SGD更新,并将更新后的权重复制回每个GPU。这是一种以串行方式编写并行程序的常见方法。下图显示了如何并行化它:
在这里插入图片描述
说明:

  • 一旦我们得到一个层的梯度,可以立即将其复制到CPU;
  • 权重一经更新即可复制回GPU;
  • 在前向计算中,有一个对上一轮迭代的依赖项:fc1_weight[cpu].copyto(fc1_weight[gpu0] , fc1_weight[gpu1]);
  • 从上一次向后传递到第k层到下一次向前调用第k层之间有一个计算延迟,在此延迟期间,我们可以将k层的权值同步与其他计算并行进行同步。

这种优化方法被CXXNet等多gpu深度学习库所使用。重点是使权重同步(通信)与计算重叠。但是,这并不容易,因为复制操作需要在层的后向传递完成后立即触发,然后再触发reduce、update等。

依赖引擎可以调度这些操作并执行多线程和依赖跟踪。

3 设计一个通用的依赖引擎

我们希望您确信依赖引擎对于将深度学习程序扩展到多个设备是有用的。现在让我们讨论如何为依赖引擎设计和实现通用接口。这种解决方案并不是依赖引擎唯一可能的设计。这是一个我们认为在大多数情况下有用的例子。

我们的目标是创建一个通用的轻量级依赖引擎。理想情况下,我们希望引擎能够方便地插入到现有的深度学习代码中,并且能够在稍加修改的情况下扩展到多台机器。要做到这一点,我们只需要关注依赖跟踪,而不是假设用户可以或不能做什么。

这里是引擎目标的总结:

  • 引擎不应该知道它执行什么操作,以便用户可以执行他们定义的任何操作;
  • 不应该限制引擎可以调度的对象类型;
    我们应该能够调度对GPU和CPU内存的依赖 ;
    我们应该能够跟踪随机数生成器的依赖关系,等等;
  • 引擎不应该分配资源。它应该只跟踪依赖项。用户可以分配自己的内存、PRNG等。

下面的Python代码片段提供了一个引擎接口,可以帮助我们实现目标。注意,真正的实现将更接近于metal,通常是在c++中。

    class DepEngine(object):
        def new_variable():
            """Return a new variable tag
            Returns
            -------
            vtag : Variable Tag
                The token of the engine to represent dependencies.
            """
            pass

        def push(exec_func, read_vars, mutate_vars):
            """Push the operation to the engine.

            Parameters
            ----------
            exec_func : callable
                The real operation to be performed.

            read_vars : list of Variable Tags
                The list of variables this operation will read from.

            mutate_vars : list of Variable Tags
                The list of variables this operation will mutate.
            """
            pass

因为我们不能假设我们正在调度什么对象,所以我们要求用户分配一个与每个对象相关联的虚拟标记来表示我们需要调度什么。因此,在一开始,用户可以分配变量标记,并将其附加到我们希望调度的每个对象上。
在这里插入图片描述
然后用户调用push来告诉引擎要执行的函数。用户还需要指定操作的依赖关系,使用read_vars和write_vars:

  • read_vars是只读变量的标记,不需要更改其内部状态;
  • mutate_vars是内部状态可改变的对象的变量标记。
    在这里插入图片描述上面的图显示了如何将操作B = A + 1推送到依赖引擎。B.data和A.data是分配好的空间。请注意,引擎只知道变量标记。任何执行函数都可以被处理。这个接口对于我们想要调度的操作和资源是通用的。

为了好玩,让我们通过以下代码片段来了解引擎内部是如何处理标记的:

    B = A + 1
    C = A + 2
    A = C * 2
    D = A + 3

第一行读取变量A和可变变量B。第二行读取变量A和可变变量C,以此类推。

引擎为每个变量维护一个队列,如下面的动画所示。绿色块表示读取操作,而红色块表示修改操作。

在这里插入图片描述在构建此队列时,引擎会看到A队列开头的前两个绿色块实际上可以并行运行,因为它们都是读取操作,不会相互冲突。下图说明了这一点。

在这里插入图片描述
所有这些调度的一个很酷的地方是,它不只局限于数值计算。因为计划的所有事情都只是一个标记,引擎可以计划所有事情!

下图给出了我们在前面几节中提到的程序的完整推送序列。
在这里插入图片描述

3.1 将现有代码移植到依赖引擎

因为通用接口不控制内存分配和要执行的操作,所以依赖引擎可以将大多数现有代码调度为两个步骤:

  • 分配与内存blob、PRNG等资源相关的变量标记;
  • 调用push,将执行函数作为要执行的原始代码,并将相应资源的变量标记正确地放入read_vars和mutate_vars中。

3.2 实现通用依赖引擎

我们已经描述了通用引擎接口,以及如何使用它来调度各种操作。在本节中,我们将对如何实现这样的引擎进行高级讨论。

总体思路如下:

  • 使用队列跟踪每个变量标记上所有挂起的依赖项;
  • 在每个操作上使用计数器来跟踪还需要完成多少依赖项;
  • 操作完成后,更新队列和依赖项计数器的状态,以调度新的操作。

下图演示了调度算法,可能会让您更好地了解引擎中正在发生的事情。
在这里插入图片描述
下面,我们将展示另一个涉及随机数生成器的示例。
在这里插入图片描述
如您所见,该算法的目的是更新操作的挂起队列,并在操作完成时进行正确的状态转换。应该更加小心地确保状态转换以线程安全的方式完成。

3.3 独立的依赖跟踪和运行策略

如果您正在仔细阅读,您可能已经注意到前面的部分只显示了决定何时可以执行操作的算法。我们没有展示如何实际运行一个操作。实际上,可以有许多不同的策略。例如,我们可以使用一个全局线程池来运行所有操作,或者使用一个特定的线程在每个设备上运行操作。

这种运行策略通常独立于依赖跟踪,可以分为独立模块或基本依赖跟踪模块的虚拟接口。开发一个对所有操作和调度都公平的优雅的运行时策略本身就是一个有趣的系统问题。

4 讨论

我们在本文中讨论的设计并不是依赖跟踪问题的唯一解决方案。这只是我们如何解决这个问题的一个例子。当然,其中一些设计选择是有争议的。我们将在本节中讨论其中一些。

4.1 动态 VS. 静态

本主题中讨论的依赖项引擎接口在某种程度上是动态的,因为用户可以逐个推进操作,而不是声明整个依赖项图(静态)。就数据结构而言,动态调度可能比静态声明需要更多的开销。但是,它也支持更多的灵活性,例如支持命令式程序的自动并行性,或者命令式程序和符号程序的混合。您还可以向接口添加一些预先声明的操作,以支持数据结构重用。

4.2 可变的 VS. 不可变

本文提供的通用引擎接口支持显式的可变调度。在典型的数据流引擎中,数据通常是不可变的。使用不可变数据有很多好处。例如,不可变数据通常更适合并行化,并且有助于在分布式设置中更好地容错(通过重新计算)。

然而,不可变性带来了几个挑战:

  • 在处理随机数和删除时,很难安排资源竞争问题;
  • 引擎通常需要管理资源(内存、随机数)以避免冲突。很难处理用户分配的空间,等等;
  • 预先分配的静态内存不可用,这也是因为通常的模式是写入预先分配的层空间,如果数据是不可变的,则不支持这种模式。

允许可变调度可以缓解这些问题。

4.3 MxNet

MxNet是按照本文的思想实现了通用的依赖引擎。

5 参考

文章翻译自:https://mxnet.incubator.apache.org/architecture/note_engine.html

浅谈深度学习

阅读数 68

深度学习综述

阅读数 437

没有更多推荐了,返回首页