找回密码
 立即注册
搜索

放弃幻想,片面拥抱 Transformer:自然言语处理三大特征抽取器(CNN/RNN/TF)比较(上篇)

雷锋网 AI 科技回复按:本文的作者是张俊林教师,他是中国中文信息学会理事,中科院软件所博士,目前在新浪微博 AI Lab 担任资深算法专家。在此之前,张俊林教师曾在阿里巴巴任资深技术专家并担任新技术团队,也曾在百度和用友担任技术经理及技术总监等职务。同时他是技术书籍《这就是搜索引擎:核心技术详解》(该书荣获全国第十二届优秀图书奖)、《大数据日知录:架构与算法》的作者。本文首发于知乎,经作者答应,雷锋网 AI 科技回复停止转载。

在辞旧迎新的时辰,大家都在忙着回顾过去一年的成绩(或者在灶台前含泪数锅),并对 2019 做着规划,当然也有不少冤家执行力和工作效率比较高,直接把 2018 年终制定的计划拷贝一下,就能在 3 秒钟内完成 2019 年计划的制定,在此表示恭喜。2018 年从经济角度讲,对于一切人能够都是比较忧伤的一年,而对于自然言语处理范畴来说,2018 年无疑是个播种颇丰的年头,而诸多技术停顿假如只能选择一项来讲的话,那么当之无愧的应该就是 Bert 模型了。在上一篇引见 Bert 的文章「从 Word Embedding 到 Bert 模型—自然言语处理中的预训练技术发展史」里,我曾大言不惭地宣称如下两个个人判别:一个是 Bert 这种两阶段的形式(预训练+Finetuning)必将成为 NLP 范畴研讨和工业运用的盛行方法;第二个是从 NLP 范畴的特征抽取器角度来说,Transformer 会逐渐取代 RNN 成为最主流的的特征抽取器。关于特征抽取器方面的判别,下面文章限于篇幅,只是给了一个结论,并未给出具有诱惑力的阐明,看过我文章的人都知道我不是一个随意下结论的人(那位正在补充下一句:「你随意起来不是……」的同窗请住口,请不要泄露国家机密,你可以继续睡觉,吵到其它同窗也没有关系,哈哈),但是为什么当时我会下这个结论呢?本文可以看做是上文的一个外传,会给出比较详实的证据来支撑之前给出的结论。

假如对目前 NLP 里的三大特征抽取器的将来走向趋向做个宏观判别的话,我的判别是这样的:RNN 人老珠黄,曾经基本完成它的历史使命,将来会逐渐加入历史舞台;CNN 假如改造得当,将来还是有希望有本人在 NLP 范畴的一席之地,假如改形成功程度超出希冀,那么还有一丝能够作为割据一方的军阀,继续生活壮大,当然我以为这个希望不大,能够跟宋小宝打篮球把姚明打哭的概率相当;而新欢 Transformer 分明会很快成为 NLP 里担当大任的最主流的特征抽取器。至于将来能否会出现新的特征抽取器,一枪将 Tranformer 挑落马下,继而取而代之成为新的特征抽取山大王?这种担忧其实是挺有必要的,毕竟李商隐在一千年前就告诫过我们说:「君恩如水向东流,得宠忧移得宠愁。莫向樽前奏花落,凉风只在殿西头。」当然这首诗看样子目前送给 RNN 是比较贴切的,至于将来 Transformer 能否会得宠?这个成绩的答案基本可以是一定的,无非这个时辰的降临是 3 年之后,还是 1 年之后出现而已。当然,我希望假如是在读这篇文章的你,或者是我,在将来的某一天,从街头拉来一位长相普通的淑女,送到韩国整容,一不小心偏离流水线整容工业的美女模板,整出一位天香国色的绝色,来把 Transformer 打入冷宫,那是最好不过。但是在目前的形状下,即便是打着望远镜,貌似还没有看到有这种资质的候选人出如今我们的视野之内。

我知道假如是一位严谨的研发人员,不应该在目前形势还没那么阴暗的时分做出如上看似有些武断的明白结论,所以这种说法能够会惹起争议。但是这的确就是我目前的真实想法,至于根据什么得出的上述判别?这种判别能否有根据?根据能否充分?置信你在看完这篇文章可以有个属于本人的结论。

