自然语言处理三大特征抽取器(CNN/RNN/TF)比较

转载https://zhuanlan.zhihu.com/p/54743941
放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较

一个是Bert这种两阶段的模式(预训练+Finetuning)必将成为NLP领域研究和工业应用的流行方法;
第二个是从NLP领域的特征抽取器角度来说,Transformer会逐步取代RNN成为最主流的的特征抽取器。

目前NLP里的三大特征抽取器的未来走向趋势做个宏观判断:
RNN人老珠黄,已经基本完成它的历史使命,将来会逐步退出历史舞台;
CNN如果改造得当,将来还是有希望有自己在NLP领域的一席之地,如果改造成功程度超出期望,那么还有一丝可能
作为割据一方的军阀,继续生存壮大,当然我认为这个希望不大,可能跟宋小宝打篮球把姚明打哭的概率相当;
而新欢Transformer明显会很快成为NLP里担当大任的最主流的特征抽取器。

NLP任务的特点:
和图像有极大的不同,NLP的输入往往是一句话或者一篇文章,所以它有几个特点:
首先,输入是个一维线性序列,这个好理解;
其次,输入是不定长的,有的长有的短,而这点其实对于模型处理起来也会增加一些小麻烦;
再次,单词或者子句的相对位置关系很重要,两个单词位置互换可能导致完全不同的意思。
如果你听到我对你说:“你欠我那一千万不用还了”和
“我欠你那一千万不用还了”,你听到后分别是什么心情?两者区别了解一下;
另外,句子中的长距离特征对于理解语义也非常关键,例子参考上图标红的单词,
特征抽取器能否具备长距离特征捕获能力这一点对于解决NLP任务来说也是很关键的。

一个特征抽取器是否适配问题领域的特点,有时候决定了它的成败,而很多模型改进的方向,
其实就是改造得使得它更匹配领域问题的特性。

NLP的四大类任务:
一类是序列标注,这是最典型的NLP任务,比如中文分词,词性标注,命名实体识别,语义角色标注等都可以归入这一类问题,
它的特点是句子中每个单词要求模型根据上下文都要给出一个分类类别。

第二类是分类任务,比如我们常见的文本分类,情感计算等都可以归入这一类。它的特点是不管文章有多长,总体给出一个分
类类别即可。

第三类任务是句子关系判断,比如Entailment,QA,语义改写,自然语言推理等任务都是这个模式,它的特点是给定两个句子,
模型判断出两个句子是否具备某种语义关系;

第四类是生成式任务,比如机器翻译,文本摘要,写诗造句,看图说话等都属于这一类。它的特点是输入文本内容后,需要自主
生成另外一段文字。

解决这些不同的任务,从模型角度来讲什么最重要?是特征抽取器的能力。
尤其是深度学习流行开来后,这一点更凸显出来。因为深度学习最大的优点是“端到端(end to end)”,当然这里不是指的从客户
端到云端,意思是以前研发人员得考虑设计抽取哪些特征,而端到端时代后,这些你完全不用管,把原始输入扔给好的特征抽取器
,它自己会把有用的特征抽取出来。

现在需要做的事情就是:选择一个好的特征抽取器,选择一个好的特征抽取器,选择一个好的特征抽取器,喂给它大量的训练数据,
设定好优化目标(loss function),告诉它你想让它干嘛。
大量时间其实是用在调参上。
AutoML  自动调参


RNN:沙场老将RNN:廉颇老矣,尚能饭否
为何RNN能够成为解决NLP问题的主流特征抽取器?
RNN采取线性序列结构不断从前往后收集输入信息,但这种线性序列结构在反向传播的时候存在优化困难问题,因为反向传播路径太
长,容易导致严重的梯度消失或梯度爆炸问题。
为了解决这个问题,后来引入了LSTM和GRU模型,通过增加中间状态信息直接向后传播,以此缓解梯度消失问题,获得了很好的效果,
于是很快LSTM和GRU成为RNN的标准模型。

