这个算是在课程学习之外的探索,不过希望能尽快用到项目实践中。在文章里会引用较多的博客,文末会进行reference。
搜索Transformer机制,会发现高分结果基本上都源于一篇论文Jay Alammar的《The Illustrated Transformer》(图解Transformer),提到最多的Attention是Google的《Attention Is All You Need》。
- 对于Transformer的运行机制了解即可,所以会基于这篇论文来学习Transformer,结合《Sklearn+Tensorflow》中Attention注意力机制一章完成基本的概念学习;
- 找一个基于Transformer的项目练手
3.Transformer的一些笔记
本节内容学习自大佬张俊林的《放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较》,当时也是看到这篇文章才想看看Transformer
上一节对Transformer有了一个简单的认识,但是太耗脑细胞了,今天把这篇旧文拿出来复习一下,只是读书笔记。
开篇就是,在NLP领域CNN改改还能用,RNN迟早要被放弃,Transformer将是未来的重点。然后就是一顿论证,知道大概意思就行了,RNN改造之后成为SRNN具备并行计算的能力,SRNN速度比GRU模型快5到15倍;CNN改造之后增加深度。
了解Transformer的三篇论文:
- Jay Alammar可视化地介绍Transformer的博客文章The Illustrated Transformer ,非常容易理解整个机制,建议先从这篇看起,有中文译本https://zhuanlan.zhihu.com/p/54356280;
- Calvo的博客:Dissecting BERT Part 1: The Encoder ,尽管说是解析Bert,但是因为Bert的Encoder就是Transformer,所以其实它是在解析Transformer,里面举的例子很好;
- 哈佛大学NLP研究组写的“The Annotated Transformer. ”,代码原理双管齐下,讲得也很清楚。
进一步介绍Transformer的机制,作者认为Transformer核心并不仅仅是Self Attention,还有它自身的Block中的所有元素Multi-head self attention,Skip connection,LayerNorm,FeedForward。
针对NLP任务的特点来说下Transformer的对应解决方案
- 如何解决自然语言不定长问题?
使用Padding填充,和之前Seq2seq类似,找到最长的那句话,其他句子用空来填补到那么长。 - 如何保留输入句子中词与词之间的位置相对信息?
Transformer不像RNN或CNN,必须明确的在输入端将Positon信息编码,Transformer是用位置函数来进行位置编码的,而Bert等模型则给每个单词一个Position embedding,将单词embedding和单词对应的position embedding加起来形成单词的输入embedding。 - 如何解决NLP句子中长距离依赖特征的问题?
Self attention天然就能解决这个问题,因为在集成信息的时候,当前单词和句子中任意单词都发生了联系,所以一步到位就把这个事情做掉了。不像RNN需要通过隐层节点序列往后传,也不像CNN需要通过增加网络深度来捕获远距离特征,Transformer在这点上明显方案是相对简单直观的。
Transformer的两个版本
Transformer base和Transformer Big。两者结构其实是一样的。主要区别是包含的Transformer Block数量不同,Transformer base包含12个Block叠加,而Transformer Big则扩张一倍,包含24个Block。
无疑Transformer Big在网络深度,参数量以及计算量相对Transformer base翻倍,所以是相对重的一个模型,但是效果也最好。
CNN/RNN/Transformer作为特征抽取器的比较
在句法特征抽取方面,文献较少,之前的对比是CNN要优于RNN。
作者从四个方面进行了对比
-
语义特征提取能力;
从语义特征提取能力来说,目前实验支持如下结论:Transformer在这方面的能力非常显著地超过RNN和CNN(在考察语义类能力的任务WSD中,Transformer超过RNN和CNN大约4-8个绝对百分点),RNN和CNN两者能力差不太多。
-
长距离特征捕获能力;
在长距离特征捕获能力方面,目前在特定的长距离特征捕获能力测试任务中(主语-谓语一致性检测,比如we……..are…),实验支持如下结论:原生CNN特征抽取器在这方面极为显著地弱于RNN和Transformer,Transformer微弱优于RNN模型(尤其在主语谓语距离小于13时),能力由强到弱排序为Transformer>RNN>>CNN; 但在比较远的距离上(主语谓语距离大于13),RNN微弱优于Transformer,所以综合看,可以认为Transformer和RNN在这方面能力差不太多,而CNN则显著弱于前两者。
CNN弱于RNN的原因就是之前所述,卷积神经网络是依靠堆积深度来实现覆盖更长的输入长度,所以在对长距离的处理上会弱于RNN。
对于Transformer来说,Multi-head attention的head数量严重影响NLP任务中Long-range特征捕获能力:结论是head越多越有利于捕获long-range特征。
-
任务综合特征抽取能力;
使用机器翻译MT作为综合任务,BLEU作为评判指标。Transformer综合能力要明显强于RNN和CNN(你要知道,技术发展到现在阶段,BLEU绝对值提升1个点是很难的事情),而RNN和CNN看上去表现基本相当,貌似CNN表现略好一些。
并行计算能力及运行效率
RNN在并行计算方面天生缺陷,Transformer优于CNN。
所以,综上可以看到,Transformer在NLP领域是优于RNN和CNN的,而RNN和CNN由于自身结构特点,在不同的领域具有各自的优势。
向Transformer靠拢
就是对CNN和RNN进行各种魔改,Transformer Block其实不是只有一个构件,而是由multi-head attention/skip connection/Layer Norm/Feed forward network等几个构件组成的一个小系统,如果把RNN或者CNN塞到Transformer Block里会发生什么事情呢?这就是寄居蟹策略的基本思路。
将CNN和RNN替换掉Block中的Multi-head attention。有论文这么搞了之后,性能也有不同幅度的提升。但是是和Transformer性能还是存在一些差距。