能够谈到这里,有些往常吃亏吃的少所以喜欢挑刺的同窗会质疑说:你凭什么说 NLP 的典型特征抽取器就这三种呢?你置其它知名的特征抽取器比如 Recursive NN 于何地? 嗯,是,很多引见 NLP 重要停顿的文章里甚至把 Recursive NN 当做一项 NLP 里的严重停顿,除了它,还有其它的比如 Memory Network 也享用这种部局级尊贵待遇。但是我不断都不太看好这两个技术,而且不看好很多年了,目前情形更坚定了这个看法。而且我收费奉劝你一句,没必要在这两个技术上糜费工夫,至于为什么,由于跟本文主题有关,当前无机会再详细说。

下面是结论,下面,我们正式进入举证阶段。

战场侦查:NLP 义务的特点及义务类型



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

下面这几个特点请记清,一个特征抽取器能否适配成绩范畴的特点,有时分决议了它的成败,而很多模型改进的方向,其实就是改造得使得它更婚配范畴成绩的特性。这也是为何我在引见 RNN、CNN、Transformer 等特征抽取器之前,先阐明这些内容的缘由。

NLP 是个很广泛的范畴,包含了几十个子范畴,实际上只需跟言语处理相关,都可以归入这个范围。但是假如我们对大量 NLP 义务停止笼统的话,会发现绝大多数 NLP 义务可以归结为几大类义务。两个看似差异很大的义务,在处理义务的模型角度,能够完全是一样的。


通常而言,绝大部分 NLP 成绩可以归入上图所示的四类义务中:一类是序列标注,这是最典型的 NLP 义务,比如中文分词,词性标注,命名实体辨认,语义角色标注等都可以归入这一类成绩,它的特点是句子中每个单词要求模型根据上下文都要给出一个分类类别。第二类是分类义务,比如我们常见的文本分类,情感计算等都可以归入这一类。它的特点是不管文章有多长,总体给出一个分类类别即可。第三类义务是句子关系判别,比如 Entailment,QA,语义改写,自然言语推理等义务都是这个形式,它的特点是给定两个句子,模型判别出两个句子能否具有某种语义关系;第四类是生成式义务,比如机器翻译,文本摘要,写诗造句,看图说话等都属于这一类。它的特点是输入文本内容后,需求自主生成另外一段文字。

处理这些不同的义务,从模型角度来讲什么最重要?是特征抽取器的才能。尤其是深度学习盛行开来后,这一点更凸显出来。由于深度学习最大的优点是「端到端(end to end)」,当然这里不是指的从客户端到云端,意思是以前研发人员得思索设计抽取哪些特征,而端到端时代后,这些你完全不用管,把原始输入扔给好的特征抽取器,它本人会把有用的特征抽取出来。

身为资深 Bug 制造者和算法工程师,你如今需求做的事情就是:选择一个好的特征抽取器,选择一个好的特征抽取器,选择一个好的特征抽取器,喂给它大量的训练数据,设定好优化目的(loss function),告诉它你想让它干嘛…….. 然后你觉得你啥也不用干等结果就行了是吧?那你是我见过的整个宇宙中最悲观的人……. 你大量工夫其实是用在调参上…….。从这个过程可以看出,假如我们有个弱小的特征抽取器,那么中初级算法工程师沦为调参侠也就是个必然了,在 AutoML(自动那啥)盛行的年代,也许当前你想当调参侠而不得,李斯说的「吾欲与若复牵黄犬,俱出上蔡东门逐狡兔,岂可得乎!」请了解一下。所以请珍惜你半夜两点还在调整超参的日子吧,由于对于你来说有一个好音讯一个坏音讯,好音讯是:对于你来说能够这样辛劳的日子不多了!坏音讯是:对于你来说能够这样辛劳的日子不多了!!!那么怎样才能成为算法高手?你去设计一个更弱小的特征抽取器呀。

下面末尾分叙三大特征抽取器。

疆场老将 RNN:廉颇老矣,尚能饭否