经过不断优化,后来NLP又从图像领域借鉴并引入了attention机制,叠加网络把层深作深,以及引入Encoder-Decoder框架,这些技术
进展极大拓展了RNN的能力以及应用效果。

为什么RNN能够这么快在NLP流行并且占据了主导地位呢?
因为RNN的结构天然适配解决NLP的问题,NLP的输入往往是个不定长的线性序列句子,而RNN本身结构就是个可以接纳不定长输入的由前
向后进行信息线性传导的网络结构,而在LSTM引入三个门后,对于捕获长距离特征也是非常有效的。所以RNN特别适合NLP这种线形序列
应用场景,这是RNN为何在NLP界如此流行的根本原因。

RNN在新时代面临的两个严重问题?
第一个原因在于一些后起之秀新模型的崛起,比如经过特殊改造的CNN模型,以及最近特别流行的Transformer,这些后起之秀尤其是
Transformer的应用效果相比RNN来说,目前看具有明显的优势。

另外一个严重阻碍RNN将来继续走红的问题是:RNN本身的序列依赖结构对于大规模并行计算来说相当之不友好。通俗点说,就是RNN
很难具备高效的并行计算能力,
但是如果工业界进行技术选型的时候,在有快得多的模型可用的前提下,是不太可能选择那么慢的模型的。

为什么RNN并行计算能力比较差?是什么原因造成的?
RNN之所以是RNN,能将其和其它模型区分开的最典型标志是:T时刻隐层状态的计算,依赖两个输入,一个是T时刻的句子输入单词Xt,
这个不算特点,所有模型都要接收这个原始输入;关键的是另外一个输入,T时刻的隐层状态St还依赖T-1时刻的隐层状态S(t-1)的输出,
这是最能体现RNN本质特征的一点,RNN的历史信息是通过这个信息传输渠道往后传输的,
为什么RNN的并行计算能力不行呢?问题就出在这里。因为T时刻的计算依赖T-1时刻的隐层计算结果,而T-1时刻的计算依赖T-2时刻的
隐层计算结果……..这样就形成了所谓的序列依赖关系。就是说只能先把第1时间步的算完,才能算第2时间步的结果,这就造成了RNN在
这个角度上是无法并行计算的,只能老老实实地按着时间步一个单词一个单词往后走。

而CNN和Transformer就不存在这种序列依赖问题,所以对于这两者来说并行计算能力就不是问题,每个时间步的操作可以并行一起计算。

如何改造RNN使其具备并行计算能力?
有两个大的思路来改进:一种是仍然保留任意连续时间步(T-1到T时刻)之间的隐层连接;而另外一种是部分地打断连续时间步
(T-1到T时刻)之间的隐层连接
第一种方法,形成3路并行计算(红色箭头分隔开成了三路),而每一路因为仍然存在序列依赖问题,所以每一路内仍然是串行的。
这种方法的代表就是论文“Simple Recurrent Units for Highly Parallelizable Recurrence”中提出的SRU方法,它最本质的改进是
把隐层之间的神经元依赖由全连接改成了哈达马乘积,这样T时刻隐层单元本来对T-1时刻所有隐层单元的依赖,改成了只是对T-1时刻
对应单元的依赖,于是可以在隐层单元之间进行并行计算,但是收集信息仍然是按照时间序列来进行的。所以其并行性是在隐层单元
之间发生的,而不是在不同时间步之间发生的。

第二种改进典型的思路是:为了能够在不同时间步输入之间进行并行计算,那么只有一种做法,那就是打断隐层之间的连接,但是又不能
全打断,因为这样基本就无法捕获组合特征了,所以唯一能选的策略就是部分打断,比如每隔2个时间步打断一次,
但是距离稍微远点的特征如何捕获呢?只能加深层深,通过层深来建立远距离特征之间的联系。

