#ACL#
今天分享的是ACL 2019的一篇论文《Transformer-XL: Attentive Language Models
Beyond a Fixed-Length Context》
原文链接:https://arxiv.org/abs/1901.02860
摘要
在自然语言处理任务中,Transformer具备学习数据长期依赖的潜力,但是受到固定长度上下文的限制。为此,本文提出了一种新的神经网络架构Transformer-XL,该网络结构能够在不破坏时间一致性的情况下,学习到超越固定长度的依赖性。该架构包括一个片段级的循环机制和一个新的位置编码策略。该方法不仅能够捕获长期的依赖关系,还解决了上下文碎片化的问题。根据实验结果,Transformer-XL 学习到的依赖性比 RNN 长 80%,比标准 Transformer 长 450%,无论是在长序列还是短序列中都得到了更好的结果,并且在评估时比标准 Transformer 快 1800+ 倍。
1.介绍
语言模型捕获序列数据长期依赖的能力在自然语言处理任务中是至关重要的,LSTM通过引入门机制将RNN的长期依赖捕获能力提升到200个单词左右,Transformer的编码能力超越了RNN,但是对长距离依赖的建模能力仍然不足。
Transformer对于非常长的文本的处理方式是:编码固定长度的上下文,即将一个长的文本序列截断为几百个字符的固定长度片段(segment),然后分别编码每个片段,但片段之间没有信息交互。
① Transformer无法建模超过固定长度的依赖关系,对长文本编码效果差。
② Transformer把要处理的文本分割成等长的片段,通常不考虑句子(语义)边界,导致上下文碎片化(context fragmentation)。通俗来讲,一个完整的句子在分割后,一半在前面的片段,一半在后面的片段。
基于此,提出了Transformer-XL。
2.贡献
① 提出片段级循环机制(segment-level recurrence mechanism),引入一个记忆(memory)模块,循环用来建模片段之间的联系。使得长距离依赖的建模成为可能,使得片段之间产生交互,解决上下文碎片化问题。
② 提出相对位置编码机制(relative position embedding scheme),代替绝对位置编码。在memory的循环计算过程中,避免时序混淆,位置编码可重用。
③ 片段级循环机制帮助编码长距离依赖并解决上下文碎片化问题,相对位置编码机制是为了实现片段级循环机制而提出的,解决可能出现的时序混淆问题。这两种技术形成了一套完整的解决方案,因为其中任何一种单独都不能解决上下文长度固定的问题。
④ Transformer-XL是第一个在字符级和单词级语言建模上都比RNN更优秀的自注意力模型。
3.模型框架
3.1 循环机制
Transformer-XL 使用分段的方式进行建模,但其引入了段与段之间的循环机制,使得当前段在建模的时候能够利用之前段的信息来实现长期依赖性。
① 在训练阶段,处理后面的段时,每个隐藏层都会接收两类输入:
- 该段的前面节点的输出(上图的灰色线)。
- 前面段的节点的输出(上图的绿色线),可以使模型创建长期依赖关系。原则上只要GPU内存允许,该方法可以利用前面更多段的信息。
② 在预测阶段:
如果预测 x 11 x_{11} x11,只需要用之前预测好的[ x 1 x_1 x1, x 2 x_2 x2,…, x 10 x_{10} x10]的结果,直接预测。同理在预测 x 12 x_{12} x12的时候,直接在[ x 1 x_1 x1, x 2 x_2 x2,…, x 10 x_{10} x10, x 11 x_{11} x11]的基础上计算,在每次预测时,不需要重新计算前面固定个数的字。Transfomer-XL的推理过程通过直接复用上一个片段的表示而不是从头计算,将速度带来了很多倍提升。
③ 具体实现:
数学形式上,分别将长度为
L
L
L的连续两个片段表示为
s
τ
=
[
x
τ
,
1
,
.
.
.
,
x
τ
,
L
]
s_{\tau}=[x_{\tau},1,...,x_{\tau},L]
sτ=[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\in\mathbb {R}^{L×d} hτn∈RL×d表示第 n n n层 s τ s_{\tau} sτ段的隐藏状态,其中 d d d是隐藏层节点的维度。然后用下面的公式生成分段 s τ + 1 s_{\tau+1} sτ+1的第 n n n层隐藏状态:
h
~
τ
+
1
n
−
1
=
[
S
G
(
h
τ
n
−
1
)
∘
h
τ
+
1
n
−
1
]
(
1
)
\widetilde{h}_{\tau+1}^{n-1}=[SG(h_{\tau}^{n-1})\circ{h_{\tau+1}^{n-1}}] \ (1)
h
τ+1n−1=[SG(hτn−1)∘hτ+1n−1] (1)
q
τ
+
1
n
,
k
τ
+
1
n
,
v
τ
+
1
n
=
h
τ
+
1
n
−
1
W
q
T
,
h
~
τ
+
1
n
−
1
W
k
T
,
h
~
τ
+
1
n
−
1
W
v
T
(
2
)
q_{\tau+1}^n,k_{\tau+1}^n,v_{\tau+1}^n=h_{\tau+1}^{n-1}W_q^T,\widetilde{h}_{\tau+1}^{n-1}W_k^T,\widetilde{h}_{\tau+1}^{n-1}W_v^T \ (2)
qτ+1n,kτ+1n,vτ+1n=hτ+1n−1WqT,h
τ+1n−1WkT,h
τ+1n−1WvT (2)
h
τ
+
1
n
=
T
r
a
n
s
f
o
r
m
e
r
−
L
a
y
e
r
(
q
τ
+
1
n
,
k
τ
+
1
n
,
v
τ
+
1
n
)
(
3
)
h_{\tau+1}^n=Transformer-Layer(q_{\tau+1}^n,k_{\tau+1}^n,v_{\tau+1}^n) \ (3)
hτ+1n=Transformer−Layer(qτ+1n,kτ+1n,vτ+1n) (3)
下面分别对三个公式进行解释:
- 公式(1)中,函数 S G ( ⋅ ) SG(·) SG(⋅)代表停止梯度,表示这一部分不参与误差反向传播计算。 [ h u ∘ h v ] [{h_u}\circ{h_v}] [hu∘hv]表示两个隐藏层节点在长度维度上进行拼接。
- 公式(2)中, W W W是模型需要学习的参数, k τ + 1 n k_{\tau+1}^n kτ+1n和 v τ + 1 n v_{\tau+1}^n vτ+1n使用的是扩展了上个片段的隐藏状态的 h ~ τ + 1 n − 1 \widetilde{h}_{\tau+1}^{n-1} h τ+1n−1,这是实现段与段之间循环机制的关键公式。
- 公式(3)中, h τ + 1 n h_{\tau+1}^n hτ+1n按照标准Transformer进行计算,因为输出隐向量序列长度取决于query的序列长度,而不是key和value,所以计算出来的第n层隐向量序列长度仍然是L,不是拼接后的2L。
3.2 相对位置编码机制
当采用循环机制时,有一个很重要的问题需要解决:保持位置信息的一致性。
Transformer中计算查询
q
i
T
q_i^T
qiT和键
k
j
k_j
kj之间Attention分数的公式为:
(
W
q
(
E
x
i
+
U
i
)
)
T
⋅
(
W
k
(
E
x
j
+
U
j
)
)
(W_q(E_{xi}+U_i))^T·(W_k(E_{xj}+U_j))
(Wq(Exi+Ui))T⋅(Wk(Exj+Uj))
展开得到:
A
i
,
j
a
b
s
=
q
i
T
k
j
=
E
x
i
T
W
q
T
W
k
E
x
j
⏟
(
a
)
+
E
x
i
T
W
q
T
W
k
U
j
⏟
(
b
)
+
U
i
T
W
q
T
W
k
E
x
j
⏟
(
c
)
+
U
i
T
W
q
T
W
k
U
j
⏟
(
d
)
A_{i,j}^{abs}=q_i^Tk_j=\underbrace{E_{xi}^TW_q^TW_kE_{xj}}_{(a)}+\underbrace{E_{xi}^TW_q^TW_kU_j}_{(b)}+\underbrace{U_i^TW_q^TW_kE_{xj}}_{(c)}+\underbrace{U_i^TW_q^TW_kU_j}_{(d)}
Ai,jabs=qiTkj=(a)
ExiTWqTWkExj+(b)
ExiTWqTWkUj+(c)
UiTWqTWkExj+(d)
UiTWqTWkUj
其中,
E
x
i
E_{xi}
Exi是词i的embedding,
E
x
j
E_{xj}
Exj是词j的embedding,
U
i
U_i
Ui和
U
j
U_j
Uj是位置向量。在该文的循环机制思想下,如果仅仅对于每个段仍直接使用上述Transformer中的位置编码,即每个不同段在同一个位置上的表示使用相同的位置编码,就会出现问题。
Transfomer-XL对上式做了变化,得到了下面的计算方法:
A
i
,
j
r
e
l
=
E
x
i
T
W
q
T
W
k
,
E
E
x
j
⏟
(
a
)
+
E
x
i
T
W
q
T
W
k
,
R
R
i
−
j
⏟
(
b
)
+
u
T
W
k
,
E
E
x
j
⏟
(
c
)
+
v
T
W
k
,
R
R
i
−
j
⏟
(
d
)
A_{i,j}^{rel}=\underbrace{E_{xi}^TW_q^TW_{k,E}E_{xj}}_{(a)}+\underbrace{E_{xi}^TW_q^TW_{k,R}R_{i-j}}_{(b)}+\underbrace{u^TW_{k,E}E_{xj}}_{(c)}+\underbrace{v^TW_{k,R}R_{i-j}}_{(d)}
Ai,jrel=(a)
ExiTWqTWk,EExj+(b)
ExiTWqTWk,RRi−j+(c)
uTWk,EExj+(d)
vTWk,RRi−j
对上面两个公式进行对比,变化如下:
- 变化①: ( a ) ( b ) ( c ) ( d ) (a)(b)(c)(d) (a)(b)(c)(d)中, W k W_k Wk被拆分成了 W k , E W_{k,E} Wk,E和 W k , R W_{k,R} Wk,R,分别生成基于内容的key向量和基于位置的key向量,意味着输入序列和位置编码不再共享权值。
- 变化②: ( b ) ( d ) (b) (d) (b)(d)中,将绝对位置编码 U j U_j Uj换成了相对位置编码 R i − j R_{i-j} Ri−j,其中R是Transformer中采用的没有可学习参数的sinusoid编码矩阵。
- 变化③: ( c ) ( d ) (c)(d) (c)(d)中引入了两个新的可学习的参数𝑢和𝑣,替换Transformer中的query向量 U i T W q T U_i^TW_q^T UiTWqT。表明无论query位置如何,对不同词的注意偏差都保持一致。
改进之后的公式,4个部分有了具体的含义:
- ( a ) (a) (a)没有考虑位置编码的原始分数
- ( b ) (b) (b)相对于当前内容的位置偏差
- ( c ) (c) (c)从内容层面衡量键的重要性,表示全局的内容偏置
- ( d ) (d) (d)从相对位置层面衡量键的重要性,表示全局的位置偏置
4.实验
① 大型单词级别数据集
② 字符级别数据集
③ 仅具有短期依赖性的数据集
评价指标:
- PPL:衡量语言模型好坏的指标。PPL越小,说明这句话契合的越好。
- bpc:衡量预测序列和真实序列之间差异的指标。bpc越小,说明差异越小。
④ 推理速度
该模型在推理阶段的速度明显加快,特别是对于较长的上下文。
5.总结
① 该模型在几种不同的数据集上均实现了最先进的语言建模结果。
② 结合了深度学习的两个重要概念——循环机制和注意力机制,允许模型学习长期依赖性,且可能可以扩展到需要该能力的其他深度学习领域,例如音频分析。
③ 与Vanilla Transformer模型相比,最高提速了1874 倍。
④ 不过,此模型未在情感分析或问题回答等 NLP 任务上进行测试,未解答与其他基于 Transformer 的模型(如BERT)相比有何优点。