RNN 模型我估计大家都熟习,就不详细引见了,模型结构参考上图,核心是每个输入对应隐层节点,而隐层节点之间构成了线性序列,信息由前向后在隐层之间逐渐向后传递。我们下面直接进入我想讲的内容。

为何 RNN 可以成为处理 NLP 成绩的主流特征抽取器

我们知道,RNN 自从引入 NLP 界后,很快就成为吸引眼球的明星模型,在 NLP 各种义务中被广泛运用。但是原始的 RNN 也存在成绩,它采取线性序列结构不断从前往后搜集输入信息,但这种线性序列结构在反向传播的时分存在优化困难成绩,由于反向传播途径太长,容易导致严重的梯度消逝或梯度爆炸成绩。为了处理这个成绩,后来引入了 LSTM 和 GRU 模型,经过添加中间形状信息直接向后传播,以此缓解梯度消逝成绩,获得了很好的效果,于是很快 LSTM 和 GRU 成为 RNN 的标准模型。其实图像范畴最早由 HighwayNet/Resnet 等导致模型革命的 skip connection 的原始思绪就是从 LSTM 的隐层传递机制自创来的。经过不断优化,后来 NLP 又从图像范畴自创并引入了 attention 机制(从这两个过程可以看到不同范畴的互相技术自创与促进作用),叠加网络把层深作深,以及引入 Encoder-Decoder 框架,这些技术停顿极大拓展了 RNN 的才能以及运用效果。下图展现的模型就是非常典型的运用 RNN 来处理 NLP 义务的通用框架技术大礼包,在更新的技术出现前,你可以在 NLP 各种范畴见到这个技术大礼包的身影。


上述内容简单引见了 RNN 在 NLP 范畴的大致技术演进过程。那么为什么 RNN 可以这么快在 NLP 盛行并且占据了主导地位呢?次要缘由还是由于 RNN 的结构自然适配处理 NLP 的成绩,NLP 的输入往往是个不定长的线性序列句子,而 RNN 本身结构就是个可以接纳不定长输入的由前向后停止信息线性传导的网络结构,而在 LSTM 引入三个门后,对于捕获长间隔特征也是非常有效的。所以 RNN 特别合适 NLP 这种线形序列运用场景,这是 RNN 为何在 NLP 界如此盛行的根本缘由。

RNN 在新时代面临的两个严重成绩

RNN 在 NLP 界不断红了很多年(2014-2018?),在 2018 年之前,大部分各个子范畴的 State of Art 的结果都是 RNN 获得的。但是最近一年来,眼看着 RNN 的首领群伦的地位正在被动摇,所谓各领风骚 3-5 年,看来网红模型也不例外。

那这又是由于什么呢?次要有两个缘由。

第一个缘由在于一些后起之秀新模型的崛起,比如经过特殊改造的 CNN 模型,以及最近特别盛行的 Transformer,这些后起之秀尤其是 Transformer 的运用效果相比 RNN 来说,目前看具有分明的优势。这是个次要缘由,老人假如干不过新人,又没有洗心革面自我革命的才能,自然要自觉或不自愿地加入历史舞台,这是自然规律。至于 RNN 才能偏弱的详细证据,本文后面会专门谈,这里不展开讲。当然,技术人员里的 RNN 保皇派们,这个群体规模应该还是相当大的,他们不会随便放弃曾经这么抢手过的流量明星的,所以也想了或者正在想一些改进方法,试图给 RNN 中途夭折。至于这些方法是什么,有没有作用,后面也陆续会谈。

另外一个严重妨碍 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 改造一下,提升它的并行计算才能呢?假如可以的话,效果如何呢?下面我们讨论一下这个成绩。

如何改造 RNN 使其具有并行计算才能?

下面说过,RNN 不能并行计算的症结所在,在于 T 时辰对 T-1 时辰计算结果的依赖,而这体如今隐层之间的全衔接网络上。既然症结在这里,那么要想处理成绩,也得在这个环节下手才行。在这个环节多做点什么事情可以添加 RNN 的并行计算才能呢?你可以想一想。