CNN:偏师之将CNN:刺激战场绝地求生
NLP中早期的怀旧版CNN模型
卷积层本质上是个特征抽取层,可以设定超参数F来指定卷积层包含多少个卷积核(Filter)。对于某个Filter来说,可以想象有一个
d*k大小的移动窗口从输入矩阵的第一个字开始不断往后移动,其中k是Filter指定的窗口大小,d是Word Embedding长度。对于某个时
刻的窗口,通过神经网络的非线性变换,将这个窗口内的输入值转换为某个特征值,随着窗口不断往后移动,这个Filter对应的特征
值不断产生,形成这个Filter的特征向量。这就是卷积核抽取特征的过程。卷积层内每个Filter都如此操作,就形成了不同的特征序列。
Pooling 层则对Filter的特征进行降维操作,形成最终的特征。一般在Pooling层之后连接全联接层神经网络,形成最后的分类
过程。

CNN的进化:物竞天择的模型斗兽场
怀旧版CNN存在哪些问题?NLP专家们是如何改造CNN,一直改到目前看上去还算效果不错的现代版本CNN的。
首先,我们先要明确一点:CNN捕获到的是什么特征呢?
怀旧版本CNN卷积层的运作机制关键在于卷积核覆盖的那个滑动窗口,CNN能捕获到的特征基本都体现在这个滑动窗口里了。
大小为k的滑动窗口轻轻的穿过句子的一个个单词,荡起阵阵涟漪,那么它捕获了什么?其实它捕获到的是单词的k-gram片段信息,
这些k-gram片段就是CNN捕获到的特征,k的大小决定了能捕获多远距离的特征。

单卷积层无法捕获远距离特征。
怀旧版CNN的第一个问题:它只有一个卷积层。只有一个卷积层带来的问题是:对于远距离特征,单层CNN是无法捕获到的,
如果滑动窗口k最大为2,而如果有个远距离特征距离是5,那么无论上多少个卷积核,都无法覆盖到长度为5的距离的输入,
所以它是无法捕获长距离特征的。

那么怎样才能捕获到长距离的特征呢?
有两种典型的改进方法:
一种是Dilated CNN捕获远距离特征。
假设我们仍然用单个卷积层,滑动窗口大小k假设为3,就是只接收三个输入单词,但是我们
想捕获距离为5的特征,怎么做才行?显然,如果卷积核窗口仍然覆盖连续区域,这肯定是完不成任务的。可以跳着覆盖,
这就是Dilated 卷积的基本思想,确实也是一种解决方法。

第二种是加深CNN网络来捕获远距离特征。
第一层卷积层,假设滑动窗口大小k是3,如果再往上叠一层卷积层,假设滑动窗口大小也是3,但是第二层窗口覆盖的是第一层
窗口的输出特征,所以它其实能覆盖输入的距离达到了5。如果继续往上叠加卷积层,可以继续增大卷积核覆盖输入的长度。

上面是两种典型的解决CNN远距离特征捕获能力的方案,Dilated CNN偏技巧一些,而且叠加卷积层时超参如何设置有些学问,
因为连续跳接可能会错过一些特征组合,所以需要精心调节参数搭配,保证所有可能组合都被覆盖到。相对而言,把CNN作深
是主流发展方向。上面这个道理好理解,其实自从CNN一出现,人们就想各种办法试图把CNN的深度做起来,但是现实往往是无情的,
发现怎么折腾,CNN做NLP问题就是做不深,做到2到3层卷积层就做不上去了,网络更深对任务效果没什么帮助。
目前看来,还是深层网络参数优化手段不足导致的这个问题,而不是层深没有用。

怀旧版CNN还有个问题,就是那个Max Pooling层,这块其实与CNN能否保持输入句子中单词的位置信息有关系。
RNN因为是线性序列结构,所以很自然它天然就会把位置信息编码进去;那么,CNN是否能够保留原始输入的相对位置信息呢?
我们前面说过对于NLP问题来说,位置信息是很有用的。其实CNN的卷积核是能保留特征之间的相对位置的,道理很简单,
滑动窗口从左到右滑动,捕获到的特征也是如此顺序排列,所以它在结构上已经记录了相对位置信息了。
但是如果卷积层后面立即接上Pooling层的话,Max Pooling的操作逻辑是:从一个卷积核获得的特征向量里只选中并保留
最强的那一个特征,所以到了Pooling层,位置信息就被扔掉了,这在NLP里其实是有信息损失的。所以在NLP领域里,目前
CNN的一个发展趋势是抛弃Pooling层,靠全卷积层来叠加网络深度

