赞
踩
一、语言模型(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)。
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
为原始文本被替换后的输入:
- 优点:能够很好的编码上下文语义信息(即考虑句子的双向信息), 在自然语言理解相关的下游任务上表现突出。
- 缺点:
排列语言模型(Permuted Language Modeling,PLM):
\quad
对基于上述三类语言模型的PTMs进行总结:
(2)基于对比(Contrastive Based)
\quad
不同于Context Based主要基于数据本身的上下文信息构造辅助任利用,Contrastive Based主要利用样本间的约束信息构造辅助任务,这类方法也是 Contrastive learning(CTL)。CTL假设观察到的文本对(正样本)在语义上比随机采样的文本(负样本)更相似。CTL 背后的原理是「在对比中学习」。相较于语言建模,CTL 的计算复杂度更低,因而在预训练中是理想的替代训练标准。主要分为以下四类,具体参考NLP算法面试必备!PTMs:NLP预训练模型的全面总结:
\quad
总结如下:
最后,对PTMs的架构设计进行展望:
二、两种预训练范式:feature-based & fine-tuning
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预训练模型的全面总结。侵删。
\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,这句话包含两点:
2)核心理解二:BERT的主要创新之Pretrain方法。
\quad BERT的创新性全部位于预训练方法中,即在预训练过程中引入了两个任务:Masked Language Model(MLM)+Next Sentence Prediction(NSP)。BERT也遵循fine-tuning范式,它的架构如下图。
3)核心理解三:DAE与Masked Language Model联系
4)核心理解四:BERT的输入
\quad
在模型输入的时候,并非是具体的单词,而是一些句子对,句子对中的每一个单词还会拆分成WordPiece再输入。
WordPiece: 如embedding这个单词,通过WordPiece会拆分成em、##be、##dd、##ing四个token,带有##前缀的token表示它是单词的一部分,且不在单词的开头,所以在词表里面bed、##bed,它们的含义是完全不一样的。引入WordPiece作为输入可以有效缓解OOV问题,且进一步增加词表的丰富度和表征能力。
Sentence Pairs:
Embedding制作: 每个embedding由以下三部分组成。
预训练语料:BooksCorpus(800M单词)和英语维基百科(2500M单词),一共约16G的语料。
5)核心理解四:BERT的优缺点
6)BERT的变体
参考:NLP】Google BERT模型原理详解、详解:一文读懂BERT模型。侵删。
\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>,整个预测任务才结束。
\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存在以下问题:
\quad 因此Transformer虽然相对于RNN能够建模更长的依赖关系,但是它仍限制于segment的长度内,对于超出这个范围的长距离依赖仍然是无法捕获的。反过来看RNN这种结构,虽然它建模依赖关系的距离很短,但是回想下它的建模机制,它可以将上个节点输出的隐层向量作为整个节点的表示,然后输入到下一节点中来充当上个节点的记忆,从而完成了节点之间依赖关系的建模。如果将Transformer中的segment看作是RNN中的节点,然后再采取RNN中的这种循环机制,那是不是就可以建模segment间的关系,从而建模更长距离的依赖了?
\quad 启发与此,Transformer-XL提出了以下两大技术:
\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_\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]。 s τ s_\tau sτ的隐藏状态节点为 h τ n ∈ R L × d h_\tau^n \in \mathbb{R}^{L \times d} hτn∈RL×d,其中d为维度,n表示层数。使用“片段递归机制”计算 s τ + 1 , s_{\tau+1}, sτ+1,的隐藏节点 h τ + 1 n h_{\tau+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 \times 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_{\tau}
sτ和
s
τ
+
1
s_{\tau+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 这里相对于绝对位置编码的公式,改进了以下几点:
\quad 因此,上式中的每一项分别代表的含义如下:
\quad
将上式合并后,得到最终公式如下:
\quad 总结,基于上述的两大技术,Transformer-XL拥有以下优点:
参考:面试百科之Transformer-XL讲解、Transformer模型详解(图解最完整版)、保姆级教程:图解Transformer、详解Transformer-XL。侵删。
\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 为什么要构造这两类向量?
\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博士杨植麟。侵删。
\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也被指出。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。