想要洞悉某个神经网络结构,一个好的步骤是:“从整体上看看每一部分的作用,再一块一块单独细致的研究,最后举一反三”。这篇文章,就是从整体上着眼,先把Transformer-XL的整个结构的框架勾勒出来,看看每一部分对数据起到的作用。
约定
- 为简化问题,本文统一使用“A B C D E F G H I J K L M N O P Q R S T U V W X Y Z”这样一个语料数据来讨论问题。其中每一个字母可以当做是一个英文单词、一个中文词语或者一个汉字等Token。
- 本文提到的“RNN”指:RNN以及所有RNN变种。
- 为了关注结构本身,数据不序列化、不预处理、不增加开始符和结束符。
从RNN和Vanilla Transformer到Transformer-XL
RNN和Vanilla Transformer的具体实现原理就不展开讨论了。我尝试用更加生动的方式讲一讲思路层面的递进。然后重点放在后面章节的Transformer-XL的解析。
语言模型其实非常类似人类的阅读。而这三种语言模型,分别对应了一种“阅读习惯”。
- RNN:一个字一个字阅读,每读一个字都把这个新字融入记忆,然后预测下一个字。如下图所示,我们看到从起始字符开始,我们在不停维护一份Mem(隐层状态)用来刻画自己已经读到的内容,然后用当前字符和Mem作为依据,预测下一个字,并更新Mem。
- Vanilla Transformer:清空大脑,一次阅读一大段文字,预测下一个字。如下图所示,对于Transformer来说,他有能力一次性阅读一大段的字符,然后预测下一个字符。但Transformer没有任何记忆能力。也就是每一次阅读,都是一个新的开始。
- Transformer-XL:一段一段阅读,把每段的内容更新到记忆中,预测下一个字。Transformer-XL让我想到了初中时候看过的一个“速读”教材(虽然到最后都没练会)。这种方式就是整句整句阅读,串起来对全文有一个了解。
看图就明显能感觉到,Transformer-XL思路上是RNN和Vanilla Transformer的融合。也就是把RNN的记忆单元及递归训练和Transformer的一次阅读一段的能力结合到了一起。
思路上理清楚之后,我们马上就进入今天的主题,Transformer-XL训练阶段流程的详细解析。
Batch化数据
对于大多数NLP任务来说,标注数据是极其缺少且珍贵的。但这里不包括语言模型,语言模型的训练只需要无监督数据即可,也就是一部小说、网上爬下来的海量文字等,都可以作为训练数据。这也就是NLP任务中,预训练可能性的基石。
我们还是使用“ABC……”这个语料来简化问题。设Batch size为2,Target len为3。
如上图,首先按照 batchsize 分成多行,这样每一行从开始到结尾,在原文中都是连续的。然后每一行都按照 tgt_len 分成多个batch。最后将数据错开一位,生成X对应的y。X作为输入进入网络计算;y作为目标,用来计算Loss。这样数据就处理好,可以输入到训练网络用于训练了。
从数据到Loss
已经成Batch的训练数据按照顺序进入训练网络。宏观上的模块顺序如下图所示。
①:上一个Batch数据训练之后得到的新的记忆单元数据,是当前Batch的输入。
②:Vanilla Transformer中采用了“绝对位置编码”,这是由于对于Vanilla Transformer每一次阅读都是一次全新的阅读,绝对位置编码就给与了足够的位置信息。
但是Transformer-XL中,上一个章节是下一个章节的上文,若是还采用绝对位置编码,就给与了不同章节第一个位置字符同样的编码,这是不能接受的。所以Transformer-XL中采用了“相对位置编码”。这里我们不展开来说,后面再单独写一篇文章来剖析相对位置编码是如何起作用的。对于相对位置编码我们暂时只需要知道:1. 相对位置编码是用来取代Vanilla Transformer中绝对位置编码的。2.为位置不敏感的Attention网络提供了位置信息。
③:Embedding是NLP任务的常规操作了,如果有兴趣可以看看我19年初写的:
小狼:词嵌入基本理念及组织代码的方法论zhuanlan.zhihu.com
这里,需要我们稍微注意的是,Embedding层和Logit Output层的矩阵是参数共享的,使用了同一个矩阵。
④:Attention Layer是Transformer的计算核心,和Vanilla Transformer中的Self-Attention大部分相同。但本文还是专注于整体,详细解析另外单独写文章剖析。但想要理解数据是如何在Transformer-XL中起作用,Mask的运用是无论如何都没办法绕过的,我们先在宏观上对Mask的作用有一定的了解。还是先上图:
在Self-Attention中,使用Q矩阵来计算每个向量的权重,也就是俗称的Attention Score。而我们想要在需要的时候屏蔽掉某些信息,就是在Attention Score进行Softmax计算前乘一个Mask值。例如上图,在预测C的时候,我们肯定不能使用C的信息,因为那样就是作弊,训练就失效了。所以在C的计算结果上,我们乘一个很小很小的负值,在做指数计算时,就约等于0了。
在传统Transformer的Decoder Layer中也采用了类似的Mask机制,详细公式和代码在后续文章中在说吧。
⑤:最后,在经历了N个Attention Layer和最终的逻辑层计算之后,我们终于可以计算出Loss了,也就是Softmax加交叉熵的组合。
至此,我们已经得到了Loss,就可以通过优化器对Loss反向传播来训练模型了。
小结:
这篇文章旨在宏观上画出Transformer-XL训练的轮廓,相信很多底子好但没接触过Transformer-XL的朋友已经足够去着手自己研究学习了。后续我还会继续努力,对一些模块内部细节进行讨论。
感谢您的阅读,欢迎各种批评指正!
参考:
https://ai.googleblog.com/2019/01/transformer-xl-unleashing-potential-of.html
https://github.com/kimiyoung/transformer-xl
(标题背景图来源于网络,侵删)