目前NLP界主流的CNN:
在NLP领域能够施展身手的摩登CNN。通常由1-D卷积层来叠加深度,使用Skip Connection来辅助优化,也可以引入Dilated
CNN等手段。

CNN的位置编码问题和并行计算能力问题。上面说了,CNN的卷积层其实是保留了相对位置信息的,
中间层不要随手瞎插入Pooling层,问题就不大,不专门在输入部分对position进行编码也行。但是也可以类似ConvS2S那样,
专门在输入部分给每个单词增加一个position embedding,将单词的position embedding和词向量embedding叠加起来形成单词输入,
这样也可以,也是常规做法

CNN的并行计算能力,那是非常强的,这其实很好理解。我们考虑单层卷积层,首先对于某个卷积核来说,每个滑动窗口位置之间没有
依赖关系,所以完全可以并行计算;另外,不同的卷积核之间也没什么相互影响,所以也可以并行计算。CNN的并行度是非常自由也非
常高的,这是CNN的一个非常好的优点。

怀旧版CNN是如何在NLP修罗场一步步通过自我进化生存到今天的。CNN的进化方向,如果千言万语一句话归纳的话,那就是:想方设法把
CNN的深度做起来,随着深度的增加,很多看似无关的问题就随之解决了。

Transformer:白衣骑士Transformer:盖世英雄站上舞台
Transformer是谷歌在17年做机器翻译任务的“Attention is all you need”的论文中提出的,引起了相当大的反响.
https://jalammar.github.io/illustrated-transformer/         英文版
https://zhuanlan.zhihu.com/p/54356280                       中文翻译版
Jay Alammar可视化地介绍Transformer

https://medium.com/dissecting-bert/dissecting-bert-part-1-d3c3d495cdb3
Calvo的博客,尽管说是解析Bert,但是因为Bert的Encoder就是Transformer,所以其实它是在解析Transformer,里面举的例子很好

http://nlp.seas.harvard.edu/2018/04/03/attention.html
The Annotated Transformer
哈佛大学NLP研究组写的,代码原理双管齐下,讲得也很清楚

Attention is all you need”论文中说的的Transformer指的是完整的Encoder-Decoder框架,而我这里是从特征提取器
角度来说的,你可以简单理解为论文中的Encoder部分。因为Encoder部分目的比较单纯,就是从原始句子中提取特征,
而Decoder部分则功能相对比较多,除了特征提取功能外,还包含语言模型功能,以及用attention机制表达的翻译模型功能。
所以这里请注意,避免后续理解概念产生混淆。

Transformer的Encoder部分(不是上图一个一个的标为encoder的模块,而是红框内的整体,上图来自
The Illustrated Transformer,Jay Alammar把每个Block称为Encoder不太符合常规叫法)是由若干个相同的
Transformer Block堆叠成的。 这个Transformer Block其实才是Transformer最关键的地方,核心配方就在这里。

Transformer Block整体结构:
Transformer原始论文一直重点在说Self Attention,但是目前来看,能让Transformer效果好的,不仅仅是
Self attention,这个Block里所有元素,包括Multi-head self attention,Skip connection,LayerNorm,
FF一起在发挥作用。

针对NLP任务的特点来说下Transformer的对应解决方案。
首先,自然语言一般是个不定长的句子,那么这个不定长问题怎么解决呢?Transformer做法跟CNN是类似的,
一般设定输入的最大长度,如果句子没那么长,则用Padding填充,这样整个模型输入起码看起来是定长的了。
另外,为了能够保留输入句子单词之间的相对位置信息,必须明确的在输入端将Positon信息编码,
Transformer是用位置函数来进行位置编码的,而Bert等模型则给每个单词一个Position embedding,将单词
embedding和单词对应的position embedding加起来形成单词的输入embedding,类似上文讲的ConvS2S的做法。
最后,关于NLP句子中长距离依赖特征的问题,Self attention天然就能解决这个问题,因为在集成信息的时候,
当前单词和句子中任意单词都发生了联系,所以一步到位就把这个事情做掉了。

