XLNet原理详解

2023-12-20 10:48
文章标签 详解 原理 xlnet

本文主要是介绍XLNet原理详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要为了做笔记,参考了以下文章(都讲的非常详细):
XLNet:运行机制及和Bert的异同比较
XLNet原理解读
XLNet原文链接

1. 什么是XLNet

XLNet是一个类似BERT的模型,而不是完全不同的模型,总之,XLNet是一种通用的自回归预训练方法,它是CMU和Google Brain团队在2019年6月份发布的模型,最终,XLNet 在 20 个任务上超过了 BERT 的表现,并在 18 个任务上取得了当前最佳效果(state-of-the-art),包括机器问答、自然语言推断、情感分析和文档排序。

作者表示,BERT 这样基于去噪自编码器的预训练模型可以很好地建模双向语境信息,性能优于基于自回归语言模型的预训练方法。然而,由于需要 mask 一部分输入,BERT 忽略了被 mask 位置之间的依赖关系,因此出现预训练和微调效果的差异(pretrain-finetune discrepancy)。

基于这些优缺点,该研究提出了一种泛化的自回归预训练模型 XLNet。XLNet 可以:
通过最大化所有可能的因式分解顺序的对数似然,学习双向语境信息;
用自回归本身的特点克服 BERT 的缺点;
此外,XLNet 还融合了当前最优自回归模型 Transformer-XL 的思路。

2.自回归语言模型(Autoregressive LM)

在ELMO/BERT出来之前,大家通常讲的语言模型其实是根据上文内容预测下一个可能跟随的单词,就是常说的自左向右的语言模型任务,或者反过来也行,就是根据下文预测前面的单词,这种类型的LM被称为自回归语言模型。GPT 就是典型的自回归语言模型。ELMO尽管看上去利用了上文,也利用了下文,但是本质上仍然是自回归LM,这个跟模型具体怎么实现有关系。ELMO是做了两个方向(从左到右以及从右到左两个方向的语言模型),但是是分别有两个方向的自回归LM,然后把LSTM的两个方向的隐节点状态拼接到一起,来体现双向语言模型这个事情的。所以其实是两个自回归语言模型的拼接,本质上仍然是自回归语言模型。

自回归语言模型有优点有缺点:
缺点是只能利用上文或者下文的信息,不能同时利用上文和下文的信息,当然,貌似ELMO这种双向都做,然后拼接看上去能够解决这个问题,因为融合模式过于简单,所以效果其实并不是太好。

优点其实跟下游NLP任务有关,比如生成类NLP任务,比如文本摘要,机器翻译等,在实际生成内容的时候,就是从左向右的,自回归语言模型天然匹配这个过程。而Bert这种DAE模式,在生成类NLP任务中,就面临训练过程和应用过程不一致的问题,导致生成类的NLP任务到目前为止都做不太好。

3. 自编码语言模型

自回归语言模型只能根据上文预测下一个单词,或者反过来,只能根据下文预测前面一个单词。相比而言,Bert通过在输入X中随机Mask掉一部分单词,然后预训练过程的主要任务之一是根据上下文单词来预测这些被Mask掉的单词,如果你对Denoising Autoencoder比较熟悉的话,会看出,这确实是典型的DAE的思路。那些被Mask掉的单词就是在输入侧加入的所谓噪音。类似Bert这种预训练模式,被称为DAE LM。

这种DAE LM的优缺点正好和自回归LM反过来,它能比较自然地融入双向语言模型,同时看到被预测单词的上文和下文,这是好处。缺点是啥呢?主要在输入侧引入[Mask]标记,导致预训练阶段和Fine-tuning阶段不一致的问题,因为Fine-tuning阶段是看不到[Mask]标记的。DAE吗,就要引入噪音,[Mask] 标记就是引入噪音的手段,这个正常。

XLNet的出发点就是:能否融合自回归LM和DAE LM两者的优点。就是说如果站在自回归LM的角度,如何引入和双向语言模型等价的效果;如果站在DAE LM的角度看,它本身是融入双向语言模型的,如何抛掉表面的那个[Mask]标记,让预训练和Fine-tuning保持一致。当然,XLNet还讲到了一个Bert被Mask单词之间相互独立的问题。