其实留给你的选项并不多,你可以有两个大的思绪来改进:一种是照旧保留恣意延续工夫步(T-1 到 T 时辰)之间的隐层衔接;而另外一种是部分地打断延续工夫步(T-1 到 T 时辰)之间的隐层衔接。

我们先来看第一种方法,如今我们的成绩转化成了:我们照旧要保留恣意延续工夫步(T-1 到 T 时辰)之间的隐层衔接,但是在这个前提下,我们还要可以做到并行计算,这怎样处理呢?由于只需保留延续两个工夫步的隐层衔接,则意味着要计算 T 时辰的隐层结果,就需求 T-1 时辰隐层结果先算完,这不又落入了序列依赖的圈套里了吗?嗯,的确是这样,但是为什么一定要在不同工夫步的输入之间并行呢?没有人说 RNN 的并行计算一定发生在不同工夫步上啊,你想想,隐层是不是也是包含很多神经元?那么在隐层神经元之间并行计算行吗?假如你要是还没了解这是什么意思,那请看下图。


下面的图只显示了各个工夫步的隐层节点,每个工夫步的隐层包含 3 个神经元,这是个俯视图,是从上往下看 RNN 的隐层节点的。另外,延续两个工夫步的隐层神经元之间照旧有衔接,上图没有画出来是为了看着简约一些。这下应该明白了吧,假设隐层神经元有 3 个,那么我们可以构成 3 路并行计算(红色箭头分隔开成了三路),而每一路由于照旧存在序列依赖成绩,所以每一路内照旧是串行的。大思绪应该明白了是吧?但是了解 RNN 结构的同窗会发现这样还遗留一个成绩:隐层神经元之间的衔接是全衔接,就是说 T 时辰某个隐层神经元与 T-1 时辰一切隐层神经元都有衔接,假如是这样,是无法做到在神经元之间并行计算的,你可以想想为什么,这个简单,我假设你有才能想明白。那么怎样办呢?很简单,T 时辰和 T-1 时辰的隐层神经元之间的衔接关系需求改造,从之前的全衔接,改形成对应地位的神经元(就是上图被红箭头分隔到同一行的神经元之间)有衔接,和其它神经元没有衔接。这样就可以处理这个成绩,在不同路的隐层神经元之间可以并行计算了。

第一种改造 RNN 并行计算才能的方法思绪大致如上所述,这种方法的代表就是论文「Simple Recurrent Units for Highly Parallelizable Recurrence」中提出的 SRU 方法,它最本质的改进是把隐层之间的神经元依赖由全衔接改成了哈达马乘积,这样 T 时辰隐层单元本来对 T-1 时辰一切隐层单元的依赖,改成了只是对 T-1 时辰对应单元的依赖,于是可以在隐层单元之间停止并行计算,但是搜集信息照旧是按照工夫序列来停止的。所以其并行性是在隐层单元之间发生的,而不是在不同工夫步之间发生的。

这其实是比较巧妙的一种方法,但是它的成绩在于其并行程度下限是有限的,并行程度取决于隐层神经元个数,而普通这个数值往往不会太大,再添加并行性曾经不太能够。另外每一路并行线路照旧需求序列计算,这也会拖慢全体速度。SRU 的测试速度为:在文本分类上和原始 CNN(Kim 2014)的速度相当,论文没有说 CNN 能否采取了并行训练方法。其它在复杂义务阅读了解及 MT 义务上只做了效果评价,没有和 CNN 停止速度比较,我估计这是有缘由的,由于复杂义务往往需求深层网络,其它的就不妄作猜测了。


第二种改进典型的思绪是:为了可以在不同工夫步输入之间停止并行计算,那么只要一种做法,那就是打断隐层之间的衔接,但是又不能全打断,由于这样基本就无法捕获组合特征了,所以独一能选的策略就是部分打断,比如每隔 2 个工夫步打断一次,但是间隔稍微远点的特征如何捕获呢?只能加深层深,经过层深来建立远间隔特征之间的联络。代表性模型比如上图展现的 Sliced RNN。我当初看到这个模型的时分,心里忍不住发出杠铃般的笑声,不由自主地走上前跟他打了个招呼:你好呀,CNN 模型,想不到你这个糙汉子有一天也会穿上粉色裙装,打扮成 RNN 的样子出如今我面前啊,哈哈。了解 CNN 模型的同窗看到我下面这句话估计会莞尔会心一笑:这不就是简化版本的 CNN 吗?不了解 CNN 的同窗建议看完后面 CNN 部分再回头来看看是不是这个意思。