Transformer是怎样解决NLP任务几个关键点的?
Transformer有两个版本:Transformer base和Transformer Big。两者结构其实是一样的,主要区别是包含的
Transformer Block数量不同,Transformer base包含12个Block叠加,而Transformer Big则扩张一倍,包含24
个Block。无疑Transformer Big在网络深度,参数量以及计算量相对Transformer base翻倍,所以是相对重的
一个模型,但是效果也最好。

三大特征抽取器比较:
从以下几个维度来进行分析判断:    
1.语义特征提取能力;
实验支持如下结论:Transformer在这方面的能力非常显著地超过RNN和CNN(在考察语义类能力的任务WSD中,
Transformer超过RNN和CNN大约4-8个绝对百分点),RNN和CNN两者能力差不太多。

2.长距离特征捕获能力;
综合看,可以认为Transformer和RNN在这方面能力差不太多,而CNN则显著弱于前两者。

为什么CNN在捕获长距离特征方面这么弱呢?
CNN解决这个问题是靠堆积深度来获得覆盖更长的输入长度的,所以CNN在这方面的表现与卷积核能够覆盖的输入
距离最大长度有关系。如果通过增大卷积核的kernel size,同时加深网络深度,以此来增加输入的长度覆盖。
实验证明这能够明显提升CNN的long-range特征捕获能力。但是尽管如此,CNN在这方面仍然显著弱于RNN和Transformer。

对于Transformer来说,Multi-head attention的head数量严重影响NLP任务中Long-range特征捕获能力:
结论是head越多越有利于捕获long-range特征。

3.任务综合特征抽取能力;
在具体任务中引入不同特征抽取器,然后比较效果差异,以此来综合评定三者的综合能力。
NLP中最具有代表性的任务是机器翻译。很多NLP的重要的创新模型都是在机器翻译任务上提出来的。
因为机器翻译基本上是对NLP各项处理能力综合要求最高的任务之一,要想获得高质量的翻译结果,对于两种语言的词法,
句法,语义,上下文处理能力,长距离特征捕获等等更方面都需要考虑进来才行。

在8个不同的NLP任务上,在其它条件相同的情况下,只是把特征抽取器从Transformer换成LSTM,平均下来8个任务得分掉了5个点以上

结论:以机器翻译为代表的综合特征抽取能力方面,Transformer综合能力要明显强于RNN和CNN,而RNN和CNN看上去表现基本相当,
貌似CNN表现略好一些

4.并行计算能力及运行效率:
RNN在并行计算方面有严重缺陷,这是它本身的序列依赖特性导致的,所谓成也萧何败也萧何,它的这个线形序列依赖性非常符合
解决NLP任务,这也是为何RNN一引入到NLP就很快流行起来的原因,但是也正是这个线形序列依赖特性,导致它在并行计算方面要
想获得质的飞跃,看起来困难重重,近乎是不太可能完成的任务。

而对于CNN和Transformer来说,因为它们不存在网络中间状态不同时间步输入的依赖关系,所以可以非常方便及自由地做并行计算改造

并行计算能力由高到低排序如下:Transformer和CNN差不多,都远远远远强于RNN。

关于三者速度对比方面,目前的主流经验结论基本如上所述:Transformer Base最快,CNN次之,再次Transformer Big,最慢的是RNN。
RNN比前两者慢了3倍到几十倍之间

综合排名情况:
单从任务综合效果方面来说,Transformer明显优于CNN,CNN略微优于RNN。
速度方面Transformer和CNN明显占优,RNN在这方面劣势非常明显。
这两者再综合起来,如果我给的排序结果是Transformer>CNN>RNN

从速度和效果折衷的角度看,对于工业界实用化应用,特征抽取器选择方面配置Transformer base是个较好的选择。