4. XLNet模型

4.1 排列语言模型(permutation language Modeling)

Bert的自编码语言模型也有对应的缺点,就是XLNet在文中指出的:

  1. 第一个预训练阶段因为采取引入[Mask]标记来Mask掉部分单词的训练模式,而Fine-tuning阶段是看不到这种被强行加入的Mask标记的,所以两个阶段存在使用模式不一致的情形,这可能会带来一定的性能损失;
  2. 另外一个是,Bert在第一个预训练阶段,假设句子中多个单词被Mask掉,这些被Mask掉的单词之间没有任何关系,是条件独立的,而有时候这些单词之间是有关系的。

上面两点是XLNet在第一个预训练阶段,相对Bert来说要解决的两个问题。

其实思路也比较简洁,可以这么思考:XLNet仍然遵循两阶段的过程,第一个阶段是语言模型预训练阶段;第二阶段是任务数据Fine-tuning阶段。它主要希望改动第一个阶段,就是说不像Bert那种带Mask符号的Denoising-autoencoder的模式,而是采用自回归LM的模式。就是说,看上去输入句子X仍然是自左向右的输入,看到Ti单词的上文Context_before,来预测Ti这个单词。但是又希望在Context_before里,不仅仅看到上文单词,也能看到Ti单词后面的下文Context_after里的下文单词,这样的话,Bert里面预训练阶段引入的Mask符号就不需要了。

XLNet是这么做的,在预训练阶段,引入Permutation Language Model的训练目标。什么意思呢?就是说,比如包含单词Ti的当前输入的句子X,由顺序的几个单词构成,比如 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3, x 4 x_4 x4四个单词顺序构成。我们假设,其中,要预测的单词Ti是 x 3 x_3 x3,位置在Position 3,要想让它能够在上文Context_before中,也就是Position 1或者Position 2的位置看到Position 4的单词 x 4 x_4 x4。可以这么做:假设我们固定住 x 3 x_3 x3所在位置,就是它仍然在Position 3,之后随机排列组合句子中的4个单词,在随机排列组合后的各种可能里,再选择一部分作为模型预训练的输入X。

首先,需要强调一点,尽管上面讲的是把句子X的单词排列组合后,再随机抽取例子作为输入,但是,实际上你是不能这么做的,因为Fine-tuning阶段你不可能也去排列组合原始输入。所以,就必须让预训练阶段的输入部分,看上去仍然是 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3, x 4 x_4 x4这个输入顺序,但是可以在Transformer部分做些工作,来达成我们希望的目标。

具体而言,XLNet采取了Attention掩码的机制,你可以理解为,当前的输入句子是X,要预测的单词 T i T_i Ti是第 i i i个单词,前面1到 i − 1 i-1 i1个单词,在输入部分观察,并没发生变化,该是谁还是谁。但是在Transformer内部,通过Attention掩码,从X的输入单词里面,也就是 T i T_i Ti的上文和下文单词中,随机选择 i − 1 i-1 i1个,放到 T i T_i Ti的上文位置中,把其它单词的输入通过Attention掩码隐藏掉,于是就能够达成我们期望的目标。

为了提供一个完整的概览图,研究者展示了一个在给定相同输入序列 x(但因式分解顺序不同)时预测 token x 3 x_3 x3 的示例,如下图所示:比如图的左上,对应的分解方式是3→2→4→1,因此预测 x 3 x_3 x3是不能attend to任何其它词,只能根据之前的隐状态memmem来预测。而对于左下, x 3 x_3 x3可以attend to其它3个词。
在这里插入图片描述

4.2 双流注意力机制

4.2.1 引例:

我们先看个例子:
假设整句话为 [“我 1”, “今天 2”, “很 3”,「开心 4」],我们只采样出一个样本 ([“今天 2”, “很 3”, “开心 4”] → “我 1” ),XLNet 的做法和 BERT 有同有异。

和 BERT 一样,XLNet 同样是将目标词 “我 1” 替换成一个特殊字符 “MASK1”。和 BERT 不同,“MASK” 不会纳入表征的地址向量 k 以及内容向量 v 的计算,“MASK” 自始至终只充当了查询向量 q 的角色,因此所有词的表征中都不会拿到 “MASK” 的信息。这也杜绝了 “MASK” 的引入带来的预训练-微调差异 (Pretrain-Finetune Discrepancy) – 这个改动也可以直接应用到 BERT 上面。