那经过这种改造的 RNN 速度改进如何呢?论文给出了速度对比实验,归纳起来,SRNN 速度比 GRU 模型快 5 到 15 倍,嗯,效果不错,但是跟对比模型 DC-CNN 模型速度比较起来,比 CNN 模型照旧平均慢了大约 3 倍。这很正常但是又有点说不太过去,说正常是由于本来这就是把 RNN 改头换面成相似 CNN 的结构,而片段里照旧采取 RNN 序列模型,所以必然会拉慢速度,比 CNN 慢再正常不过了。说「说不过去」是指的是:既然本质上是 CNN,速度又比 CNN 慢,那么这么改的意义在哪里?为什么不直接用 CNN 呢?是不是?后面那位由于吃亏吃的少所以爱抬杠的同窗又会说了:也许人家效果特别好呢。嗯,从这个结构的作用机制上看,能够性不太大。你说论文实验部分证明了这一点呀,我以为实验部分对比实验做的不充分,需求补充除了 DC-CNN 外的其他 CNN 模型停止对比。当然这点纯属个人意见,别当真,由于我讲起话来的时分常常摇头晃脑,此时普通会有人惊奇地跟我反馈说:为什么你一讲话我就听到了水声?

下面罗列了两种大的改进 RNN 并行计算才能的思绪,我个人对于 RNN 的并行计算才能持悲观态度,次要由于 RNN 本质特性决议了我们能做的选择太少。无非就是选择打断还是不打断隐层衔接的成绩。假如选择打断,就会面临下面的成绩,你会发现它能够曾经不是 RNN 模型了,为了让它看上去还像是 RNN,所以在打断片段里照旧采取 RNN 结构,这样无疑会拉慢速度,所以这是个两难的选择,与其这样不如直接换成其它模型;假如我们选择不打断,貌似只能在隐层神经元之间停止并行,而这样做的缺陷是:一方面并行才能下限很低;另外一方面外面依然存在的序列依赖估计照旧是个成绩。这是为何悲观的缘由,次要是看不到大的希望。

偏师之将 CNN:刺激战场绝地求生


在一年多前,CNN 是自然言语处理中除了 RNN 外最常见的深度学习模型,这里引见下 CNN 特征抽取器,会比 RNN 说得详细些,次要思索到大家对它的熟习程度能够没有 RNN 那么高。

NLP 中早期的复古版 CNN 模型


最早将 CNN 引入 NLP 的是 Kim 在 2014 年做的工作,论文和网络结构参考上图。普通而言,输入的字或者词用 Word Embedding 的方式表达,这样本来一维的文本信息输入就转换成了二维的输入结构,假设输入 X 包含 n 个字符,而每个字符的 Word Embedding 的长度为 d,那么输入就是 d*n 的二维向量。

卷积层本质上是个特征抽取层,可以设定超参数 F 来指定卷积层包含多少个卷积核(Filter)。对于某个 Filter 来说,可以想象有一个 d*k 大小的移动窗口从输入矩阵的第一个字末尾不断往后移动,其中 k 是 Filter 指定的窗口大小,d 是 Word Embedding 长度。对于某个时辰的窗口,经过神经网络的非线性变换,将这个窗口内的输入值转换为某个特征值,随着窗口不断往后移动,这个 Filter 对应的特征值不断产生,构成这个 Filter 的特征向量。这就是卷积核抽取特征的过程。卷积层内每个 Filter 都如此操作,就构成了不同的特征序列。Pooling 层则对 Filter 的特征停止降维操作,构成最终的特征。普通在 Pooling 层之后衔接全联接层神经网络,构成最后的分类过程。

