您现在的位置是:首页 >技术杂谈 >预训练模型之BERT、Transformer-XL、XL-Net等网站首页技术杂谈
预训练模型之BERT、Transformer-XL、XL-Net等
文章目录
预训练模型(Pre-trained Models, PTMs)前置知识
一、语言模型(Language Modeling,LM)的概念
quad
标准定义:对于语言序列
w
1
,
w
2
,
.
.
.
,
w
n
w_1,w_2,...,w_n
w1,w2,...,wn,语言模型就是计算该序列的概率,即
P
(
w
1
,
w
2
,
.
.
.
,
w
n
)
P(w_1,w_2,...,w_n)
P(w1,w2,...,wn)。
quad
从机器学习的角度来看:语言模型是对语句的概率分布的建模。
quad
通俗解释:判断一个语言序列是否是正常语句,即是否是人话,例如
P
(
I
a
m
L
i
g
h
t
)
>
P
(
L
i
g
h
t
a
m
I
)
P(I am Light)>P(Light am I)
P(I am Light)>P(Light am I) 。
quad
计算
P
(
w
1
,
w
2
,
.
.
.
,
w
n
)
P(w_1,w_2,...,w_n)
P(w1,w2,...,wn)时,首先由链式法则可以得到:
quad
然后我们一般采用极大似然估计来计算每个词出现的条件概率
P
(
w
i
∣
w
1
,
.
.
.
,
w
i
−
1
)
P(w_i|w_1,...,w_{i-1})
P(wi∣w1,...,wi−1),但是对于任意长的自然语言语句,直接计算
P
(
w
i
∣
w
1
,
.
.
.
,
w
i
−
1
)
P(w_i|w_1,...,w_{i-1})
P(wi∣w1,...,wi−1)显然不现实。因此为了解决这个问题,N-gram模型应运而生。
quad
N-gram模型(N元模型)是语言模型的一种。 它为语言模型引入马尔可夫假设(Markov assumption),即假设当前词出现的概率只依赖于前 n-1 个词,这样就可以得到:
quad
根据上式,定义N-gram模型如下:
quad
N-gram模型优缺点:
-
优点:(1) 采用极大似然估计,参数易训练;(2) 完全包含了前 n-1 个词的全部信息;(3) 可解释性强,直观易理解。
-
缺点:(1) 缺乏长期依赖,只能建模到前 n-1 个词;(2) 随着 n 的增大,参数空间呈指数增长;(3) 数据稀疏,难免会出现OOV(Out Of Vocabulary)的问题;(4) 单纯的基于统计频次,泛化能力差。
quad 总的来讲,语言模型就是基于朴素贝叶斯(naïve Bayesian)的一个概率模型,目标是求出在给定一个条件(序列)下预测下一个词出现的概率,并找出概率最大的那个词: c ∗ = a r g m a x P ( c ) ∏ i = 1 n P ( a i ∣ c ) c^*=argmax{P(c)prod_{i=1}^n{P(a_i|c)}} c∗=argmaxP(c)∏i=1nP(ai∣c)。
quad 获取语言模型的概率分布是我们的目标,用N-gram语言模型建模也好,用深度学习语言模型建模也罢,都只是达到这一目标的一种途径。
参考:深入理解语言模型 Language Model。侵删。
二、NLP中预训练模型PTMs分类
quad PTMs按照任务类型可分为2大类:监督学习 和 无监督学习/自监督学习。
quad 预训练技术最早被应用于计算机视觉领域,自2015年ResNet出现后开始在视觉领域被广泛应用(因为使用残差连接缓解了堆叠太多层带来的梯度消失和梯度爆炸问题。预训练于ImageNet数据集)。受此启发,NLP领域才开始探索监督预训练,所以NLP领域预训练的方法最开始都是属于“监督学习”,最有代表的作品是 CoVE。
quad 但虽然 CoVE 取得了不错的成绩,但要想在 NLP 领域标注一个像 ImageNet 的数据集几乎不太可能。这是因为标注文本数据比图像要复杂得多。由于 NLP 领域有大量的无标注文本,所以使用无标签数据自监督学习就成了NLP预训练领域最好的选择。因此从那至今,NLP领域的PTMs大都属于 自监督学习。
quad NLP-PTMs在自监督学习中也可以被分为两种类型:基于上下文(Context Based)和基于对比(Contrastive Based)。
(1)基于上下文(Context Based)
quad
基于上下文的PTMs,主要基于数据本身的上下文信息构造辅助任务,在NLP中我们通常引入语言模型作为训练目标。PTMs中的语言模型主要分为三大类:
-
Auto-regressive语言模型(LM): 自回归语言模型指的是依据前面(或后面)出现的单词来预测当前时刻的单词,可以公式化如下:
可以看出它是标准的语言模型LM联合概率的无偏估计,所以它被称为 LM,代表有单向自回归模型(ELMo, GPT,XL-Net等)和双向自回归模型(XL-Net)。- 缺点:单向自回归模型只能利用单向语义而不能同时利用上下文信息。双向自回归模型没有这一缺点,XL-Net就是一种双向自回归模型可用于解决这一点。
- 优点:自回归模型对生成模型友好,天然符合生成式任务的生成过程。这也是为什么 GPT 能够编故事的原因。
-
Auto-encoder语言模型(DAE-LM): 通过上下文信息来预测被mask的单词,本质为降噪自编码器,所以统称为DAE。代表有Word2Vec(CBOW) ,BERT , RoBERTa等。它可以公式化如下,如果当前token被预测,则 m t = 1 m_t=1 mt=1,否则 m t = 0 m_t=0 mt=0, x ~ widetilde{x} x 为原始文本被替换后的输入:
- 优点:能够很好的编码上下文语义信息(即考虑句子的双向信息), 在自然语言理解相关的下游任务上表现突出。
- 缺点:- 引入MASK间独立性假设,这样做属于语言模型联合概率的有偏估计,没有考虑MASK token之间的相关性(如BERT中没有对被遮掩(Mask)的 token 之间的关系进行学习);
- 预训练时的「MASK」噪声在finetune阶段不会出现,导致预训练数据与微调阶段数据不一致问题;
- BERT是自编码语言模型的一个典型代表,但其采用的MLM策略和Transformer-Encoder结构,导致其不适合直接处理生成任务。为了解决这一问题,也可采用基于Seq2Seq MLM方法,比如MASS:encoder部分采取masked策略,而decoder部分以自回归的方式预测encoder部分被mask的token。
-
排列语言模型(Permuted Language Modeling,PLM):
- 排列语言模型(Permuted Language Model,PLM)综合了LM和DAE-LM两者的优点。严格来讲,PLM和LM是标准的自回归语言模型(注:PLM是一种广义的自回归方法[14]),而MLM不是一个标准的语言模型,其引入独立性假设,隐式地学习预测token(mask部分本身的强相关性)之间的关系。如果衡量序列中被建模的依赖关系的数量,标准的自回归语言模型可以达到上界,不依赖于任何独立假设。LM和PLM能够通过自回归方式来显式地学习预测token之间的关系。然而,LM无法对双向上下文进行表征,借鉴 NADE[32]的思想,PLM将这种传统的自回归语言模型(LM)进行推广,将顺序拆解变为随机拆解(从左至右分解),产生上下文相关的双向特征表示。
- PLM最为典型的代表就是XLNet[14],这是对标准语言模型的一个复兴[33]:提出一个框架来连接标准语言模型建模方法和预训练方法。
- 一个关键问题:为什么PLM可以实现双向上下文的建模?PLM的本质就是语言模型联合概率的多种分解机制的体现,其将LM的顺序拆解推广到随机拆解。PLM没有改变原始文本序列的自然位置,只是定义了token预测的顺序。PLM只是针对语言模型建模不同排列下的因式分解排列,并不是词的位置信息的重新排列。
quad
对基于上述三类语言模型的PTMs进行总结:
(2)基于对比(Contrastive Based)
quad
不同于Context Based主要基于数据本身的上下文信息构造辅助任利用,Contrastive Based主要利用样本间的约束信息构造辅助任务,这类方法也是 Contrastive learning(CTL)。CTL假设观察到的文本对(正样本)在语义上比随机采样的文本(负样本)更相似。CTL 背后的原理是「在对比中学习」。相较于语言建模,CTL 的计算复杂度更低,因而在预训练中是理想的替代训练标准。主要分为以下四类,具体参考NLP算法面试必备!PTMs:NLP预训练模型的全面总结:
- Deep InfoMax (DIM)
- Replaced Token Detection (RTD)
- Next Sentence Prediction (NSP)
- Sentence Order Prediction (SOP)
quad
总结如下:
最后,对PTMs的架构设计进行展望:
- 对于PTMs,Transformer 已经被证实是一个高效的架构。然而 Transformer 最大的局限在于其计算复杂度(输入序列长度的平方倍)。受限于 GPU 显存大小,目前大多数 PTM 无法处理超过 512 个 token 的序列长度。打破这一限制需要改进 Transformer 的结构设计,例如 Transformer-XL。
- 设计合适的模型架构来适合生成任务。 例如,BERT采用的MLM策略和Transformer-Encoder结构,导致其不适合直接处理生成任务。而XL-Net有效解决了这一点。
二、两种预训练范式:feature-based & fine-tuning
- feature-based:代表作如EMLo,想想在17年之前,Transformer没出的时候,大家最常解决NLP任务的方法就是用别人训练好的词向量作为embedding,然后后面接全新初始化的RNN/LSTM/CNN等网络结构,也就是预训练只提供了feature-based的embedding。
- fine-tunning:代表作如GPT,用于下游任务时,不仅保留了输入的embedding,Transformer里面的参数(如attention层、全连接层)也同样可以保留,在fine-tuning的时候只需在原来的Transfomer上加一些简单的层,就可以应用于具体的下游任务。这也是目前主流的pretrain范式。
XLNet 的提出是为了解决 BERT 中存在的两个问题[20]:1)BERT 认为 Mask 的单词之间是独立的;2)BERT 使用了实际不存在的 [MASK] 符号,这会导致训练与微调出现差异。因此 XLNet 基于排列语言建模(PLM)提出了一个自回归的方法,并引入了双向自注意力机制和 Transformer-XL 实现模型。
MASS 把 BERT 推广到生成任务[21],并设计统一了 BERT 和传统单向语言模型框架 BERT+LM,使用 BERT 作为编码器,使用标准单向语言模型作为解码器。UniLM 进一步将双向语言模型、单向语言模型、Seq2Seq 语言模型结合进行预训练[22]。
参考:【NLP】预训练模型综述、万字解读:预训练模型最新综述、NLP算法面试必备!PTMs:NLP预训练模型的全面总结。侵删。
BERT
quad
Paper:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》【NAACL’2019】
quad
Code:https://github.com/google-research/bert
quad 在介绍Transformer-XL系列工作之前,让我们先来回顾下BERT。BERT是NLP预训练领域一篇里程碑式的论文,在很多地方可以找到它的讲解,因此我们这里只对它的核心进行回顾和记录。
1)核心理解一:Bidirectional 架构。
quad BERT的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder,这句话包含两点:
- BERT就是一个Transformer encoder。
- BERT就是一个现成的Transformer encoder架构。也就是说,在模型架构上,BERT并没有创新,这点与GPT一样都是用的现成的模型结构。但BERT与GPT有以下区别:1)BERT基于Transformer encoder,GPT基于Transformer decoder;2)BERT的语料库更大,模型规模也更加庞大;3)二者Pretrain方法不同。
- BERT是双向的。
- 因为以往的预训练语言模型都是单向的,这样只能捕捉到单向语义信息,而不能捕捉上下文信息。BERT的模型结构如最左图。GPT基于Transformer decoder所以是单向的;ELMo虽然虽然把LSTM的正向向量和反向向量拼接在一起,但由于只是拼接,并没有发生交互,所以并不是真正的双向。而BERT是基于Transformer encoder,所以可以实现真正的双向编码。
- 因为以往的预训练语言模型都是单向的,这样只能捕捉到单向语义信息,而不能捕捉上下文信息。BERT的模型结构如最左图。GPT基于Transformer decoder所以是单向的;ELMo虽然虽然把LSTM的正向向量和反向向量拼接在一起,但由于只是拼接,并没有发生交互,所以并不是真正的双向。而BERT是基于Transformer encoder,所以可以实现真正的双向编码。
2)核心理解二:BERT的主要创新之Pretrain方法。
quad BERT的创新性全部位于预训练方法中,即在预训练过程中引入了两个任务:Masked Language Model(MLM)+Next Sentence Prediction(NSP)。BERT也遵循fine-tuning范式,它的架构如下图。
- Masked Language Model(MLM)
- 在训练过程中作者随机mask 15%的token,而不是把像cbow一样把每个词都预测一遍。最终的损失函数只计算被mask掉那个token。
- 因为在实际预测时是碰不到这个[MASK]标记的,为了缓解这个问题:在随机mask的时候10%的单词会被替代成其他单词,10%的单词不替换,剩下80%才被替换为[MASK]。
- Next Sentence Prediction(NSP)
- 因为涉及到Question Answering (QA) 和 Natural Language Inference (NLI)之类的任务,增加了Next Sentence Prediction预训练任务,目的是让模型理解两个句子之间的联系。与Masked Language Model任务相比,Next Sentence Prediction更简单些,训练的输入是句子A和B,B有一半的几率是A的下一句,输入这两个句子,BERT模型预测B是不是A的下一句。
- 由于注意力计算开销是输入序列长度的平方,较长的序列会影响训练速度,为了加快实验中的预训练速度,所以90%的steps都用序列长度为128进行预训练,余下10%的steps预训练为512长度的输入。
- fine-tune下游任务
- MNLI:Multi-Genre Natural Language Inference
- NER:Named Entity Recognition
- …
3)核心理解三:DAE与Masked Language Model联系
- BERT模型基于DAE(Denoising AutoEncoder,去燥自编码器)的,这部分在BERT中被称为Masked Language Model (MLM)。
- MLM并不是严格意义上的语言模型,它仅仅是训练语言模型的一种方式。BERT随机把一些单词通过MASk标签来代替,并接着去预测被MASk的这个单词,过程其实就是DAE的过程。
4)核心理解四:BERT的输入
quad
在模型输入的时候,并非是具体的单词,而是一些句子对,句子对中的每一个单词还会拆分成WordPiece再输入。
-
WordPiece: 如embedding这个单词,通过WordPiece会拆分成em、##be、##dd、##ing四个token,带有##前缀的token表示它是单词的一部分,且不在单词的开头,所以在词表里面bed、##bed,它们的含义是完全不一样的。引入WordPiece作为输入可以有效缓解OOV问题,且进一步增加词表的丰富度和表征能力。
-
Sentence Pairs:
-
Embedding制作: 每个embedding由以下三部分组成。
- Token Embeddings是词向量,第一个单词是CLS标志,可以用于之后的分类任务
- Segment Embeddings用来区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务
- Position Embeddings和之前文章中的Transformer不一样,不是三角函数而是学习出来的
-
预训练语料:BooksCorpus(800M单词)和英语维基百科(2500M单词),一共约16G的语料。
5)核心理解四:BERT的优缺点
- 优点
- 对比起之前的预训练模型,它捕捉到的是真正意义上的bidirectional context信息。
- 还用的是Transformer,相对rnn更加高效、能捕捉更长距离的依赖。
- 缺点
- BERT只是建模了近似的概率密度,因为在预测某个MASK标记时,它与其他MASK标记之间的关系没被考虑,这样做预测的前提是BERT假设要预测的词(MASK)之间是相互独立的,即 Mask 之间相互不影响,所以预测在某一个Mask时,可以不考虑其他Mask(事实上这样做假设是由于没法考虑,因为其他Mask未知)。
- 假设 m 1 , m 2 , m 3 m_1,m_2,m_3 m1,m2,m3是三个Mask, w 1 , . . . , w n w_1,...,w_{n} w1,...,wn是句子中已知的词,真正的语言模型预测 m 1 m_1 m1时应该为: P ( m 1 ) = P ( m 1 ∣ w 1 , . . . , w n , m 2 , m 3 ) P(m_1)=P(m_1|w_1,...,w_{n},m_2,m_3) P(m1)=P(m1∣w1,...,wn,m2,m3),但是BERT预测的 m 1 m_1 m1其实是 P ( m 1 ) = P ( m 1 ∣ w 1 , . . . , w n ) P(m_1)=P(m_1|w_1,...,w_{n}) P(m1)=P(m1∣w1,...,wn)。
- [MASK]标记在实际预测中不会出现,会出现预训练数据与微调阶段数据不一致问题
- 生成任务表现不佳:预训练过程(自编码)和生成过程(自回归)的不一致,导致在生成任务上效果不佳;
- 处理长度有限:无法适用在文档级别的NLP任务,只适合于句子和段落级别的任务。
- 每个batch只有15%的token被预测,所以BERT收敛得比left-to-right模型要慢(它们会预测每个token)
- BERT只是建模了近似的概率密度,因为在预测某个MASK标记时,它与其他MASK标记之间的关系没被考虑,这样做预测的前提是BERT假设要预测的词(MASK)之间是相互独立的,即 Mask 之间相互不影响,所以预测在某一个Mask时,可以不考虑其他Mask(事实上这样做假设是由于没法考虑,因为其他Mask未知)。
6)BERT的变体
- RoBERTa:采用动态mask,并去掉下句预测的NSP任务;
参考:NLP】Google BERT模型原理详解、详解:一文读懂BERT模型。侵删。
Transformer-XL
quad
Paper:《Transformer-XL:Attentive Language Models Beyonds a Fixed-Length Context》【ACL’2019】
quad
Code:https://github.com/kimiyoung/transformer-xl
quad
在正式讨论Transformer-XL【XL是extra long的意思】之前,首先回顾经典的Transformer(下文称之为vanilla Transformer)的计算流程,它的整体流程如下图所示(以机器翻译任务为例)。
quad
对于一段序列,vanilla Transformer的处理流程为(下图翻译的句子与上图翻译的句子不一样,下图是中翻英,输入为:我有一只猫): 首先, 将其中每个词转换为embedding表示向量(词embedding+位置embedding);其次,将整个序列组成的embedding 矩阵输入至encoder部分用来编码,encoder部分输出一个尺寸不变的编码矩阵C。最后,encoder部分输出的编码矩阵C输入至decoder中,充当交叉注意力部分的K和V。decoder部分这时会输入一个翻译开始符
<
B
e
g
i
n
>
<Begin>
<Begin>,这个符号会通过一个masked MSA后得到交叉注意力部分的Q,通过这个Q去attend K和V得到一个矩阵,这个矩阵在经过FFN+Linear+Softmax后会得到一个词 “I”,这个词 “I” 就是decoder部分预测到的输入的开始字符
<
B
e
g
i
n
>
<Begin>
<Begin>后的词。然后进行下一轮预测, 将
<
B
e
g
i
n
>
<Begin>
<Begin>+ “I” 同时输入至masked MSA中得到Q,再去查询K和V得出下一个单词 “have”,以此类推 直至预测到终止符
<
E
n
d
>
<End>
<End>,整个预测任务才结束。
- decoder的每轮预测中,K和V不变,一直是encoder部分输出的编码矩阵C;
- 这里说到的masked MSA如下图所示,目的是跟encoder一样,仅仅为了将 < B e g i n > <Begin> <Begin>词汇映射到隐藏层而已,不一样的是,它的输入矩阵中除了已知的单词外(第一轮是 < B e g i n > <Begin> <Begin>,第二轮是 < B e g i n > <Begin> <Begin>+“I”),其他位置都是被masked,所以叫masked MSA。这样做的目的是:保证在预测下一个单词的时候,只能依赖于前面的信息(只能看见前面已预测到的字符),而不能依赖于后面的信息(而看不见后面还未被预测的字符)。预测过程中,原始输入序列始终是看得到的,即K和V
- encoder部分是用来编码的,负责把自然语言序列映射成为隐藏层,即含有自然语言序列的数学表达;decoder部分才是用来做预测的,负责把隐藏层再映射为自然语言序列,从而使我们可以解决各种问题,如情感分析、机器翻译、摘要生成、语义关系抽取等;
quad
了解完vanilla Transformer后,就可以理解Transformer-XL论文对vanilla Transformer的计算过程的如下介绍。这里的任务不再是机器翻译任务,一般指的是自监督预训练任务,即输入encoder一段文本,再以这段文本为GT在decoder中顺序地做预测(下图中把encoder部分忽略,默认为decoder部分)。
quad
Transformer模型在输入时采用的是固定长度序列输入,因为Transformer模型的时间复杂度和序列长度的平方成正比,因此一般序列长度都限制在最大512,长度太大时模型训练时间则会消耗太大。因此,对于一个特别长的输入序列,在训练时(如上图a),vanilla Transformer首先会按照固定的长度n(比如上图中的4),将整个序列划分成若干Segment(每个segment包含4个字符),然后将Transformer模型在每个segment内部顺序预测来进行训练。 也就是说segment间训练时独立的。训练好了之后,拿来evaluation时,训练好的模型会沿着整个序列从前至后依次预测下一个token,但每次只会attend到前面的n个单词,这是因为训练和评估时的segment长度不会变,所以只会注意到当前词的前n个词。这样虽然缓解了上下文碎片化问题,但每次的Segment都会重新计算,计算代价很大。
quad 因此vanilla Transformer存在以下问题:
- vanilla Transformer处理序列的长度太短(每个segment包含的字符太少),不能捕捉超过segment长度上限的依赖关系;
- 划分segment这样"粗暴"的划分方式,通常会将一句完整的话切分到若干个Segment里,而且Transformer模型并没有捕捉segment之间的关系,从而导致上下文碎片化(context fragmentation)问题。
quad 因此Transformer虽然相对于RNN能够建模更长的依赖关系,但是它仍限制于segment的长度内,对于超出这个范围的长距离依赖仍然是无法捕获的。反过来看RNN这种结构,虽然它建模依赖关系的距离很短,但是回想下它的建模机制,它可以将上个节点输出的隐层向量作为整个节点的表示,然后输入到下一节点中来充当上个节点的记忆,从而完成了节点之间依赖关系的建模。如果将Transformer中的segment看作是RNN中的节点,然后再采取RNN中的这种循环机制,那是不是就可以建模segment间的关系,从而建模更长距离的依赖了?
quad 启发与此,Transformer-XL提出了以下两大技术:
- 片段级递归机制(segment-level recurrence mechanism):引入一个记忆(memory)模块(类似于cache或cell),循环用来建模segment之间的联系。
- 相对位置编码:为vanilla Transformer引入循环机制后,绝对位置编码就不能用了,因此提出了相对位置编码。
quad 下面来分别讲解这两大技术。
1)片段级递归机制(segment-level recurrence mechanism,SLRM)
quad
Transformer-XL与Transformer的输入一样,都是固定长度的segment。不同的是,Transformer-XL中有“片段递归机制”,它的作用是缓存下来上一个segment的隐藏状态,然后在计算当前段的时候使用。这样做启发于RNN,可以建立起segment间的关系,从而赋予Transformer-XL建模更长期依赖的能力。
quad 定义长度为L的连续两个segment为 s τ = [ x τ , 1 , . . . , x τ , L ] s_ au=[x_{ au,1},...,x_{ au,L}] sτ=[xτ,1,...,xτ,L]和 s τ + 1 = [ x τ + 1 , 1 , . . . , x τ + 1 , L ] s_{ au+1}=[x_{{ au+1},1},...,x_{{ au+1},L}] sτ+1=[xτ+1,1,...,xτ+1,L]。 s τ s_ au sτ的隐藏状态节点为 h τ n ∈ R L × d h_ au^n in mathbb{R}^{L imes d} hτn∈RL×d,其中d为维度,n表示层数。使用“片段递归机制”计算 s τ + 1 , s_{ au+1}, sτ+1,的隐藏节点 h τ + 1 n h_{ au+1}^n hτ+1n可以通过以下数学公式,清晰的了解:
quad
其中,SG表示stop-gradient,即不参与BP计算,
∘
circ
∘表示拼接操作,W是带学习参数。可以看出,K和V使用了上个segment的隐藏状态,Q没有用,还是只用当前segment的值。因此,整体训练过程如下图所示。
quad 图中绿线的含义:虽然k和v利用了上个segment的隐层状态,但是由于Transformer的建模机制,在预测每一个节点时,只会关注前n(segment长度)个节点。意思就是在预测每一个节点时,都会利用上个segment的隐层状态构造一个新的“segment”,并且当前预测节点是新“segment”内的最后一个节点。这样的方式实现了“片段递归”的第一个好处:使模型拥有了建模更长的序列依赖能力,同时也避免了context fragmentation问题。
quad
此外,“片段递归”还有第二个好处:加快推理速度。Transfomer-XL的推理过程通过直接复用上一个片段的缓存而不是从头计算,这种简化带来的速度提升是成百上千倍的。比如在计算下面节点1时,无论是vanilla Transformer还是Transformer-XL,都是一样的,需要用到上个隐藏层的前n个词(即红色框三个点+1’点)。但对于vanilla Transformer而言,红色框内三个点是未知的,需要重新计算,但是对这三个点计算则需要计算出蓝色框内的点,同理又需要计算出紫色框内的点,这样的计算量是巨大的,所以影响推理速度。而对于Transfomer-XL而言,它直接复用上一个片段的缓存而不是从头计算,这样做使得红色框内三个点也是已知的,就可以直接进行计算,而省去了上面的一通操作,从而极大加快了推理速度。
quad
从上可以看出,Transformer-XL是一个典型的用空间换时间的方案,因为这个方法需要对上个片段的隐层节点的状态进行缓存,无疑将增大模型的显存占用量。但是理论上,只要显存足够大,Transformer-XL也可以复用更多的之前片段的隐层状态。
quad 此外,Transformer-XL受启发于RNN,并且在实现时和残差网络思想非常接近,相当于在两个片段之间添加了一条short-cut。而复用更多片段的结构则是一个DenseNet思想的模型。更直白点,用前面一个segment加到当前segment相当于残差网络,用前面多个segment加到当前segment相当于DenseNet网络。
2)相对位置编码
quad
Tansformer的位置编码是以段(segment)为单位的,每个segment内使用相同的位置编码矩阵
U
1
:
L
∈
R
L
×
d
U_{1:L} in mathbb{R}^{L imes d}
U1:L∈RL×d,其中L为序列长度,d为维度。这个位置编码会通过单位加的形式和词嵌入E(word Embedding)合并成一个矩阵。
quad
在Tansformer中,self-attention可以表示为:
quad
考虑到词嵌入,
Q
T
K
Q^TK
QTK的完整表达式为(E为词嵌入,U为位置编码):
quad
展开后,得到下式,其中
E
x
i
E_{x_i}
Exi表示token
x
i
x_i
xi的词向量,
U
i
U_i
Ui表示第i个绝对位置编码。
quad
Transformer的问题是无论对于第几个片段,它们的位置编码
U
1
:
L
U_{1:L}
U1:L都是一样的,也就是说Transformer的位置编码是相对于每个片段的绝对位置编码(absulate position encoding),与当前内容在原始句子中的相对位置是没有关系的。
quad
所以在引入片段递归机制,绝对位置编码不能再用了,否则
s
τ
s_{ au}
sτ和
s
τ
+
1
s_{ au+1}
sτ+1会出现位置信息混乱。因此Transformer-XL参考《self-attention with relative positional representation》,在self-attention中使用相对位置编码。主要是在self-attention计算的attention矩阵公式中,做了一些修改,将上面的公式
A
i
,
j
a
b
s
A^{abs}_{i,j}
Ai,jabs改成下面
A
i
,
j
r
e
l
A^{rel}_{i,j}
Ai,jrel这个样子:
quad 这里相对于绝对位置编码的公式,改进了以下几点:
- 在分项(b)和(d)中,使用相对位置编码 R i j Ri_j Rij取代绝对位置编码 U j U_j Uj。
- 在分项©和(d)中,使用可训练参数u和v取代 U i T W q T U_i^TW_q^T UiTWqT。因为 U i T W q T U_i^TW_q^T UiTWqT表示第i个位置的query 向量,这个query向量对于其他要进行Attention的位置来说都是一样的,因此可以直接使用统一的可训练参数进行替换。
- 在所有分项中,使用 W k , E W_{k,E} Wk,E,和 W k , R W_{k,R} Wk,R分别作为内容(词向量)的key向量和位置的key向量,这意味着输入序列的内容和位置编码不再共享权值,而是分开来计算。
quad 因此,上式中的每一项分别代表的含义如下:
- (a) 描述了基于内容的Attention
- (b) 描述了内容对于每个相对位置的bias
- (c ) 描述了内容的全局bias
- (d) 描述了位置的全局bias
quad
将上式合并后,得到最终公式如下:
quad 总结,基于上述的两大技术,Transformer-XL拥有以下优点:
- 捕获长期依赖的能力;长距离依赖建模能力: Transformer-XL > Transformer > RNNs > CNNs
- 解决了上下文碎片问题(context segmentation problem);
- 提升模型的预测速度和准确率。比Vanilla Transformer快1800+倍。
参考:面试百科之Transformer-XL讲解、Transformer模型详解(图解最完整版)、保姆级教程:图解Transformer、详解Transformer-XL。侵删。
XLNet
quad
Paper:《XLNet: Generalized Autoregressive Pretraining for Language Understanding》【NeurIPS’2019】
quad
Code:https://github.com/zihangdai/xlnet
quad 自回归语言模型(LM)是标准的语言模型,但它预测联合概率按照文本序列从左至右分解(顺序拆解),这使得它无法通过上下文信息进行双向特征表征。因此,基于自编码语言模型(DAE-LM)的思想出现了BERT等工作,但是他们也有着诸多缺点,比如只是对概率密度近似建模,不适合生成任务等。
quad 因此,本篇提出的XLNet结合LM和 DAE-LM,将传统的自回归语言模型进行推广,将顺序拆解变为随机拆解(排列语言模型,PLM),以此在预训练过程中基于Transformer结构学习到上下文相关的双向特征表示。
quad
需要注意的是,PLM没有改变原始文本序列的自然位置,只是定义了token预测的顺序。PLM只是针对语言模型建模不同排列下的因式分解排列,并不是词的位置信息的重新排列。它的基本思想见下图。并且规定:原始输入序列为
X
X
X,随机排列后的预测序列为
X
~
widetilde{X}
X
,某个词之前的单词为Context_before,某个词之后的单词为Context_after。那么XL-Net要做的就是,对于一个词
x
i
x_i
xi,通过PLM,则它在预测序列
X
~
widetilde{X}
X
中的Context_before将会包含它在原始序列
X
X
X中Context_after的内容,也就是说对预测序列
X
~
widetilde{X}
X
进行顺序拆解,这个过程就学习到原始序列
X
X
X中的上下文,解决了传统LM单向表征的问题。
quad
有了这样的思想后,难的是具体该如何实现。BERT得益于Transformer encoder卓越的表征能力,因此XL-Net自然也想基于Transformer的架构来设计。但在Transformer中,每一个token同时包含了"内容+位置"信息,而在预测当前随机排列序列
X
~
widetilde{X}
X
时,需要满足:模型预测当前单词时,只能使用当前单词的“位置”信息,以及Context_before中每个单词的"内容+位置"信息;模型在预测后续单词时,需要使用其前面所有词的"内容+位置"信息。
quad 因此在具体实现时,作者为每一个单词构造了两个向量,分别是内容向量h和查询向量g。最初的内容向量h同时包含了自身的"内容+位置"信息,而查询向量g只包含自身的“位置”信息。后续的内容向量h同时包含了自身以及Context_before词汇的"内容+位置"信息,而查询向量g只包含自身的“位置”信息以及Context_before词汇的"内容+位置"信息。这样我们最后就可以直接依据查询向量g来预测每一个位置的内容。
quad 为什么要构造这两类向量?
- 构造查询向量g的原因是:在最后,想要生成当前位置的"内容",只能根据Context_before词汇的"内容+位置"信息,以及当前的"位置"信息,所以构造一个查询向量g用于最后每个位置内容的预测。
- 构造内容向量h的原因是:在逐步更新查询向量g的过程中,是需要用到Context_before词汇的"内容+位置"信息的,因此为每个位置构造一个包含"内容+位置"信息的内容向量h,用于更新排列中Context_after词汇的查询向量g。说白了,构造内容向量h,就是为了辅助更新查询向量g,毕竟最终我们只需要根据查询向量g来做预测。
quad 整体计算框架如上,包含了Two-Stream Self-Attention。Content stream就是原始的Transformer encoder,因为其中每一个token同时包含了"内容+位置"信息。Content stream和Query stream的attention mask的区别就是有无对角线,也就是是否能看到自身。Query 流就是为了预测当前词,而 Content 流主要为 Query 流提供其它词的内容向量。
quad XLNet不仅仅做了这些,它还引入了其它的因素,也算是一个当时有效技术的集成体。XLNet就是Bert、GPT 2.0和Transformer XL的综合体变身,首先,它通过PLM预训练目标,吸收了Bert的双向语言模型;然后,GPT2.0的核心其实是更多更高质量的预训练数据,这个明显也被XLNet吸收进来了;再然后,Transformer XL的主要思想也被吸收进来,那就是片段循环机制和相对位置编码,它们的主要目标是解决Transformer对于长文档NLP应用不够友好的问题。
quad 总结: XL-Net主要用于NLP预训练,核心思想是PLM,其中吸纳了Transformer-XL解决Transformer对于长文档NLP应用不够友好的思想。
参考:XLNet:运行机制及和Bert的异同比较、他们创造了横扫NLP的XLNet:专访CMU博士杨植麟。侵删。
Transformer-XL类似工作(Scalable Transformer)
1. 《Scaling Transformer to 1M tokens and beyond with RMT》
quad paper: https://arxiv.org/pdf/2304.11062.pdf
quad
这篇工作很多推送把它吹的神乎其神,包括但不限于以下文章:
quad
真·量子速读:突破GPT-4一次只能理解50页文本限制,新研究扩展到百万token
quad
GitHub Daily:ChatGPT 的能力上限将被突破!
quad
shuibai:Scaling Transformer to 1M tokens and beyond with RMT 把上下文长度提升到Million级别
quad 但其实,该篇论文与Transformer-XL非常像,都是引入了recurrence来为下个segment提供一个memory,并无太大的新意。这一观点在[论文尝鲜] 用并发记忆Transformer(RMT)来把transformer推到百万级tokens也被指出。