在下图中记 “MASK” 对应的词向量为 G,X_2 - X_4为各自的词向量,G1, H1 - H4 为各自的表征。图中省略了位置编码 p。
在这里插入图片描述
上面只是讨论最简单的情况 – 即一句话只产生一个样本。但我们还希望保证训练效率 – 我们想和自回归语言模型一样,只进行一次整句的表征计算便可以获得所有样本的语境表征。这时所有词的表征就必须同时计算,此时便有标签泄露带来的矛盾:对于某个需要预测的目标词,我们既需要得到包含它信息以及位置的表征 h h h (用来进一步计算其他词的表征),又需要得到不包含它信息,只包含它位置的表征 g g g (用来做语境的表征)。

一个很自然的想法就是同时计算两套表征,这便是 XLNet 提出的双通道自注意力 (Two Stream Self-Attention),同时计算内容表征通道 (Content Stream) h h h 和语境表征通道 (Query Stream) g g g

假设我们要计算第 1 个词在第 l 层的语境表征 g 1 l g_{1}^{l} g1l
和内容表征 h 1 l h_{1}^{l} h1l,我们只关注注意力算子查询向量 Q、地址向量 K 以及内容向量 V 的来源:
在这里插入图片描述

计算 g 1 l g_{1}^{l} g1l时用到了 h j ! = 1 l − 1 h_{j!=1}^{l-1} hj!=1l1,表示第 l − 1 l-1 l1 层除了第 1 个词外所有词的表征,这是为了保证标签不泄露;计算 h 1 l h_{1}^{l} h1l 时用到了 h : l − 1 h_{:}^{l-1} h:l1,表示第 l − 1 l-1 l1 层所有词的表征,这和标准的 Transformer 计算表征的过程一致。
在这里插入图片描述
但上述做法在堆叠多层自注意算子时仍然会带来标签泄露。

虽然计算 g 1 l g_{1}^{l} g1l时我们已经采取措施防止 h 1 l − 1 h_{1}^{l-1} h1l1
的信息泄露到 g 1 l g_{1}^{l} g1l 中,但是考虑两层自注意力算子的计算:
在这里插入图片描述

我们看到第 l − 2 l-2 l2 层第 1 个词的表征 h 1 l − 2 h_{1}^{l-2} h1l2会通过第 l − 1 l-1 l1 层的所有表征 h j l − 1 h_{j}^{l-1} hjl1泄露给 g 1 l g_{1}^{l} g1l。和将 Transformer 应用到自回归语言模型的情况类似,我们还需要对每层的注意力使用注意力掩码 (Attention Mask),根据选定的分解排列 z z z,将不合理的注意力权重置零。我们记 z t z_{t} zt 为分解排列中的第 t 个词,那我们在词 z t z_{t} zt 的表征时, g t l g_{t}^{l} gtl h t l h_{t}^{l} htl 分别只能看到排列中前 t − 1 t-1 t1 个词 z 1 : t − 1 z_{1:t-1} z1:t1 和前 t 个词 z 1 : t z_{1:t} z1:t,即:
在这里插入图片描述在如此做完注意力掩码后,所有 g z t l g_{z{t}}^l gztl 便可以直接用来预测词 z t z_{t} zt,而不会有标签泄露的问题。

我们来看另一个例子:
假设输入的句子是”I like New York”,并且一种排列为z=[1, 3, 4, 2],假设我们需要预测 z 3 = 4 z_3=4 z3=4,即预测第3个位置的词是“York”,那么根据公式:
在这里插入图片描述 p θ ( X 4 = x ) pθ(X_4=x) pθ(X4=x)表示第4个词是York的概率。用自然语言描述:上面的概率是第一个词是I,第3个词是New的条件下第4个词是York的概率。
另外我们再假设一种排列为 z ’ = [ 1 , 3 , 2 , 4 ] z’=[1,3,2,4] z=[1,3,2,4],我们需要预测 z 3 = 2 z_3=2 z3=2,即预测第3个位置的词是“like”,那么:
在这里插入图片描述
这上面是表示是第一个词是I,第3个词是New的条件下第2个词是York的概率。我们仔细对比一下公式会发现这两个概率是相等的。但是根据经验,显然这两个概率是不同的,而且上面的那个概率大一些,因为York跟在New之后是一个城市,而”York New”是什么呢?