这就是最早运用在 NLP 范畴 CNN 模型的工作机制,用来处理 NLP 中的句子分类义务,看起来还是很简约的,之后陆续出现了在此基础上的改进模型。这些复古版 CNN 模型在一些义务上也能和当时复古版本的 RNN 模型效果相当,所以在 NLP 若干范畴也能野蛮生长,但是在更多的 NLP 范畴,还是处于被 RNN 模型压制到抑郁症早期的尴尬场面。那为什么在图像范畴打遍天下无敌手的 CNN,一旦跑到 NLP 的地盘,就被 RNN 这个地头蛇压制得无颜见图像范畴江东父老呢?这阐明这个版本的 CNN 还是有很多成绩的,其实最根本的症结所在还是老革命遇到了新成绩,次要是到了新环境没有针对新环境的特性做出针对性的改变,所以面临水土不服的成绩。

CNN 能在 RNN 纵横的各种 NLP 义务环境下生活上去吗?谜底即将揭晓。

CNN 的退化:物竞天择的模型斗兽场

下面我们先看看复古版 CNN 存在哪些成绩,然后看看我们的 NLP 专家们是如何改造 CNN,不断改到目前看上去还算效果不错的古代版本 CNN 的。

首先,我们先要明白一点:CNN 捕获到的是什么特征呢?从上述复古版本 CNN 卷积层的运作机制你大概看出来了,关键在于卷积核覆盖的那个滑动窗口,CNN 能捕获到的特征基本都体如今这个滑动窗口里了。大小为 k 的滑动窗口悄然的穿过句子的一个个单词,荡起阵阵涟漪,那么它捕获了什么? 其实它捕获到的是单词的 k-gram 片段信息,这些 k-gram 片段就是 CNN 捕获到的特征,k 的大小决议了能捕获多远间隔的特征。


说完这个,我们来看 Kim 版 CNN 的第一个成绩:它只要一个卷积层。表面看上去好像是深度不够的成绩是吧?我会反问你说:为什么要把 CNN 作深呢?其实把深度做起来是手腕,不是目的。只要一个卷积层带来的成绩是:对于远间隔特征,单层 CNN 是无法捕获到的,假如滑动窗口 k 最大为 2,而假如有个远间隔特征间隔是 5,那么无论上多少个卷积核,都无法覆盖到长度为 5 的间隔的输入,所以它是无法捕获长间隔特征的。


那么怎样才能捕获到长间隔的特征呢?有两种典型的改进方法:一种是假设我们照旧用单个卷积层,滑动窗口大小 k 假设为 3,就是只接收三个输入单词,但是我们想捕获间隔为 5 的特征,怎样做才行?显然,假如卷积核窗口照旧覆盖延续区域,这一定是完不成义务的。提示一下:你玩过跳一跳是吧?能采取相似策略吗?对,你可以跳着覆盖呀,是吧?这就是 Dilated 卷积的基本思想,的确也是一种处理方法。


第二种方法是把深度做起来。第一层卷积层,假设滑动窗口大小 k 是 3,假如再往上叠一层卷积层,假设滑动窗口大小也是 3,但是第二层窗口覆盖的是第一层窗口的输入特征,所以它其实能覆盖输入的间隔达到了 5。假如继续往上叠加卷积层,可以继续增大卷积核覆盖输入的长度。

下面是两种典型的处理 CNN 远间隔特征捕获才能的方案,Dilated CNN 偏技巧一些,而且叠加卷积层时超参如何设置有些学问,由于延续跳接能够会错过一些特征组合,所以需求精心调理参数搭配,保证一切能够组合都被覆盖到。相对而言,把 CNN 作深是主流发展方向。下面这个道理好了解,其实自从 CNN 一出现,人们就想各种办法试图把 CNN 的深度做起来,但是理想往往是无情的,发现怎样折腾,CNN 做 NLP 成绩就是做不深,做到 2 到 3 层卷积层就做不上去了,网络更深对义务效果没什么协助(请不要拿 CharCNN 来做反例,后来研讨表明运用单词的 2 层 CNN 效果超过 CharCNN)。目前看来,还是深层网络参数优化手腕不足导致的这个成绩,而不是层深没有用。后来 Resnet 等图像范畴的新技术出现后,很自然地,人们会思索把 Skip Connection 及各种 Norm 等参数优化技术引入,这才能渐渐把 CNN 的网络深度做起来。

