XL-NET
- Xl-net结合了AR(自回归模型)与AE(去噪自编码模型)的有特点
- AR擅长生成类任务,也就意味着只能利用前向或者后向的文本,
不能同时兼顾上下文
,这也就是AR的最大的劣势
一、Xl-net与bert的关系
- AE旨在从损坏的输入中来重建数据,比如在预训练的时候使用MASK以一定的概率进行替换单词,从而实现可以兼顾上下文。但是人为添加MASK标记在真实情况下是不存在的,所以导致
预训练与真实预测之间存在差异
,还有一个问题就是bert在进行MASK的时候假设,被MASK的单词之间不存在关联性
,但是事实不是这样的。Xl-net提出了一种利用AR从双向上下文中学习的新方法,避免MASK在AE模型中带来的缺点
二、目标:排列语言模型
提出一个模型可以同时取两者之长,同时可以客服两者的缺点——排列语言模型。它不仅可以保留AR模型的优点同时也可以捕获双向语境。一个长度为T的序列有T!种不同的排序方法,可以执行有效的自回归因式分解,如果模型参数在所有的因式分解顺序中共享,那么预计模型将学习从两边的所有位置上收集信息。
假设x=x1x2x3, 那么总共有6种分解方法:
p
(
x
)
=
p
(
x
1
)
p
(
x
2
∣
x
1
)
p
(
x
3
∣
x
1
x
2
)
=
>
1
−
>
2
−
>
3
p(x) = p(x1)p(x2|x1)p(x3|x1x2)=> 1->2->3
p(x)=p(x1)p(x2∣x1)p(x3∣x1x2)=>1−>2−>3
p
(
x
)
=
p
(
x
1
)
p
(
x
3
∣
x
1
)
p
(
x
2
∣
x
1
x
3
)
=
>
1
−
>
3
−
>
2
p(x) = p(x1)p(x3|x1)p(x2|x1x3)=> 1->3->2
p(x)=p(x1)p(x3∣x1)p(x2∣x1x3)=>1−>3−>2
p
(
x
)
=
p
(
x
2
)
p
(
x
1
∣
x
2
)
p
(
x
3
∣
x
2
x
1
)
=
>
2
−
>
1
−
>
3
p(x) = p(x2)p(x1|x2)p(x3|x2x1)=> 2->1->3
p(x)=p(x2)p(x1∣x2)p(x3∣x2x1)=>2−>1−>3
p
(
x
)
=
p
(
x
2
)
p
(
x
3
∣
x
2
)
p
(
x
1
∣
x
2
x
3
)
=
>
2
−
>
3
−
>
1
p(x) = p(x2)p(x3|x2)p(x1|x2x3)=> 2->3->1
p(x)=p(x2)p(x3∣x2)p(x1∣x2x3)=>2−>3−>1
…
…
……
……
注意
p
(
x
2
∣
x
1
x
3
)
p(x2|x1x3)
p(x2∣x1x3)表示第一个词是x1,第三个词是x3的条件下第二个词是x2的概率,而不是第一个词是x1,第二个词是x3的条件下第三个词是x2的概率。
如果语言模型遍历T!种分解方法,并且这个模型的参数是共享的,那么这个模型就一定能学习到各种上下文,普通的从左到右的或者从右往左的语言模型只能学习一种方向的依赖关系,而排列模型这可以学习各种顺序的猜测方法。
但是如果排列语言模型遍历所有的分解方法,当序列的长度较长,计算量会变得极其巨大(因为T!),所以实际情况下只采样部分排列方式。
Z
T
Z_T
ZT表示长度为T的序列的所有排列组成,
z
∈
Z
T
z∈Z_T
z∈ZT是其中一种排列方法。
z
t
表
示
排
列
的
第
t
个
元
素
z_t表示排列的第t个元素
zt表示排列的第t个元素,而
z
<
t
z_{<t}
z<t表示z的第1到第t-1个元素
举个例子,假如其中有一种排列方式z = [1,3,2],那么
z
3
z_3
z3=2,则
z
3
z_3
z3=2,而
z
<
3
z_{<3}
z<3=[1,3],那么排列语言模型的目标就是调整模型参数使得下面的释然概率最大:
上面的公式就是取其中一种排列方式,根据这个排列来分解联合概率成条件概率的乘积。再一次强调,模型只会遍历概率的分解顺序,并不会改变原始的顺序。通过Attention的Mask来对应不同的分解方法,比如p(x1|x3)p(x2|x1x3)p(x3),在transformer编码的时候attend to x3, 而把x2 Mask掉,编码x3 的时候岸把x1, x2 都Mask掉。
三、模型架构:对目标感知表征的双流自注意力
transformer中某个token的向量是位置向量和内容向量相加的,但是xlnet希望在预测下一个词时只能提供位置向量而不能提供内容向量,所以模型希望同时做两件事:一是希望预测自己到底是哪个字符,再是能够预测后面的字符是哪个。但是这又是冲突的,比如模型在预测第二个位置上的token时,不提供内容向量只提供位置向量,但是预测第三个位置上的token的时候又需要第二个位置的完整向量(位置向量和内容向量)参与。所以我们就需要两个网络,一个像transformer一样可以提供内容向量,有需要另一个网络提供相应的位置向量。
transformer中的每个词的表征由其词向量和位置编码共同决定,所以transformer就与乱序的语言模型很契合了
还有一点,当我们预测一个token的时候我们也会进行Mask但是却和bert的方式不太一样,被Mask的token只是充当query用,所以所有的词汇表征里都不含有mask,所以杜绝了预训练-微调的差异。
我们还希望可以想AR模型一样,只进行一次整句的表征就可以得到所有样本的语境表征,这时所有的计算都必须同时是进行,我们需要获得包含该位置的内容向量和位置向量的表示h,和只包含位置向量不包含该位置内容向量的表示g,但是这是我们就会遇到标签泄露为问题,即只是通过这样的方式获得h和g的话:
h
1
l
=
A
t
t
e
n
t
i
o
n
(
Q
←
h
1
l
−
1
,
K
V
←
h
:
l
−
1
)
h_1^l = Attention(Q← h_1^{l-1}, KV←h_:^{l-1})
h1l=Attention(Q←h1l−1,KV←h:l−1)
g
1
l
=
A
t
t
e
n
t
i
o
n
(
Q
←
g
1
l
−
1
,
K
V
←
h
j
≠
1
l
−
1
)
g_1^l = Attention(Q← g_1^{l-1}, KV←h_{j≠1}^{l-1})
g1l=Attention(Q←g1l−1,KV←hj=1l−1)
通过这个式子我们可以看出,明显的第一个位置的内容向量会通过第l-2层传递到该层,所以我们需要像transformer一样添加Attention Mask防止内容向量泄露。
h
1
l
=
A
t
t
e
n
t
i
o
n
(
Q
←
h
1
l
−
1
,
K
V
←
h
1
:
z
t
−
1
l
−
1
)
h_1^l = Attention(Q← h_1^{l-1}, KV←h_{1:z_{t-1}}^{l-1})
h1l=Attention(Q←h1l−1,KV←h1:zt−1l−1)
g
1
l
=
A
t
t
e
n
t
i
o
n
(
Q
←
g
1
l
−
1
,
K
V
←
h
1
:
z
t
l
−
1
)
g_1^l = Attention(Q← g_1^{l-1}, KV←h_{1:z_{t}}^{l-1})
g1l=Attention(Q←g1l−1,KV←h1:ztl−1)
对于一句话比如I like New York, 加入排列为[1,3,2,4], 那么:
p
(
X
z
3
=
x
∣
x
z
1
x
z
2
)
=
p
(
X
4
=
x
∣
x
1
x
3
)
=
e
x
p
(
e
(
x
)
T
h
θ
(
x
1
x
3
)
)
/
(
∑
x
′
e
x
p
(
e
(
(
x
′
)
T
h
θ
(
x
1
x
3
)
)
)
)
p(X_{z_3}= x| x_{z1}x_{z2}) = p(X_4 =x|x_1x_3) = exp(e(x)^Th_{\theta}(x_1x_3))/(∑_{x^{'}}exp(e((x^{'})^Th_\theta(x_1x_3))))
p(Xz3=x∣xz1xz2)=p(X4=x∣x1x3)=exp(e(x)Thθ(x1x3))/(x′∑exp(e((x′)Thθ(x1x3))))
p
(
X
z
3
=
x
∣
x
z
1
x
z
2
)
=
p
(
X
2
=
x
∣
x
1
x
3
)
=
e
x
p
(
e
(
x
)
T
h
θ
(
x
1
x
3
)
)
/
(
∑
x
′
e
x
p
(
e
(
(
x
′
)
T
h
θ
(
x
1
x
3
)
)
)
)
p(X_{z_3}= x| x_{z1}x_{z2}) = p(X_2 =x|x_1x_3) = exp(e(x)^Th_{\theta}(x_1x_3))/(∑_{x^{'}}exp(e((x^{'})^Th_\theta(x_1x_3))))
p(Xz3=x∣xz1xz2)=p(X2=x∣x1x3)=exp(e(x)Thθ(x1x3))/(x′∑exp(e((x′)Thθ(x1x3))))
我们会发现这两个排列的概率是相等的,但是真实情况不是,所以我们需要加入位置编码:
p
(
X
z
t
=
x
∣
X
z
<
t
)
=
e
x
p
(
e
(
x
)
T
h
θ
(
x
z
<
t
,
z
t
)
)
/
(
∑
x
′
e
x
p
(
e
(
(
x
′
)
T
h
θ
(
x
z
<
t
,
z
t
)
)
)
)
p(X_{z_t}= x| X_{z_{<t}}) = exp(e(x)^Th_{\theta}(x_{z_{<t}}, z_t))/(∑_{x^{'}}exp(e((x^{'})^Th_\theta(x_{z_{<t}},z_t))))
p(Xzt=x∣Xz<t)=exp(e(x)Thθ(xz<t,zt))/(x′∑exp(e((x′)Thθ(xz<t,zt))))
还有一个问题没有解决,transformer没有办法满足在只提供当前token位置编码的同时又为后面的token提供完整的编码表示(同时含有位置向量和之前token的内容向量)。所以引入了two-stream:
内容隐变量
h
θ
(
X
z
<
t
)
)
简
写
为
h
z
t
h_{\theta}(X_{z_{<t}}))简写为h_{z_t}
hθ(Xz<t))简写为hzt:和标准的transformer一样既编码位置向量又编码内容向量
位置隐变量
g
θ
(
X
z
<
t
)
简
写
为
g
z
t
g_{\theta}(X_{z_{<t}})简写为g_{z_t}
gθ(Xz<t)简写为gzt:只编码上下文需要的位置向量,不编码内容向量
X
z
t
X_{z_t}
Xzt
h
z
t
m
=
A
t
t
e
n
t
i
o
n
(
Q
←
h
z
t
m
−
1
,
K
V
←
h
z
<
t
m
−
1
;
θ
)
c
o
n
t
e
n
t
流
,
可
以
使
用
Z
t
和
X
z
t
h_{z_t}^m = Attention(Q← h_{z_t}^{m-1}, KV←h_{z_{<t}}^{m-1};\theta) content流, 可以使用Z_t和X_{z_t}
hztm=Attention(Q←hztm−1,KV←hz<tm−1;θ)content流,可以使用Zt和Xzt
g
z
t
m
=
A
t
t
e
n
t
i
o
n
(
Q
←
g
z
t
m
−
1
,
K
V
←
h
z
<
=
t
m
−
1
;
θ
)
Q
u
e
r
y
流
,
可
以
使
用
Z
t
但
是
不
能
使
用
内
容
g_{z_t}^m = Attention(Q← g_{z_t}^{m-1}, KV←h_{z_{<=t}}^{m-1};\theta)Query流, 可以使用Z_t但是不能使用内容
gztm=Attention(Q←gztm−1,KV←hz<=tm−1;θ)Query流,可以使用Zt但是不能使用内容
四、部分预测
我们把一个句子拆成两个子序列 Z < = c Z_{<=c} Z<=c和 Z > c Z_{>c} Z>c,分别叫做non-target序列和target序列,其中c是分割点,使用一个超参数K,表示1/K的token被预测: ( ∣ z ∣ − c ) / ∣ z ∣ = 1 / k (|z| - c)/|z| = 1/k (∣z∣−c)/∣z∣=1/k, 因为k是整数, k ≈ ∣ z ∣ / ( ∣ z ∣ − c ) k≈|z|/(|z| - c) k≈∣z∣/(∣z∣−c),前c个token不用计算Query,就节省了时间。比如对于I like New York ,没有上下文,有很多种可能,而当New 被知道之后,那么York的概率就很大了,
五、融入transformer-xl的思想
首先,因为transformer的输入需要是定长的,不足的Padding,超出的截断,把一个语料库进行截断会出现以下问题:
- 有定长的原因我们不能让输入太长,虽然self-attention机制不受长度的约束,但是transformer模型能够考虑的长度就是输入的长度
- 当一个被截断的句子输入到模型,得到的这个句子是不完整的,由于语言模型是自回归的,一步错步步错
- 预测新能的问题,使用transformer模型进行计算下一句的概率需要先计算p(x1),然后计算p(x2|x1),不能像rnn一样把一句话的概率编码到一个content向量中。
为了解决这些问题,获取长距离的依赖关系,第L层的表征同时来至于第L-1层的 S i − 1 S_{i-1} Si−1 和 S i S_i Si片段,但是这么一来就不可以使用原来的位置编码方式了。不然 S i − 1 S_{i-1} Si−1的第一个词和 S i S_i Si共享一个位置编码会引起歧义
-
transformer还有一个问题,比如当长度限制在4,当我们预测x6需要根据[x3, x4, x5]计算,当预测x7的时候需要根据[x4, x5, x6]计算,之前的计算结果没有用上,所以transformer-xl讲每个segment计算结果都保留在cache中(但是不参与梯度计算),当计算[x5, x6, x7, x8] 的时候我们可以利用上[x1, x2, x3, x4]的计算结果。
-
虽然计算梯度的时候只计算本segment的梯度,但是会重启之前存储在cache中的segment(只要内存够大)。加入两个相邻的segment: S τ = [ x τ , 1 , x τ , 2 , x τ , 3 , x τ , 4 ] 、 S τ + 1 = [ x τ + 1 , 1 , x τ = 1 , 2 , x τ + 1 , 3 , x τ + 1 , 4 ] , 设 S τ 第 n 层 隐 状 态 序 列 为 h τ n ∈ R L × d S_{τ} = [x_{τ,1}, x_{τ,2}, x_{τ,3}, x_{τ,4}]、S_{τ+1} = [x_{τ+1,1}, x_{τ=1,2}, x_{τ+1,3}, x_{τ+1,4}],设S_τ第n层隐状态序列为h_τ^n∈R^{L×d} Sτ=[xτ,1,xτ,2,xτ,3,xτ,4]、Sτ+1=[xτ+1,1,xτ=1,2,xτ+1,3,xτ+1,4],设Sτ第n层隐状态序列为hτn∈RL×d,那么计算 S τ + 1 S_{τ+1} Sτ+1的隐状态的过程如下:
SG(h)表示h不参与梯度计算, -
因为位置编码只在自注意力算子中起作用,所以可以把位置编码从自注意力权重中拆解出来,只在计算的时候加入位置编码,这可以解决transfomer随着层数的加深,输入的位置信息被过多的计算抹去的问题,transformer-xl使得xlnet可以建模更长的依赖关系。把之前的一个固定长度的词序列 [ x 1 , x 2 , x 3 , x 4 ] [x_1,x_2,x_3,x_4] [x1,x2,x3,x4]每一层的输出放入cahe中,在计算第二个segment [ x 5 , x 6 , x 7 , x 8 ] [x_5, x_6,x_7,x_8] [x5,x6,x7,x8]的时候就可以直接让self-attention参考[x_1,x_2,x_3,x_4]的信息。为了实现真正的"相对"位置编码,不仅要实现当前segment的单词的相对还要实现segment之间的相对。
建模多个segment
-当下游任务有多余一个输入序列,比如问答,这么在自回归模型下预训练两个segment呢?和bert类似,选择两个句子,有50%的概率是连续的,50%的可能是不连续的。然后把句子拼接成 [ A , S E P , B , S E P , C L S ] [A,SEP,B,SEP,CLS] [A,SEP,B,SEP,CLS],这里和bert的凭借不一样,因为之前说过了,我们为了减少计算量,排列语言模型通常只预测最后1/K个token,所以CLS需要编码之前的segment的语义,因此放在最后。而对bert来说self-attention唯一能感知位置是因为把位置信息编码到输入向量中了。还有与bert不同的是并没有加入预测下一句的task。因为通过实验分析这个task的加入并不总是有帮助的。
相对segment编码
bert使用的是绝对segment编码,第一个句子的segment id是0, 下一给是1。xlnet使用的是相对segment编码,在计算attention的时候判断两个词是否属于一个segment,如果位置i和位置j的词属于同一个segment,那么使用功能一个可以学习的embedding
s
i
j
=
s
+
s_{ij} = s_+
sij=s+ ,否者
s
i
j
=
s
−
s_{ij}= s_-
sij=s−,说白了就是只关心是否属于同一个segment。当我们从位置i attend ti j 的时候,计算这样一个新的attention score:
a
i
j
=
(
q
i
+
b
)
T
s
i
j
a_{ij} =(q_i + b)^Ts_{ij}
aij=(qi+b)Tsij,
q
i
q_i
qi表示第i位置的Query向量,b是一个可以学习的bias,最后把这个attention score 加入到原来见的attention score中,就可以学习到当i和j都属于某个segment的特征和ij属于不同segment的特征。
六、与bert的比较
-
xlne和bert都是预测一部分词但是bert使用的时去噪自编码语言模型,只能预测部分词,随机的选择一些词来预测。 而xlnet预测部分词是处于性能考虑。但是这个假设是不成立的,比如new york is a city之间是存在关联的,选择I like 来预测new york。那么bert的优化的目标函数是:
J b e r t = L o g P ( N e w ∣ i s , a , c i t y ) + L o g P ( Y o r k ∣ i s , a , c i t y ) J_{bert}=LogP(New | is, a ,city) + LogP(York| is ,a, city) Jbert=LogP(New∣is,a,city)+LogP(York∣is,a,city)
但是当xlnet的排列顺序为[is, a ,city, New, York]
那优化的目标函数是:
J x l n e t = L o g P ( N e w ∣ i s , a , c i t y ) + L o g P ( Y o r k ∣ N e w , i s , a , c i t y ) J_{xlnet}=LogP(New | is, a, city) + LogP(York| New, is, a, city) Jxlnet=LogP(New∣is,a,city)+LogP(York∣New,is,a,city)
Xlnet可以在预测york的时候利用New信息,所以可以学习到New York经常出现在一起而且他们出现在一起和单独出现的语义和单独出现是完全不同的。 -
xlnet的成功来源于:
分布式语义假设的有效性
:可以从语料的统计规律中习得尝试及语言的结构- 对语境更精细的建模:从
单向语境
到双向语境
,从短程依赖
到长距离依赖
,xlnet是目前对语境的建模最精细的模型 - 当模型容量够大时,数据的对数和性能提升在一定范围内接近正比,xlnet使用的预训练模型是公开模型里面最大的