上面的问题的关键是模型并不知道要预测的那个词在原始序列中的位置。注意:位置编码是和输入的Embedding加到一起作为输入的,因此 p θ ( X 4 = x ∣ x 1 x 3 ) pθ(X_4=x|x_1x_3) pθ(X4=xx1x3)里的x_1和x_3是带了位置信息的,模型(可能)知道(根据输入的向量猜测)I是第一个词,而New是第三个词,但是第四个词的向量显然这个是还不知道(知道了还要就不用预测了),因此就不可能知道它要预测的词到底是哪个位置的词,因此我们必须”显式”的告诉模型我要预测哪个位置的词。

为了后面的描述,我们再把上面的两个公式写出更加一般的形式。给定排列 z z z,我们需要计算 在这里插入图片描述如果我们使用普通的Transformer,那么计算公式为:
在这里插入图片描述根据前面的讨论,我们知道问题的关键是模型并不知道要预测的到底是哪个位置的词,为了解决这个问题,我们把预测的位置 z t z_t zt放到模型里:
在这里插入图片描述上式中 g θ ( X z < t , z t ) g_{\theta}{(X_z<t,z_t)} gθ(Xz<t,zt)表示这是一个新的模型g,并且它的参数除了之前的词 X z < t X_z<t Xz<t,还有要预测的词的位置 z t z_t zt

4.2.2 双流注意力机制

接下来的问题是用什么模型来表示 g θ ( X z < t , z t ) g_{\theta}{(X_z<t,z_t)} gθ(Xz<t,zt)。当然有很多种可选的函数(模型),我们这里通过位置 z t z_t zt来从context X z < t X_z<t Xz<t里通过Attention机制提取需要的信息来预测这个位置的词。那么它需要满足如下两点要求:

  • 为了预测 X z t X_{zt} Xzt, g θ ( X z < t , z t ) g_{\theta}{(X_z<t,z_t)} gθ(Xz<t,zt)只能使用位置信息 z t z_t zt。而不能使用 X z t X_{zt} Xzt。这是显然的:你预测一个词当然不能知道要预测的是什么词。

  • 为了预测 z t z_t zt之后的词, g θ ( X z < t , z t ) g_{\theta}{(X_z<t,z_t)} gθ(Xz<t,zt)必须编码了 X z t X_{zt} Xzt的信息(语义)。

为了解决这个问题,论文引入了两个Stream,也就是两个隐状态:

  • 内容隐状态 h θ ( X z < t ) h_{\theta}{(X_z<t)} hθ(Xz<t),简写为 h z t h_{zt} hzt,它就和标准的Transform一样,即编码上下文(context)也编码 x z t x_zt xzt的内容。
  • 查询隐状态 g θ ( X z < t , z t ) g_{\theta}{(X_z<t,z_t)} gθ(Xz<t,zt),简写为 g z t g_zt gzt,它只编码上下文和要预测的位置 z t z_t zt,但是不包含 x z t x_{zt} xzt