下面说的是 Kim 版本 CNN 的第一个成绩,无法捕获远间隔特征的成绩,以及后面科研人员提出的次要处理方案。回头看 Kim 版本 CNN 还有一个成绩,就是那个 Max Pooling 层,这块其实与 CNN 能否保持输入句子中单词的地位信息有关系。首先我想问个成绩:RNN 由于是线性序列结构,所以很自然它自然就会把地位信息编码出来;那么,CNN 能否可以保留原始输入的相对地位信息呢?我们后面说过对于 NLP 成绩来说,地位信息是很有用的。其实 CNN 的卷积核是能保留特征之间的相对地位的,道理很简单,滑动窗口从左到右滑动,捕获到的特征也是如此顺序陈列,所以它在结构上曾经记录了相对地位信息了。但是假如卷积层后面立刻接上 Pooling 层的话,Max Pooling 的操作逻辑是:从一个卷积核获得的特征向量里只选中并保留最强的那一个特征,所以到了 Pooling 层,地位信息就被扔掉了,这在 NLP 里其实是有信息损失的。所以在 NLP 范畴里,目前 CNN 的一个发展趋向是丢弃 Pooling 层,靠全卷积层来叠加网络深度,这背后是有缘由的(当然图像范畴也是这个趋向)。


上图展现了在 NLP 范畴可以发挥身手的摩登 CNN 的主体结构,通常由 1-D 卷积层来叠加深度,运用 Skip Connection 来辅助优化,也可以引入 Dilated CNN 等手腕。比如 ConvS2S 主体就是上图所示结构,Encoder 包含 15 个卷积层,卷积核 kernel size=3,覆盖输入长度为 25。当然对于 ConvS2S 来说,卷积核里引入 GLU 门控非线性函数也有重要协助,限于篇幅,这里不展开说了,GLU 貌似是 NLP 里 CNN 模型必备的构件,值得掌握。再比如 TCN(论文:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling),集成了几项技术:应用 Dilated CNN 拓展单层卷积层的输入覆盖长度,应用全卷积层堆叠层深,运用 Skip Connection 辅助优化,引入 Casual CNN 让网络结构看不到 T 工夫步后的数据。不过 TCN 的实验做得有两个分明成绩:一个成绩是义务除了言语模型外都不是典型的 NLP 义务,而是合成数据义务,所以论文结论很难直接说就合适 NLP 范畴;另外一点,它用来停止效果比较的对比方法,没有用当时效果很好的模型来对比,比较基准低。所以 TCN 的模型效果压服力不太够。其实它该引入的元素也基本引入了,实验压服力不够,我觉得能够是它命中缺 GLU 吧。

除此外,简单谈一下 CNN 的地位编码成绩和并行计算才能成绩。下面说了,CNN 的卷积层其实是保留了相对地位信息的,只需你在设计模型的时分别手贱,中间层不要随手瞎插入 Pooling 层,成绩就不大,不专门在输入部分对 position 停止编码也行。但是也可以相似 ConvS2S 那样,专门在输入部分给每个单词添加一个 position embedding,将单词的 position embedding 和词向量 embedding 叠加起来构成单词输入,这样也可以,也是常规做法。

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

以上内容引见了复古版 CNN 是如何在 NLP 修罗场一步步经过自我退化生活到明天的。CNN 的退化方向,假如千言万语一句话归纳的话,那就是:想方设法把 CNN 的深度做起来,随着深度的添加,很多看似有关的成绩就随之处理了。就跟我们国家最近 40 年的主旋律是发展经济一样,经济发展好了,很多成绩就不是成绩了。最近几年之所以大家感到各方面很困难,症结就在于经济不行了,所以很多成绩无法经过经济带动来处理,于是看似各种花样的困难就冒出来,这是一个道理。

那么引见了这么多,摩登版 CNN 效果如何呢?与 RNN 及 Transforme 比起来怎样?别焦急,后面会专门谈这个成绩。

白衣骑士 Transformer:盖世英雄站上舞台