三者的合流:向Transformer靠拢
Transformer的效果相对原生RNN和CNN来说有比较明显的优势,那么是否意味着我们可以放弃RNN和CNN了呢?事实倒也并未如此。
使用"寄居蟹"策略,Transformer Block其实不是只有一个构件,而是由multi-head attention/skip connection/Layer Norm/Feed forward network等
几个构件组成的一个小系统,把RNN或者CNN塞到Transformer Block里,这就是寄居蟹策略的基本思路。

怎么把RNN和CNN塞到Transformer Block的肚子里,从而能够实现寄居策略呢?
用双向RNN替换掉Multi-head attention
用CNN替换掉Multi-head attention
大的方向就是把self attention 模块用双向RNN或者CNN替换掉,Transformer Block的其它构件依然健在。

在原生RNN逐步加入Transformer的各个构件后的效果,原生RNN的效果在不断稳定提升。但是与土生土长的Transformer相比,性能仍然有差距。

对CNN进行不断改造的过程以及其对应效果。同样的,性能也有不同幅度的提升。但是也与土家Transformer性能存在一些差距。

这说明Transformer之所以能够效果这么好,不仅仅multi-head attention在发生作用,而是几乎所有构件都在共同发挥作用,是一个小小的系统工程。

RNN和CNN的大的出路在于寄生到Transformer Block里

总结:
进退维谷的RNN
为什么说RNN进退维谷呢?有几个原因。
首先,如果靠原生的RNN(包括LSTM,GRU以及引入Attention以及堆叠层次等各种你能想到的改进方法,可以一起上),目前很多实验已经证明
效果比起Transformer有较大差距,现在看基本没有迎头赶上的可能,所以原生的RNN从效果来讲是处于明显劣势的。

其次,原生的RNN还有一个致命的问题:并行计算能力受限制太严重。想要大规模实用化应用?目前看希望渺茫。

决定了RNN本身的根本特质是:T时刻隐层节点对前向输入及中间计算结果的序列依赖,因为它要线形序列收集前面的信息,这是RNN之所以是RNN的最主要特点。
正是它的这个根本特质,使得RNN的并行计算能力想要获得根本解决基本陷入了一个两难的境地:要么仍然保持RNN序列依赖的根本特性,这样不论怎么改造,
因为这个根本还在,所以RNN依旧是RNN

一希尚存的CNN
CNN比RNN的状态还要占优一些,最主要的原因有两个:
一个是因为CNN的天生自带的高并行计算能力,这对于延长它的生命力发挥了很大作用。这就决定了与
Transformer比起来,它并不存在无法克服的困难,所以仍然有希望;
第二,早期的CNN做不好NLP的一个很大原因是网络深度做不起来,随着不断借鉴图像处
理的新型CNN模型的构造经验,以及一些深度网络的优化trick,CNN在NLP领域里的深度逐步能做起来了。
而既然深度能做起来,那么本来CNN做NLP天然的一个缺陷:无法有效捕获长距离特征的问题,就得到了极大缓解。
目前看可以靠堆深度或者结合dilated CNN来一定程度上解决这个问题,虽然还不够好,但是仍然是那句话,希望还在。

稳操胜券的transformer
原生的RNN和CNN,总有一些方面显著弱于Transformer(并行计算能力或者效果,或者两者同时都比Transformer弱)

目前能够和Transformer一战的CNN模型,基本都已经长成Transformer的模样了。

ransformer作为一个新模型,并不是完美无缺的。它也有明显的缺点:
首先,对于长输入的任务,典型的比如篇章级别的任务(例如文本摘要),因为任务的输入太长,Transformer会有巨大的计算
复杂度,导致速度会急剧变慢。所以估计短期内这些领地还能是RNN或者长成Transformer模样的CNN的天下。CNN模型,希望更大一些。
然后,Transformer整体结构确实显得复杂了一些,如何更深刻认识它的作用机理,然后进一步简化它,这也是一个好的探索方向。
还有,上面在做语义特征抽取能力比较时,结论是对于距离远与13的长距离特征,Transformer性能弱于RNN

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值