下面我们介绍一下计算过程。我们首先把查询隐状态 g i ( 0 ) g_i^{(0)} gi(0)初始化为一个变量w,把内容隐状态 h i ( 0 ) h_i^{(0)} hi(0)初始化为词的Embedding e ( x i ) e(x_i) e(xi) 。这里的上标0表示第0层(不存在的层,用于计算第一层)。因为内容隐状态可以编码当前词,因此初始化为词的Embedding是比较合适的。
接着从m=1一直到第M层,我们逐层计算:
在这里插入图片描述
上面两个流分别使用自己的Query向量 g z t g_{zt} gzt h z t h_{zt} hzt;但是Key和Value向量都是用的h,因为h是内容。但是注意Query流不能访问 z t z_t zt的内容,因此KV是 h z < t ( m − 1 ) h_{z<t}^{(m-1)} hz<t(m1),这里用的<表示不包括t时刻的content。而Content流的KV的是 h z ≤ t ( m − 1 ) h_{z\leq t}^{(m-1)} hzt(m1), 它包含 x z t x_{zt} xzt
上面的梯度更新和标准的self-attention是一样的。在fine-tuning的时候,我们可以丢弃掉Query流而只用Content流。最后在计算公式的时候我们可以用最上面一层的Query向量 g z t M g_{zt}^M gztM
下面我们通过下图直观的了解计算过程。
在这里插入图片描述
图的左上是Content流和Attention流的计算,假设排列为 3 → 2 → 4 → 1 3 \rightarrow2\rightarrow4\rightarrow1 3241,并且我们现在预测的第1个位置词的概率。根据排列,我们可以参考所有4个词的信息,因此 K V = [ h 1 ( 0 ) , h 2 ( 0 ) , h 3 ( 0 ) , h 4 ( 0 ) ] KV=[h_1^{(0)},h_2^{(0)},h_3^{(0)},h_4^{(0)}] KV=[h1(0),h2(0),h3(0),h4(0)],而 Q = h 1 ( 0 ) Q=h_1^{(0)} Q=h1(0)

左下是Query流的计算,因为不能参考自己的内容,因此 K V = [ h 2 ( 0 ) , h 3 ( 0 ) , h 4 ( 0 ) ] KV=[h_2^{(0)},h_3^{(0)},h_4^{(0)}] KV=[h2(0),h3(0),h4(0)],而 Q = g 1 ( 0 ) Q=g_1^{(0)} Q=g1(0)

上图的右边是完整的计算过程,我们通过下图更清楚的分析,从上往下看,首先 h h h g g g分别被初始化为 e ( x i ) e(x_i) e(xi) W W W,然后Content Mask和Query Mask计算第一层输出 h ( 1 ) h^{(1)} h(1) g ( 1 ) g^{(1)} g(1),然后计算第二层…。最右边的Content Mask和Query Mask,我们先把坐标添上去,这是原始的词序列(我们看到的输入),对于Content Mask,它的第一行全是红点,表示第一个词可以attend to所有的词,第二个词可以attend to它自己和第三个词,…。而Query Mask和Content Mask的区别就是不能attend to自身,因此对角线都是白点。
在这里插入图片描述

4.2.3 部分预测

虽然排列语言模型有很多点,但是它的计算量和大(排列很多),很难优化。因此我们只预测一个句子的一些词,为什么不预测前面的词?因为前面的词的上下文比较少,上下文信息相对较少。比如句子“I like New York”。预测I的时候没有任何上下文,因此可能的选择很多。而到最后一个词York的时候,如果New已经知道了,那么York的概率就非常大了。

因此我们把一个排列 z z z分成两个子序列 z ≤ c z\leq c zc z > c z>c z>c,分别叫做non-target序列和target序列,其中 c c c是切分点。我们会使用一个超参数K,表示 1 / K 1/K 1/K的token会被预测,因此根据公式:
∣ z ∣ − c ∣ z ∣ = 1 K \frac{|z|-c}{|z|}=\frac{1}{K} zzc=K1。可以计算出 K ≈ ∣ z ∣ − c ∣ z ∣ K\approx \frac{|z|-c}{|z|} Kzzc,约等于的原因是因为 K K K是整数。前面 c c c个不用预测的Token,我们不需要计算其Query流,从而节省计算时间。

4.3Transform-XL

4.3.1 Transform

Al-Rfou等人基于Transformer提出了一种训练语言模型的方法,来根据之前的字符预测片段中的下一个字符。例如,它使用 x 1 , x 2 , . . . , x n − 1 x_1,x_2,...,x_n−1 x1,x2,...,xn1预测字符 x n x_n xn,而在 xn 之后的序列则被mask掉。论文中使用64层模型,并仅限于处理 512个字符这种相对较短的输入,因此它将输入分成段,并分别从每个段中进行学习,如下图所示。 在测试阶段如需处理较长的输入,该模型会在每一步中将输入向右移动一个字符,以此实现对单个字符的预测。
在这里插入图片描述
该模型在常用的数据集如enwik8和text8上的表现比RNN模型要好,但它仍有以下缺点:

  • 上下文长度受限:字符之间的最大依赖距离受输入长度的限制,模型看不到出现在几个句子之前的单词。
  • 上下文碎片:对于长度超过512个字符的文本,都是从头开始单独训练的。段与段之间没有上下文依赖性,会让训练效率低下,也会影响模型的性能。
  • 推理速度慢:在测试阶段,每次预测下一个单词,都需要重新构建一遍上下文,并从头开始计算,这样的计算速度非常慢。