Transformer 是谷歌在 17 年做机器翻译义务的「Attention is all you need」的论文中提出的,惹起了相当大的反响。每一位从事 NLP 研发的同仁都应该透彻搞明白 Transformer,它的重要性毫无疑问,尤其是你在看完我这篇文章之后,我置信你的紧迫感会更迫切,我就是这么一位擅长制造焦虑的能手。不过这里没打算重点引见它,想要入门 Transformer 的可以参考以下三篇文章:一个是 Jay Alammar 可视化地引见 Transformer 的博客文章 The Illustrated Transformer,非常容易了解整个机制,建议先从这篇看起,这是中文翻译版本;第二篇是 Calvo 的博客:Dissecting BERT Part 1: The Encoder,虽然说是解析 Bert,但是由于 Bert 的 Encoder 就是 Transformer,所以其实它是在解析 Transformer,外面举的例子很好;再然后可以进阶一下,参考哈佛大学 NLP 研讨组写的「The Annotated Transformer.」,代码原理左右开弓,讲得也很清楚。

下面只说跟本文主题有关的内容。


这里要澄清一下,本文所说的 Transformer 特征抽取器并非原始论文所指。我们知道,「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 原始论文不断重点在说 Self Attention,但是目前来看,能让 Transformer 效果好的,不只仅是 Self attention,这个 Block 里一切元素,包括 Multi-head self attention,Skip connection,LayerNorm,FF 一同在发挥作用。为什么这么说?你看到后面会体会到这一点。

我们针对 NLP 义务的特点来说下 Transformer 的对应处理方案。首先,自然言语普通是个不定长的句子,那么这个不定长成绩怎样处理呢?Transformer 做法跟 CNN 是相似的,普通设定输入的最大长度,假如句子没那么长,则用 Padding 填充,这样整个模型输入最少看起来是定长的了。另外,NLP 句子中单词之间的相对地位是包含很多信息的,下面提过,RNN 由于结构就是线性序列的,所以自然会将地位信息编码进模型;而 CNN 的卷积层其实也是保留了地位相对信息的,所以什么也不做成绩也不大。但是对于 Transformer 来说,为了可以保留输入句子单词之间的相对地位信息,必需要做点什么。为啥它必需要做点什么呢?由于输入的第一层网络是 Muli-head self attention 层,我们知道,Self attention 会让当前输入单词和句子中恣意单词发生关系,然后集成到一个 embedding 向量里,但是当一切信息到了 embedding 后,地位信息并没有被编码出来。所以,Transformer 不像 RNN 或 CNN,必须明白的在输入端将 Positon 信息编码,Transformer 是用地位函数来停止地位编码的,而 Bert 等模型则给每个单词一个 Position embedding,将单词 embedding 和单词对应的 position embedding 加起来构成单词的输入 embedding,相似上文讲的 ConvS2S 的做法。而关于 NLP 句子中长间隔依赖特征的成绩,Self attention 自然就能处理这个成绩,由于在集成信息的时分,当前单词和句子中恣意单词都发生了联络,所以一步到位就把这个事情做掉了。不像 RNN 需求经过隐层节点序列往后传,也不像 CNN 需求经过添加网络深度来捕获远间隔特征,Transformer 在这点上分明方案是相对简单直观的。说这些是为了单独引见下 Transformer 是怎样处理 NLP 义务几个关键点的。

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

(上篇)

雷锋网 AI 科技回复经作者答应转载。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评8

昊乐23 2019-4-14 08:40:39 显示全部楼层
好文章
回复

使用道具 举报

啊优 2019-4-14 08:41:57 显示全部楼层
分享了
回复

使用道具 举报

唯嫣lhm 2019-4-14 08:50:39 显示全部楼层
分享了
回复

使用道具 举报

82506102 2019-4-14 08:56:53 显示全部楼层
分享了
回复

使用道具 举报

eyeofnature 2019-4-14 09:05:38 显示全部楼层
分享了
回复

使用道具 举报

螺陀 2019-4-14 09:15:05 显示全部楼层
分享了
回复

使用道具 举报

唐角263 2019-4-14 17:31:52 显示全部楼层
高手云集 果断围观
回复

使用道具 举报

我这个人啊 2019-4-15 07:51:11 显示全部楼层
支持,楼下的跟上哈~
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies