会议: ACL 2019
论文地址
Transformer相关知识
一、研究动机
- transformer对于输入序列需要设置一个固定的长度,比如在BERT中,默认长度是512。如果文本序列长度短于固定长度,可以通过填充的方式来解决,如果序列长度超过固定长度,一般是将文本划分为多个segments进行单独处理,以Transformer为主的语言模型不能很好地处理超过预定义长度的文本,即模型不能捕获任何超过预定义上下文长度的长期依赖
二、研究方法
本文提出了一种新的神经体系结构Transformer XL,它由一种分段级递归机制(在自我注意模型中引入递归概念)和一种新的位置编码方案组成,它可以在不破坏时间连贯性的情况下,实现超过固定长度的学习依赖性。具体地,在对超过预定义长度的文本分段后,对于每一segment不是独立的训练,当前segment的隐状态信息则充分利用来自于前一个分段,并当做一个记忆memory,因此这样每个segment之间都可以完成信息的传递,从而缓解超过固定大小的文本的长距离依赖问题
上下文碎片问题**context fragmentation: 长度固定的segments是在不考虑句子或其它语义边界的情况下,通过选择连续的符号块来创建的,因此,模型缺乏必要的上下文信息,无法很好地预测前几个符号,这就导致模型的优化效率和性能低下
三、模型
语言模型:给定一个句子 x = ( x 1 , x 2 , . . . , x T ) x=(x_1, x_2, ..., x_T) x=(x1,x2,...,xT),输出它在文本中出现的联合概率 P ( x ) P(x) P(x).传统的LM把这个概率分解成autoregressive形式: P ( x ) = ∏ t P ( x t ∣ x < t ) P(x)=\prod_{t}P(x_t|x_{<t}) P(x)=∏tP(xt∣x<t). 问题可以转化成评估每个条件概率
使用神经网络将上下文 x < t x_{<t} x<t编码成一个固定大小的隐藏状态,将隐藏状态与词嵌入相乘得到logits,将logits作为softmax的输入,输出生成下一个token类别的概率分布
用 Transformer 或自注意力机制进行语言建模的核心问题在于,如何将Transformer训练为可以把任意长度的上下文有效编码为长度固定的表征
(1)Vanilla Model
-
将整个预料库划分成更小的segments,仅仅只使用单个的segment来训练模型,忽略先前segment的上下文信息。
-
Vanilla Model局限性:
A、最大可能依赖的长度是以segment长度为上限,而segment的长度只有几百个characters
B、简单地将长文本分成固定长度的segments将导致**上下文碎片(context fragmentation)**问题
-
Evaluation phase
在预测的时候,会对固定长度的segment做计算,一般取最后一个位置的隐向量作为输出。为了充分利用上下文关系,每次预测下一个token,都需要重新构建一遍上下文,并从头开始计算,如上图(b)所示,这导致计算效率非常低
(2)Segment-Level Recurrence with State Reuse
- 将递归机制引入到transformer中,来解决固定长度上下文的局限性,在训练过程中,前一个segment计算的隐藏状态序列是固定的,并被缓存起来,并在模型处理后面的新segment时作为扩展上下文重复使用,如下图所示虽然梯度仍然保留在一个segment中,但是这个额外的输入允许网络利用历史上的信息,从而能够对长距离依赖关系建模并避免上下文碎片化,形式化为:两个长度为L的连续
s
e
g
m
n
e
n
t
s
τ
=
[
x
τ
,
1
,
.
.
.
,
x
τ
,
L
]
segmnent s_{\tau}=[x_{\tau, 1}, ..., x_{\tau, L}]
segmnentsτ=[xτ,1,...,xτ,L]和
s
τ
+
1
=
[
x
τ
+
1
,
1
,
.
.
.
,
x
τ
+
1
,
L
]
,
s_{\tau+1}=[x_{\tau+1, 1}, ..., x_{\tau+1, L}],
sτ+1=[xτ+1,1,...,xτ+1,L],其中
h
τ
n
∈
R
L
×
d
h_{\tau}^n\isin{\Reals}^{L\times d}
hτn∈RL×d表示第
τ
\tau
τ个
s
e
g
m
e
n
t
segment
segment对应的第
n
n
n层的隐藏层状态序列,第
τ
\tau
τ个
s
e
g
m
e
n
t
segment
segment的第
n
n
n层隐藏层状态序列
h
τ
+
1
n
∈
R
L
×
d
h_{\tau + 1}^n\isin{\Reals}^{L\times d}
hτ+1n∈RL×d计算如下:
其中 S G ( . ) SG(.) SG(.)表示没有梯度,前一个 s e g m e n t segment segment只保留隐藏状态,不保留梯度, [ h u ∘ h v ] [h_u \circ h_v] [hu∘hv]表示两个隐藏层状态在长度维度上进行连接,W为模型中参数,与普通transformer模型相比,不同点在于 k τ + 1 n 和 v τ + 1 n k_{\tau+1}^{n}和v_{\tau+1}^{n} kτ+1n和vτ+1n,这两个值受拓展的上下文 h ~ τ + 1 n − 1 ∈ R 2 L × d \widetilde{h}_{\tau+1}^{n-1}\isin{\Reals}^{2L\times d} h τ+1n−1∈R2L×d,因此 h τ n − 1 h_{\tau}^{n-1} hτn−1需要从先前的 s e g m e n t segment segment中缓存下来
其中 q q q的长度为 L L L, k k k和 v v v的长度为 2 L 2L 2L, T r a n s f o r m e r Transformer Transformer的输出序列长度相关,也为 L L L
对预料库中任意两个连续的 s e g m e n t s segments segments使用递归机制,其本质就是在隐藏层状态建立一个 s e g m e n t segment segment级别的递归(缓存利用上一个 s e g m e n t segment segment的隐层信息,而且上一个 s e g m e n t segment segment的所有隐向量序列只参与前向计算,不再进行反向传播),这样以来能够被使用到的有效上下文可以远远超出两个 s e g m e n t s segments segments, h τ + 1 n h_{\tau+1}^{n} hτ+1n和 h τ n − 1 h_{\tau}^{n-1} hτn−1之间的递归依赖是每 s e g m e n t segment segment向下移动一层,本文模型依赖的最长值是与层数和 s e g m e n t segment segment的长度线性相关的,即 O ( N × L ) O(N\times L) O(N×L),下图中绿色阴影部分可以看出,在理论上,在GPU容量范围内,我们是可以尽可能地缓存多的历史 s e g m e n t s segments segments,并在处理当前 s e g m e n t segment segment时,将历史信息进行复用以作为额外的上下文。鉴于此,我们可以预设一个横跨多个 s e g m e n t s segments segments长度为M的历史隐状态,将这些历史隐藏状态记为 m τ n ∈ R M × d m_{\tau}^n\isin{\Reals}^{M\times d} mτn∈RM×d,训练中 M M M值等于 s e g m e n t segment segment长度,在评估阶段将 M M M增加数倍
(3)Relative Positional Encodings
- Why use? 解决重用隐藏层状态时,如何保持位置一致性的问题,递归机制引入了新的挑战——原始位置编码将每个segment分开处理,因此,来自不同segment的表征会具有相同的位置编码。例如,第一segment和第二segment的第一个表征将具有相同的编码,虽然它们的位置和重要性并不相同(比如第一个segment中的第一个表征可能重要性低一些)。这种混淆可能会错误地影响网络
- 标准Transformer:序列顺序的信息是由一组位置编码提供,记为:
U
∈
R
L
m
a
x
×
d
U\isin{\Reals}^{L_{max}\times d}
U∈RLmax×d
Transformer位置编码Why What How?
U i U_i Ui表示 U U U的第 i i i行,代表着一个segment中第 i i i个绝对位置的编码信息, L m a x L_{max} Lmax规定的建模的最大长度,实际输入到Transformer的是按元素顺序(element-wise)添加的word embeddings和位置编码。如果简单地将这种位置编码引入到本文的recurrence机制中,则隐状态序列的计算如下所示:
其中 E s τ E_{s_{\tau}} Esτ为 s τ s_{\tau} sτ的词嵌入序列,其中 f ( . ) f(.) f(.)为转换函数
可以观察到 E s τ E_{s_{\tau}} Esτ和 E s τ + 1 E_{s_{\tau+1}} Esτ+1都与位置编码 U 1 : L U_{1:L} U1:L有关,则模型就无法区分 x τ , j x_{\tau,j} xτ,j和 x τ + 1 , j x_{\tau+1,j} xτ+1,j在位置上的差异,其中 j = 1 , . . . , L j=1,...,L j=1,...,L,这就会导致性能损失,例如:第 i − 2 i − 2 i−2个segment和第 i − 1 i − 1 i−1个segment的第一个位置将具有相同的位置编码,但它们对于第 i i i个segment的建模重要性是不相同的,这时采用绝对位置编码是无法进行区分的,应该采用相对位置编码(Relative Positional Encodings) - 解决问题的基本思想是只编码隐藏状态中的相对位置信息
位置编码给予模型时序上的信息或者信息收集过程中的“偏见”,即需要更被注意到的地方。同样为了这个目的,我们不再静态地将偏置bias引入到初始的embedding中,而是将相同的信息注入到每一层的注意分值中。更重要的是,用相对的方式来定义时间偏差更直观、更普遍。例如:一个query vector q τ , i q_{\tau, i} qτ,i关注到key vectors k τ ≤ i k_{\tau \leq i} kτ≤i,在识别 s e g m e n t segment segment的时间顺序时,是无需知道每个key vector的绝对位置;而只需要知道每个key vector k τ , j k_{\tau,j} kτ,j和自身的 q τ , i q_{\tau, i} qτ,i之间的相对位置,即 i − j i − j i−j 。实际上,我们可以创建一序列的相对位置编码 R ∈ R L m a x × d R \isin{\Reals}^{L_{max}\times d} R∈RLmax×d,其中第i行的值R_i表示两个位置的相对距离为i,通过动态地将相对距离引入到attention score中,query vector可以根据不同的距离很容易就区分出的 x τ , j x_{\tau,j} xτ,j和 x τ + 1 , j x_{\tau+1,j} xτ+1,j表征,这也使得隐藏状态的复用成为可能,与此同时,由于绝对位置可以从相对距离递归恢复,模型并没有丢失任何的时序信息。
如何构建相对位置编码R?
标准transformer中attention score分解:blog
A i , j a b s = ( W q ( E x i + U i ) ) T ( W k ( E x j + U j ) ) A^{abs}_{i,j} = (W_q(E_{x_i}+U_i))^T(W_k(E_{x_j}+U_j)) Ai,jabs=(Wq(Exi+Ui))T(Wk(Exj+Uj))
Transformer改进之相对位置编码(RPE)
基于相对位置信息的思想,将四个项重新参数化:
改进:- A、替换掉所有使用绝对位置编码 U j U_j Uj的项,在(b)项和(d)项中计算key vectors的时候用相对位置 R i − j R_{i-j} Ri−j代替, R R R为正弦编码矩阵,是不可学习的参数
- B、在(c)项中引入一个可训练的参数项 u ∈ R d u\isin{\Reals}^{d} u∈Rd来替换掉query中 U i T W q T U_i^{T}W_q^{T} UiTWqT,由于query vector对于所有的查询位置都是相同的,则无论查询位置如何,对不同词语的注意偏差,都应保持一致,在(d)项中用 v v v来替换 U i T W q T U_i^{T}W_q^{T} UiTWqT
- C、最后设计连两个权重矩阵
W
k
,
E
W_{k,E}
Wk,E和
W
k
,
R
W_{k,R}
Wk,R分别用于生成content-based key vectors和location-based key vectors,也就是输入序列编码和位置编码不在共享权值
公式 (a) 代表基于上下文的定位;公式(b)项当前内容的位置偏差
公式 (c ) 项控制全局上下文偏差;公式(d)项编码全局位置偏差
- N层Transformer-XL单头注意力的计算流程如下:其中n = 1,2,…,N
h τ 0 : = E s τ h^0_{\tau}:=E_{s_{\tau}} hτ0:=Esτ为词嵌入序列
Transformer结构:
transformer采用encoder-decoder结构,由多层的encoder层 decoder层组成
encoder有两个子层:self-attention后紧跟着一个position-wise feed-forward层
decoder有三个子层:self-attention后紧跟着一个encoder-decoder attention,再接一个position-wise feed-forward层
每个子层都在Layer normalization后使用了残差连接,有助于将位置信息传播到更高层
为什么使用Layer normalizatoin 而不适用Batch normalization?
假设输入图像shape记为[N, C, H, W],其中N=batchsize,C=channels, H=height, W=width
(1)Batch normalization:是对一个batch中样本的同一维度做归一化处理(是数据服从均值为0,方差为1的正态分布)
(2)Layer normalization:对单个样本的所有维度的特征做归一化处理
四、实验
- Perplexity(PPL):困惑度,计算每一个单词得到的概率倒数的几何平均,即模型预测下一个单词时平均可选择的单词数量。当语言模型的困惑度越低,则说明语言模型的效果越好。(但测试集中有n个句子时,只需要计算出每个句子的PPL,然后再所有计算出来的PPL累加求平均,最终结果为语言模型在该测试集上的困惑度),链接
- bits-per-character(bpc):当以字符为单位计算PPL时,
P
P
L
=
2
b
p
c
PPL=2^{bpc}
PPL=2bpc
(1)Main Results
将Transformer-XL应用于word-level和character-level语言建模的各种数据集中,与最先进的模型进行比较,其中数据集有:
-
WikiText-103:目前最大的word-level语言建模基准,具有长期依赖性,它包含来自28K篇文章的103M训练令牌,每篇文章的平均长度为3.6K令牌,这允许测试长期依赖建模的能力。我们在训练时设置注意力长度为384,在评估时设置注意力长度为1600。我们采用了自适应的softmax和输入表示(Baevski和Auli, 2018;Grave等,2016a)。如表1所示,Transformer-XL将先前的状态(SoTA)困惑度从20.5减少到18.3,这说明了TransformerXL架构的优越性。
-
enwik8:包含100万字节未处理的维基百科文本。我们将我们的架构与表2中先前的结果进行比较。在模型尺寸约束下,12层Transformer-XL实现了新的SoTA结果,优于12vanilla Tranformer Al Rfou等人(2018年)的预测值为0.05,而这两种transformer型号都比传统的基于RNN的型号有较大的提升。值得注意的是,我们的12层架构实现了与AlRfou等人(2018)的64层网络相同的结果,仅使用了17%的参数预算,为了观察是否可以通过增加模型尺寸获得更好的性能,我们通过增加模型尺寸来训练18层和24层Transformer-XLs。训练时的注意力长度为784,评估时的注意力长度为3800,我们获得了一个新的SoTA结果,我们的方法是第一个在广泛研究的角色级别基准上突破1.0的方法。与Al Rfou等人(2018年)不同的是,Transformer-XL不需要任何辅助损耗,因此,所有收益均计入更好的架构。
-
text8:与enwik8相似但不同的是,text8包含100M处理过的维基百科字符,通过将大写转化为小写并删除除26个字母a~z和空格之外的任何字符来创建的,由于相似,我们只是调整在enwik8上的最好的模型和相同的超参数,而在text8没有进一步的调整,表3显示了与先前方法进行的比较,再次Transformer-XL实现了新的SoTA结果与一个明确的边际。
-
One Billion Word:没有保持任何长期的依赖关系,因为句子被打乱了。因此,该数据集主要测试短期依赖的建模能力,Transformer-XL与其他方法的比较如表4所示,虽然Transformer-XL的设计主要是为了更好地捕获长期依赖,但它显著地将单型号SoTA从23.7提高到21.8。具体来说,Transformer-XL显著优于使用vanilla Transformers的当代方法(Baevski和Auli,2018),表明Transformer-XL的优势可推广到建模短序列。
-
Penn Treebank:我们还在表5中报告了word-level的Penn Treebank的结果。与AWD-LSTM (Merity et al.,2017)类似,我们将变差dropout和加权平均应用于Transformer-XL。在适当的正则化条件下,Transformer-XL无需两步微调就可以在模型之间实现新的SoTA结果,Penn Treebank只有100万训练tokens,这意味着Transformer-XL即使在小数据集上也能很好地泛化。
(2)Ablation Study
进行了两组消融实验,用来测试提出的segment-level recurrence和relative positional encoding scheme技术的效果,
- 第一组研究是在WikiText-103上进行的,我们发现绝对编码只在一半损失情况下工作良好,因为一半损失排除了在训练中非常短的注意长度的位置,以获得更好的泛化
Loss:“Full”和“Half”损失是指应用一个交叉熵损失到所有或最近的一半位置的部分。
PPL init:使用与训练相同长度所获得的的困惑度
PPL best:使用最佳长度所获得的困惑度
Attn Len:在评估过程中得到最短的注意长度
- 第二组研究目标是relative positional encoding解决上下文碎片问题,实验在One Billion Word数据集上进行实验,表7所示,即使在不需要长期依赖的情况下,使用段级递归也能显著提高性能,此外,我们的相对位置编码在短序列上也优于Shaw et al。
(3)Relative Effective Context Length
ECL是增加上下文跨度将导致增益大于阈值的最长长度。然而,ECL忽略了一个事实,即当一个模型仅使用较短的上下文就已经达到较低的困惑度时,很难得到改进,因此它不适合在多个模型之间进行公平比较。我们提出了一个新的度量,称为相对有效上下文长度(relative effective context length,RECL),RECL是在一个模型组而不是单个模型上定义的,长上下文的增益是通过相对于最佳短上下文模型的相对改进来衡量的。因此,模型组共享相同的基线,以实现公平比较。
五、总结
(1)优点
将Segment-Level Recurrence和Relative positional encoding scheme应用在Transformer之中,能够捕获上下文中更长的依赖关系,不再局限于segment的长度