4.3.2 Transform XL

Transformer-XL架构在vanilla Transformer的基础上引入了两点创新:循环机制(Recurrence Mechanism)和相对位置编码(Relative Positional Encoding),以克服vanilla Transformer的缺点。与vanilla Transformer相比,Transformer-XL的另一个优势是它可以被用于单词级和字符级的语言建模。

  1. 引入循环机制
    与vanilla Transformer的基本思路一样,Transformer-XL仍然是使用分段的方式进行建模,但其与vanilla Transformer的本质不同是在于引入了段与段之间的循环机制,使得当前段在建模的时候能够利用之前段的信息来实现长期依赖性。如下图所示:
    在这里插入图片描述
    在训练阶段,处理后面的段时,每个隐藏层都会接收两个输入:
  • 该段的前面隐藏层的输出,与vanilla Transformer相同(上图的灰色线)。
  • 前面段的隐藏层的输出(上图的绿色线),可以使模型创建长期依赖关系。

这两个输入会被拼接,然后用于计算当前段的Key和Value矩阵。该方法可以利用前面更多段的信息,测试阶段也可以获得更长的依赖。在测试阶段,与vanilla Transformer相比,其速度也会更快。在vanilla Transformer中,一次只能前进一个step,并且需要重新构建段,并全部从头开始计算;而在Transformer-XL中,每次可以前进一整个段,并利用之前段的数据来预测当前段的输出。

  1. 相对位置编码
    在Transformer中,一个重要的地方在于其考虑了序列的位置信息。在分段的情况下,如果仅仅对于每个段仍直接使用Transformer中的位置编码,即每个不同段在同一个位置上的表示使用相同的位置编码,就会出现问题。比如,第 i − 2 i−2 i2段和第 i − 1 i−1 i1段的第一个位置将具有相同的位置编码,但它们对于第iii段的建模重要性显然并不相同(例如第 i − 2 i−2 i2段中的第一个位置重要性可能要低一些)。因此,需要对这种位置进行区分。

论文对于这个问题,提出了一种新的位置编码的方式,即会根据词之间的相对距离而非像Transformer中的绝对位置进行编码。从另一个角度来解读公式的话,可以将attention的计算分为如下四个部分:

  • 基于内容的“寻址”,即没有添加原始位置编码的原始分数。
  • 基于内容的位置偏置,即相对于当前内容的位置偏差。
  • 全局的内容偏置,用于衡量key的重要性。
  • 全局的位置偏置,根据query和key之间的距离调整重要性。

详细公式见:Transformer-XL解读(论文 + PyTorch源码)
或者博客:XLNet代码分析(三)

4.4 XLNet与Bert比较

  • Bert是直接在输入端显示地通过引入Mask标记,在输入侧隐藏掉一部分单词,让这些单词在预测的时候不发挥作用,要求利用上下文中其它单词去预测某个被Mask掉的单词。
  • XLNet则抛弃掉输入侧的Mask标记,通过Attention Mask机制,在Transformer内部随机Mask掉一部分单词(这个被Mask掉的单词比例跟当前单词在句子中的位置有关系,位置越靠前,被Mask掉的比例越高,位置越靠后,被Mask掉的比例越低),让这些被Mask掉的单词在预测某个单词的时候不发生作用。
  • Bert隐藏了15%的词,用85%去预测15%的词。缺少了15%的词中的关联性。
  • XLNet是通过整个上下文去预测某个词,这样的词的利用率更高,理论上效果更好。

5 总结

