随着深度学习的发展,自然语言处理领域的难题也得到了不断突破,AlphaGo项目的主要负责人David Silver曾说“深度学习 (DL)+ 强化学习 (RL) = 人工智能 (AI)”。目前深度学习在自然语言处理上主要有哪些应用?在工程实践中是否会有哪些瓶颈?以下内容是根据达观数据联合创始人高翔在《深度学习与文本智能处理》直播的总结。
一、为什么做文本挖掘
什么是NLP?简单来说:NLP的目的是让机器能够理解人类的语言,是人和机器进行交流的技术。它应用在我们生活中,像:智能问答、机器翻译、文本分类、文本摘要,这项技术在慢慢影响我们的生活。
NLP的发展历史非常之久,计算机发明之后,就有以机器翻译为开端做早期的NLP尝试,但早期做得不是很成功。直到上个世纪八十年代,大部分自然语言处理系统还是基于人工规则的方式,使用规则引擎或者规则系统来做问答、翻译等功能。
第一次突破是上个世纪九十年代,有了统计机器学习的技术,并且建设了很多优质的语料库之后,统计模型使NLP技术有了较大的革新。接下来的发展基本还是基于这样传统的机器学习的技术。从2006年深度学习开始,包括现在图像上取得非常成功的进步之后,已经对NLP领域领域影响非常大。
达观划分的NLP技术层次
当年上小学时有一本书叫《字词句篇与达标训练》,里面讲了字、词、句、篇,我们开始学写字,词是最基础的一级,中文的一个字比英文的一个字母的语义要丰富的多,但表义能力仍然较差。所以中文一般的处理情况都是按照词级别,词级别的分析就有了中文分词、有了命名实体识别这样的层次来做底层处理。
在这个底层处理之上是段落级别,是一句话、一段话、短的文本,对这个级别文本做法又对应了相关的技术,包括:依存文法分析、词位置分析、语义归一化、文本纠错等等功能。但是这个功能也是为它更上级的服务去服务的,达观称之为“篇章”级的应用。
大部分同学平时做比赛、做项目关注的点最多是在“篇章”级的应用,底下这些中文分词等都已经有很好的工具了,不用再从头到尾去开发,只要关心上层的应用,把底下的工具用好,让它产生需要的Feature,来做分类、主题模型、文章建模,这种比较高层次的应用。
所以,要做好NLP,包括我们公司在内,这三个级别的技术都是自己掌握的。但是如果个人学习使用是有权衡的。某个同学的某一个技术特别好也是OK的,因为现在开源工具,甚至商用工具有很好的效果。如果不要求精度特别高或者有特殊的要求,用这些工具一般是可以达到你的要求。
每个层次的技术都是完全不同的,而且层次间的技术是有联系,一般的联系是底层是为上层服务。
达观数据就是应用这些技术为企业提供文档智能审阅、个性化推荐、垂直搜索等文本挖掘服务。
二、为什么要用深度学习?
深度学习的发展与应用要有一定的基础,上个世纪末互联网时代到来已经有大量的数据电子化,我们有海量的文章真是太多了,有这样的数据之后就要去算它,需要算法进步,以前这个数据量规模没法算,或者数据量太大算起来太慢。就算有更好的算法还是算得很慢时,就需要芯片的技术,尤其我们现在用并行计算GPU,这个加速对各种各样的算法尤其深度学习的算法影响速度非常大。
**所以一定要有这三个基础——数据、算法、芯片,在这三个核心基础上面做更高级的应用,**涉及人的感官——听觉、视觉、语言这三个感官,语音的识别、计算机的视觉、自然语言的处理。
深度学习与机器学习
很多同学会把深度学习和机器学习划等号。实际上它们不是等号。AI的概念非常大,比如我们用的Knowledge Base知识数据库也是一种AI,它可能没有那么智能。机器学习是AI其中的一小块,而深度学习用又是机器学习中的一小块,我们常见的CNN、RNN都属于深度学习的范畴。同时,达观也做Logistics Regression知识图谱,因为知识图谱是NLP中一个很重要的应用,无论是生成知识图谱,还是用它做像问答等其他应用都是会用到的。
我们为什么要用深度学习?可以比较一下经典机器学习和深度学习间的差异。
比如做一个分类的问题,这两个分类问题唯一的区别就是特征工程的区别。我们用经典的机器学习算法是上面这条路,输入数据后大家就开始(包括打比赛也)做各种各样的特征工程。有了这样的特征,我们还要根据TF-IDF、互信息、信息增益等各种各样的方式去算特征值,或对特征进行过滤排序。传统机器学习或经典机器学习90%的时间都会花在特征工程上。
**而Deep learning颠覆了这个过程,不需要做特征工程。**需要各种各样的特征,比如需要一些长时间依赖的特征,那可以用RNN、LSTM这些,让它有个序列的依赖;可以用局部的特征,用各种各样的N元语法模型,现在可以用CNN来提取局部的文本特征。
深度学习节省的时间是做特征工程的时间,这也是非常看重深度学习的原因: 第一,特征工程做起来很累。 第二,很多实际场景是挖掘出一个好的特征或者对我们系统贡献很大的特征,往往比选择算法影响还大。用基本的特征,它的算法差距不会特别大,最多也就10个点,主要还是特征工程这块,而深度学习很好的解决了这个问题。
有了深度学习之后,对文本挖掘就有了统一处理的框架,达观把它定义为五个过程:
1、文本数据。 2、预处理。预处理很重要,大家在工作中拿到的数据都是经过清洗过程的,“达观杯”算法大赛的数据是我们帮大家清洗过的。比赛中做到的字、词都是各种各样的ID,是预处理的一部分。 3、有了预处理之后,我们可以选择各种各样的网络。 4、后处理,比如业务需要分类,分类最终的结果是通过不通过,这都是后处理的过程。 5、应用,应用的方向有文本分类、情感分析、中文分词、命名实体识别、机器翻译。
几乎所有任务都可以拿Deep learning来做,它的适应性和它的广度非常好,例如传统的机器学习做文本分类需要特定的算法,而这个算法不可能做命名实体识别的事情。
通过Vector Representationns 进行低纬度连续空间的字词表示
在深度学习在NLP领域火起来之前,最有代表性的一个研究、对每个人影响最大的工作就是Word2Vec,把一个字、一个词变成向量来表示,这是对我们影响非常大的工作。
这件事情的好处是什么?在之前我们以词为单位,一个词的表示方式几乎都是one hot, one hot序列有一个致命的缺点,你不能计算相似度,所有人算出来都是“0”,都是一样的,距离也都是一样的,因此它不能很好的表示词之间的关系。
过去像威海市、潍坊市、枣庄市这三个城市对计算机来说是完全不一样的东西,而我们使用Word2Vec做这件事情有两个好处:
第一,这个词如果有1万维的话,1万维本来存储它就是一个非常稀疏的矩阵、而且很浪费,我们就可以把它变得更小,因为我们的Word2Vec里面一般的向量都在 512以内。这个维度的向量相对1万维来说已经是比较低维的空间,它里面存的是各种的浮点数,这个浮点数看起来这三个向量好像每个都不一样,但是实际去计算,发现这三个向量之间的相似度非常高,一个是相似度可以判断它的相似性,另外是判断它们的距离。
威海、潍坊、枣庄这几个城市在空间上离得非常近,它们的数值也非常近。它对于我们实际工作的好处是增强了我们的泛化能力,这是一个很难做的事情。
第一,有更好的带语义的表示;
第二,有了这样的表示之后可以做语义的计算,包括山东-威海约等于广东-佛山,两个向量之间是约等于的,语义的东西不太好解释,但是人知道这是怎么回事,语义相近就是Word2Vec最大的帮助。
有了表示学习之后,下一步就是常见的各种网络结构,这些都是非常常见的,比如CNN、GRU、RNN、Bi-LSTM。LSTM也是一种RNN,Bi-LSTM也是一种LSTM,只不过Bi是双向的LSTM,它可能学到前后上下文的特征和语义。GRU的好处是比LSTM这种算法稍微简单,所以在层次比较深的时候或者比较复杂的时候,用它这个单元的运算效率会高一点、快一点,但它实际精度可能稍微差一点,所以模型那么多,怎么来选是很重要的,要根据大家的实践去看看怎么用。
CNN模型原理
CNN是卷积神经网络。
这张图中间的九宫格就是个卷积格,每个数字相当于一个过滤器。它做的事情对一个图像来说,是把九宫格和图像中对应的矩阵相乘,乘出来一个结果,得到卷积之后它就开始平移,平移的步长是可选择的,一般我们都是一步一步平移过去。
它这样的好处是什么?对于图像来说,1个像素真的代表不了什么东西,那9个像素是不是有意义?是有意义的,它可能学到像直线、弯曲等特征,很简单的图形特点,然后它会得到一层。
为什么叫深度学习?我们这只是一层,它在CNN里面尤其图像识别网络,大家都听过“大力出奇迹”,网络越深效果越好,因为它经过一层一层的学习,可以把每一层的特征进行浓缩。简单的像素没有任何的表义能力,到第一层浓缩之后它有一些点线的能力,再往上浓缩可能就有弧线的能力,再往上浓缩它越来越复杂,可以做到把一个像素这个没有意义的东西变成有意义的东西,可以它可以看成是一层层的过滤,选出最好的特征结果,这是卷积的原理。卷积不仅仅在图像里,在文本里用得也非常好。
RNN和LSTM
简单来说LSTM就是单元格换了一个更复杂的RNN,它可以做到RNN做不到的事情。为什么叫长短期记忆网络?看下面这张图,它比传统的RNN多了一个所谓的细胞状态,我翻译成“细胞”,一般也叫“cell”。它多了一个存储长期信息的“cell”状态。
我们看一下第一张图,它是怎么来做长期记忆的更新?看输入Ht-1和Xt,Ht-1是上一个时刻这个cell隐状态的输出,Xt是当前输入,它们两个通过这个函数计算后的输出是0-1之间的某一个值。第一步,决定上个时刻细胞状态留下的比率是多少。
第二步,来了一些新的信息,不能只是把老的细胞状态更新,还要把新的信息添进去,通过这两个公式来添,第一个公式输出0-1的系数,第二个公式要选出量是多少。有了第一步和第二步之后就开始第三步细胞状态更新,第一步的输出0-1和Ct-1相乘决定上一时刻这个细胞状态留下多少。第二步算出来系数和信息量相乘决定留下多少新增信息,然后把上一步剩下的和这一步新增的加起来,做一个更新,这个更新就是现的cell状态值。
现在单元的状态更新完了,下一步就要输出,这个输出有两个:第一个,对外是一样,还是隐层的输出Ht,这个输出和前面讲的RNN隐层输出是一样的,只是多了一步内部更新。决定留下多少老的信息,决定留下多少新的信息,再把老的信息和新的信息加起来就是最终的结果。
长短期记忆网络可以把很长很远的语义通过Ct把信息记下来,而RNN本来就很擅长记忆这种比较近的信息,所以LSTM长短信息都能记下来,对后面特征的选择、模型的输出选择有很大的帮助。
三、深度学习的具体应用
1、one to one。图像分类:对于我们来说,图像就是二维矩阵,就是像素XY坐标的矩阵,输入之后经过神经网络的处理输出蓝色,这是分类问题。
2、one to many。图像描述。最早看到这个应用觉得很神奇,一个图像进来了,它告诉我图像上有一个狗、一个猫站在车旁边,这就是一个图像描述的过程,它可以把图像变成很多输出,这就是one to many的问题。
3、many to one。输入的是一个序列,文字等都是这样一个序列,这个序列输出之后做文本分类、情感分析,它最终都给出来这样一个结果,它们都属于“多到一”的过程。
4、many to many。这有两张图,它们的区别是:第一张图红色输入的时候没有蓝色的输出,而是等第三个红色输入的时候蓝色开始输出,它是一个异步的序列到序列的问题,异步到一个序列问题常见的例子就是机器翻译。机器翻译是看到很多上下文才能决定开始怎么翻译,不能光看到China就翻译成中国,因为英文的表述和中文表述顺序有时候不同,需要看到上下文之后再去翻译。但是有异步就有同步,我们写代码经常异步和同步问题,其实这边也一样,序列到序列的同步关系就是我们经常见的,所有选手应该都知道的序列标注问题。序列标注问题的上面就是各种各样的应用。
本次讲的是文本,所以我着重会讲many to one和many to many的过程。
文本分类
“达观杯”算法大赛很多同学在用传统的方式,包括baseline来做,很多人吐槽baseline好像有点高。但是我们没有做特殊优化,这是最基础的版本,做出来很高说明传统的机器学习还是非常好的,不是Deep learning一统天下。
传统的机器学习,需要构造特征,不同领域定制化程度很高,这个模型A领域用了,B领域几乎要从头再做一遍,没有办法把其他的特征迁移过来很好的使用。某些领域效果很好,某些领域另外一个算法很好,传统机器学习把各种各样的方式做以融合来提升效果。
深度学习则可实现端到端,无需大量特征工程。框架的通用性也很好,能满足多领域的需求,并且可以使用费监督语料训练字词向量提升效果。但是为什么有人吐槽Deep learning?因为调参很麻烦,有时改了一下参数好很多,改了一个参数效果又下降了,有的算法能够对此有一定的解释,但不像传统机器学习能够解释得那么好。这两大帮派不能说完全谁战胜了谁,是相融相生的。
TextCNN
它是一个单层的CNN,选择了几种类型的卷积,做一个feature map,然后用max-pooling取得每个map最大的特征作为最终的输出,结构非常简单,大家只要有一点深度学习的知识就可以,但是因为过于简单,而且CNN天生的缺陷是宽度有限,导致它会损失语义的问题。
Deep Pyramin CNN
Deep Pyramin CNN就是深度的CNN, CNN的特点就是结构简单。虽然有block N,但它每个block长得都是一样的,除了第一层,每一层就是一个pooling取一半,剩下是两个等宽度的卷积,输出250维,叠加好几层后就可能学到非常准的语义。
Hierarchical Attention Network
这个模型的优点是非常符合人类的思维。Word级别的时候前面的套路都是一样的,做各种Embedding,在Embedding到下一层次,这个输到下一层sentence级别之前会加一层Attention,让它知道这句话里面哪一个词最重要,这像我们知道一句话中哪个词最重要。
最终输出之前再加个Attention,这个Attenton去学这里面哪些句子最重要的。你可以简单的理解,它把我们输入的那么多文本,也是经过了一层层的过滤,前面是通过卷积的过程,它现在是通过Attention的机制去找。
还有一个特别好的地方是学部分可解释,句子里哪些词最重要,它的蓝颜色就更深,它能找到语义级别哪个语义对分类贡献最大,这是这个网络很好的一点。
包括前面讲的HNN、Deep Pyramin CNN,网上的实现跟论文是有一定差别的。所以大家要注意,我们关注的是它整体的网络结构,并不是每一点的百分之百的还原,我们不是它的复制者,而是它的使用者。所有的网络结构、参数甚至过程,只要大体的思想有了就OK。这两个是many to one在文本分类上用得很多的。
序列标注
序列标注就两个东西:第一个是定义标签体系。我们这边一般最常用BMES,简单一点的IO,复杂一点的BIO,BMES算是一个经典的方法,不多也不少,还有M1、M2、M3更复杂的一般都不太用。
深度学习和传统文本处理方法的结合
传统的CRF用起来效果不错,Deep learning也能够把这个事情做得很好。LSTM可以学习到很长的上下文,而且对识别非常有帮助。实际问题或者工业应用来说,我们要保证它的整体效果和复杂度的情况下,这边Bi-LSTM是一个非常好的方式,也是相对比较成熟的方式。
为什么要加CRF?我对这个模型结构的看待,它是一个深度学习和传统方式非常完美的结合。Bi-LSTM做特征工程,CRF做标签的输出。很多同学都试过,用纯的Bi-LSTM去写,最终输出标签之间没有序列依赖的关系。
序列标注特征选择多维度字词向量表示
做这个模型能做什么事情?大家的网络都类似,怎么去PK?
这是非常好的一篇论文,讲到了我们怎么能够把各种各样的level的信息用到,它这边是英文,所以有一个char级别的,先对char,通过RNN、CNN做一个Embedding,学习到char级别上的关系,char级别的关系合并之后是黄颜色那个字符的向量,然后它又把word级别的红颜色的词向量也加进去拼起来,还有两个是灰颜色的,灰颜色的是人工特征。就看大家自己怎么加,这是每个人的智慧。
引入注意力机制来实现生成式摘要
生成式摘要是很难的一个东西,它的训练集标注比我们标分词、标分类难得多,要有一篇文章,人得写出摘要,整理出好多这样的摘要,因为每个人写得不一样,包括评测的方式BLUE等,所以做摘要比较难。但是我们平时可以基于生成式文本的其他小应用。
举个简单的例子,大家爬过一些新闻的网站,那么长的正文一般正文第一段把事情都说清楚了,然后有一个新闻的标题,我们可以用第一段作为输入,标题作为输出,做这样一个简单的通过新闻第一段可以写出新闻标题的功能,其实跟生成摘要的思想是一样的。唯一的差别是它加了注意力的机制,会发现它关注输出的哪些词对语义表达最有用,它会关注有用的信息,解码的时候就可以得到各种各样的序列、各种各样的值,用beam search找到最好的结果。
引入注意机制,以前做不了这个事情,现在我们可以做这个事情。工业中用得比较多的是抽取式的摘要,简单来说就是一篇文章中哪些句子比较重要,把它抽出来就可以了。
四、达观数据文本挖掘的经验和思考
实际工程中需要考虑的因素:
1、长文本阅读的场景和关键难点有哪些? 2、文档结构信息(如段落)丢失时该如何还原? 3、数据的训练量如何,质量和数据量都不行的时候该怎么办? 4、如何构建一个真正面向实用的测评系统? 5、领域知识如何引入到系统中? 6、知识图谱自动化构建方法? 7、深度学习和经典机器学习该如何取舍?
达观在实际工程中运用深度学习挖掘文本的思考:
深度学习优点
1、我们可以用非监督的训练向量来提升它的泛化,主要目标是提升泛化。
2、它有些端到端的方式,可以提供新思路。
3、深度学习能够克服传统模型的缺点,大家用CRF很多,但CFR有时拿不到太远的长的上下文,它比较关注左右邻居的状态,很远的状态对它影响不大。但是有些语义影响很大,比如我们要抽“原告律师”、“被告律师”,“原告刘德华”,然后中间讲了一大堆,“委托律师张学友”,我们能抽取出来他是律师,但是如何知道他是原告律师?一定要看到刘德华前面三个有“原告”两个字,才知道他是原告律师。这时如果用深度学习LSTM的方式可以学到比较远的上下文特征,帮助你解决这个问题。
深度学习缺点
1、 小数据量的情况效果不能保证 2、 调参工作量有时不亚于特征工程 3、 系统要配合客户的部署硬件系统
思考
1、在业务场景下尽量收集并理解数据,分析问题本质,选择合适模型 2、初始阶段可以使用传统机器学习模型快速尝试,再引入深度学习技术 3、疑难问题使用端到端也许会有惊喜 4、关注前沿技术,包括对抗网络、强化学习、迁移学习 5、一句话送给大家, “数据决定效果的上限,模型只是逼近上线。” 6、不断尝试,从挫折中总结规律