文章最后的分析很好地证明了乱序语言模型和Transformer-XL主干网络带来的提升。这部分实验采用和BERT一致的训练数据。以BERT为基础,将BERT的主干网络从Transformer换成Transformer-XL后,在需要建模较长上下文的阅读理解任务RACE和SQuAD2.0均有比较明显地提升(对比1&2行)。而在此基础上加上乱序语言模型后,在所有任务上都有不同程度的提升 (对比 2&3 行)。
在这里插入图片描述
自词向量到如今以XLNet为代表的预训练语言模型,他们的主要区别在于对语境的不同粒度的建模:
在这里插入图片描述
XLNet成功的因素:

  • 与Bert采取De-noising Autoencoder方式不同的新的预训练目标:Permutation Language Model(简称PLM);这个可以理解为在自回归LM模式下,如何采取具体手段,来融入双向语言模型。这个是XLNet在模型角度比较大的贡献,确实也打开了NLP中两阶段模式潮流的一个新思路。
  • 引入了Transformer-XL的主要思路:相对位置编码以及分段RNN机制。实践已经证明这两点对于长文档任务是很有帮助的。
  • 加大增加了预训练阶段使用的数据规模;Bert使用的预训练数据是BooksCorpus和英文Wiki数据,大小13G。XLNet除了使用这些数据外,另外引入了Giga5,ClueWeb以及Common Crawl数据,并排掉了其中的一些低质量数据,大小分别是16G,19G和78G。可以看出,在预训练阶段极大扩充了数据规模,并对质量进行了筛选过滤。这个明显走的是GPT2.0的路线。

这篇关于XLNet原理详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/515759

相关文章

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

Jitter Injection详解

一、定义与作用 Jitter Injection,即抖动注入,是一种在通信系统中人为地添加抖动的技术。该技术通过在发送端对数据包进行延迟和抖动调整,以实现对整个通信系统的时延和抖动的控制。其主要作用包括: 改善传输质量:通过调整数据包的时延和抖动,可以有效地降低误码率,提高数据传输的可靠性。均衡网络负载:通过对不同的数据流进行不同程度的抖动注入,可以实现网络资源的合理分配,提高整体传输效率。增

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

探索Elastic Search:强大的开源搜索引擎,详解及使用

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选,相信大家多多少少的都听说过它。它可以快速地储存、搜索和分析海量数据。就连维基百科、Stack Overflow、

数据库原理与安全复习笔记(未完待续)

1 概念 产生与发展:人工管理阶段 → \to → 文件系统阶段 → \to → 数据库系统阶段。 数据库系统特点:数据的管理者(DBMS);数据结构化;数据共享性高,冗余度低,易于扩充;数据独立性高。DBMS 对数据的控制功能:数据的安全性保护;数据的完整性检查;并发控制;数据库恢复。 数据库技术研究领域:数据库管理系统软件的研发;数据库设计;数据库理论。数据模型要素 数据结构:描述数据库

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述   在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特点和优势,适用于不同的应用场景和需求。   Kafka 是一个高性能、可扩展的分布式消息队列系统,被设计用于处理大规模的数据流和实时数据传输。它

计算机组成原理——RECORD

第一章 概论 1.固件  将部分操作系统固化——即把软件永恒存于只读存储器中。 2.多级层次结构的计算机系统 3.冯*诺依曼计算机的特点 4.现代计算机的组成:CPU、I/O设备、主存储器(MM) 5.细化的计算机组成框图 6.指令操作的三个阶段:取指、分析、执行 第二章 计算机的发展 1.第一台由电子管组成的电子数字积分和计算机(ENIAC) 第三章 系统总线

Linux中拷贝 cp命令中拷贝所有的写法详解

This text from: http://www.jb51.net/article/101641.htm 一、预备  cp就是拷贝,最简单的使用方式就是: cp oldfile newfile 但这样只能拷贝文件,不能拷贝目录,所以通常用: cp -r old/ new/ 那就会把old目录整个拷贝到new目录下。注意,不是把old目录里面的文件拷贝到new目录,

GaussDB关键技术原理:高性能(二)

GaussDB关键技术原理:高性能(一)从数据库性能优化系统概述对GaussDB的高性能技术进行了解读,本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。 2 查询处理综述 内容概要:本章节介绍查询端到端处理的执行流程,首先让读者对查询在数据库内部如何执行有一个初步的认识,充分理解查询处理各阶段主要瓶颈点以及对应的解决方案,本章以GaussDB为例讲解查询执行的几个主要阶段