深度学习进阶篇 - 预训练模型[2]:Transformer-XL、Longformer、GPT 原理、模型构造、利用场景、改良技巧等具体解说
1.Transformer-XL:Attentive Language Models Beyonds a Fixed-Length Context
1.1. Transformer-XL 简介
在正式探讨 Transformer-XL 之前,咱们先来看看经典的 Transformer(后文称 Vanilla Transformer)是如何解决数据和训练评估模型的,如 图 1 所示。
图 1 Vanilla Transformer 训练和评估阶段
在 数据处理 方面,给定一串较长的文本串,Vanilla Transformer 会依照固定的长度(比方 512),间接将该文本串进行划分成若干 Segment。这个解决形式不会关注文本串中语句自身的边界(比方标点或段落),这样”粗犷”的划分通常会将一句残缺的话切分到两个 Segment 外面,导致上下文碎片化(context fragmentation)。另外,Transformer 自身可能维持的依赖长度很有可能会超出这个固定的 划分长度,从而导致 Transformer 可能捕捉的最大依赖长度不超过这个划分长度,Transformer 自身达不到更好的性能。
在 模型训练 方面,如 图 1a 所示,Vanilla Transformer 每次传给模型一个 Segment 进行训练,第 1 个 Segment 训练实现后,传入第 2 个 Segment 进行训练,然而前后的这两个 Segment 是没有任何分割的,也就是前后的训练是独立的。但事实是前后的 Segment 其实是有关联的。
在 模型评估 方面,如 图 1b 所示,Vanilla Transformer 会采纳同训练阶段统一的 划分长度,但仅仅预测最初一个地位的 token,实现之后,整个序列向后挪动一个地位,预测下一个 token。这个解决形式保障了模型每次预测都能应用足够长的上下文信息,也缓解了训练过程中的 context framentation 问题。然而每次的 Segment 都会从新计算,计算代价很大。
基于上边的这些有余,Transformer-XL 被提出来解决这些问题。它次要提出了两个技术:Segment-Level 循环机制 和绝对地位编码。Transformer-XL 可能建模更长的序列依赖,比 RNN 长 80%,比 Vanilla Transformer 长 450%。同时具备更快的评估速度,比 Vanilla Transformer 快 1800 + 倍。同时在多项工作上也达到了 SoTA 的成果。
1.2. Transformer-XL 建模更长序列
1.2.1 Segment-Level 循环机制
Transformer-XL 通过引入 Segment-Level recurrence mechanism 来建模更长序列,它通过交融前后两个 Segment 的信息来到这个目标。
这里循环机制和 RNN 循环机制相似,在 RNN 中,每个时刻的 RNN 单元会接管上个时刻的输入和以后时刻的输出,而后将两者交融计算得出以后时刻的输入。Transformer-XL 同样是接管上个时刻的输入和以后时刻的输出,而后将两者交融计算得出以后时刻的输入。然而两者的解决单位并不相同,RNN 的解决单位是一个词,Transformer-XL 的解决单位是一个 Segment。图 2 展现了 Transformer-XL 在训练阶段和评估阶段的 Segment 解决形式。
图 2 Transformer-XL 的训练和评估阶段
在 模型训练 阶段,如 图 2a 所示,Transformer-XL 会缓存前一个 Segment 的输入序列,在计算下一个 Segment 的输入时会应用上一个 Segment 的缓存信息,将前后不同 Segment 的信息进行交融,可能帮忙模型看见更远的中央,建模更长的序列依赖能力,同时也防止了 context fragmentation 问题。
在 模型评估 阶段,如 图 2b 所示,Transformer-XL 通过缓存前一个 Segment 的输入序列,当下一个 Segment 须要用这些输入时(前后两个 Segment 具备大部分的反复),不须要从新计算,从而放慢了推理速度。
下边咱们来具体聊聊这些事件是怎么做的,假如前后的两个 Segment 别离为:$\text{s}_{\tau}=[x_{\tau,1},x_{\tau,2},…,x_{\tau,L}]$ 和 $\text{s}_{\tau+1}=[x_{\tau+1,1},x_{\tau+1,2},…,x_{\tau+1,L}]$,其中序列长度为 $L$。另外假设 $h_{\tau}^n \in \mathbb{R}^{L \times d}$ 为由 $\text{s}_{\tau}$ 计算得出的第 $n$ 层的状态向量,则下一个 Segment $\text{s}_{\tau+1}$ 的第 $n$ 层可依照如下形式计算:
$$ \begin{align} & \tilde{h}_{\tau+1}^{n-1} = \left[\text{SG}(h_{\tau}^{n-1}) \; \circ \;h_{\tau+1}^{n-1} \right] \\ & q_{\tau+1}^{n}, \; k_{\tau+1}^n, \; v_{\tau+1}^n = h_{\tau+1}^{n-1}W_{q}^{\mathrm{ T}}, \; \tilde{h}_{\tau+1}^{n-1}W_{k}^{\mathrm{ T}}, \; \tilde{h}_{\tau+1}^{n-1}W_{v}^{\mathrm{ T}} \\ & h_{\tau+1}^n = \text{Transformer-Layer}(q_{\tau+1}^{n}, \; k_{\tau+1}^n, \; v_{\tau+1}^n) \end{align} $$
其中,$\text{SG}(h_{\tau}^{n-1})$ 示意不应用梯度,$\left[\text{SG}(h_{\tau}^{n-1}) \; \circ \;h_{\tau+1}^{n-1} \right]$ 示意将前后两个 Segment 的输入向量在序列维度上进行拼接。两头的公式示意获取 Self-Attention 计算中相应的 $q,k,v$ 矩阵,其中在计算 $q$ 的时候仅仅应用了以后 Segment 的向量,在计算 $k$ 和 $v$ 的时候同时应用前一个 Segment 和以后 Segment 的信息。最初通过 Self-Attention 交融计算,得出以后 Segment 的输入向量序列。
1.2.2 绝对地位编码
Segment-Level recurrence mechanism 看起来曾经做到了长序列建模,然而这里有个问题须要进一步讨论一下。咱们晓得,在 Vanilla Transformer 应用了相对地位编码,咱们来看看如果将相对地位编码利用到 Segment-Level recurrence mechanism 中会怎么。
还是假如前后的两个 Segment 别离为:$\text{s}_{\tau}=[x_{\tau,1},x_{\tau,2},…,x_{\tau,L}]$ 和 $\text{s}_{\tau+1}=[x_{\tau+1,1},x_{\tau+1,2},…,x_{\tau+1,L}]$,其中序列长度为 $L$。每个 Segment 的 Position Embedding 矩阵为 $U_{1:L} \in \mathbb{R}^{L \times d}$, 每个 Segment $\text{s}_{\tau}$ 的词向量矩阵为 $E_{\text{s}_{\tau}} \in \mathbb{R}^{L \times d}$,在 Vanilla Transformer 中,两者相加输出模型参加计算,如下式所示:
$$ h_{\tau+1} = f(h_{\tau},\; E_{\text{s}_{\tau+1}}+U_{1:L}) \\ h_{\tau} = f(h_{\tau-1},\; E_{\text{s}_{\tau}}+U_{1:L}) $$
很显著,如果依照这个形式计算,前后两个段 $E_{\text{s}_{\tau}}$ 和 $E_{\text{s}_{\tau+1}}$ 将具备雷同的地位编码,这样两者信息交融的时候必定会造成地位信息凌乱。为了防止这份难堪的操作,Transformer-XL 应用了 绝对地位编码。
绝对地位 是通过计算两个 token 之间的间隔定义的,例如第 5 个 token 绝对第 2 个 token 之间的间隔是 3,那么地位 $i$ 绝对地位 $j$ 的间隔是 $i-j$,假如序列之中的最大绝对间隔 $L_{max}$,则咱们能够定义这样的一个绝对地位矩阵 $R \in \mathbb{R}^{L_{max} \times d}$,其中 $R_k$ 示意两个 token 之间间隔是 $k$ 的绝对地位编码向量。留神在 Transformer-XL 中,绝对地位编码向量不是可训练的参数,以 $R_k = [r_{k,1}, r_{k,2},…,r_{k,d}]$ 为例,每个元素通过如下模式生成:
$$r_{b,2j} = \text{sin}(\frac{b}{10000^{2j/d}}), \quad r_{b,2j+1} = \text{cos}(\frac{b}{10000^{(2j)/d}})$$
Transformer-XL 将绝对地位编码向量融入了 Self-Attention 机制的计算过程中,这里可能会有些简单,咱们先来看看 Vanilla Transformer 的 Self-Attention 计算过程,如下:
$$ \begin{align} A_{i,j}^{\text{abs}} &= (W_q(E_{x_i}+U_i))^{\text{T}}(W_k(E_{x_j}+U_j))) \\ &= \underbrace {E_{x_i}^{\text{T}} W_q^{\text{T}} W_k E_{x_j}}_{(a)} + \underbrace {E_{x_i}^{\text{T}} W_q^{\text{T}} W_k U_j}_{(b)} + \underbrace {U_{i}^{\text{T}} W_q^{\text{T}} W_k E_{x_j}}_{(c)} + \underbrace {U_{i}^{\text{T}} W_q^{\text{T}} W_k U_{j}}_{(d)} \end{align} $$
其中 $E_{x_i}$ 示意 token $x_i$ 的词向量,$U_i$ 示意其相对地位编码,依据这个开展公式,Transformer-XL 将绝对地位编码信息融入其中,如下:
$$\begin{align} A_{i,j}^{\text{rel}} = \underbrace {E_{x_i}^{\text{T}} W_q^{\text{T}} W_{k,E} E_{x_j}}_{(a)} + \underbrace {E_{x_i}^{\text{T}} W_q^{\text{T}} W_{k,R} R_{i-j}}_{(b)} + \underbrace {u^{\text{T}} W_{k,E} E_{x_j}}_{(c)} + \underbrace {v^{\text{T}} W_{k,R} R_{i-j}}_{(d)} \end{align}$$
这里做了这样几处扭转以融入绝对地位编码:
- 在分项 $(b)$ 和 $(d)$ 中,应用绝对地位编码 $R_{i-j}$ 取代相对地位编码 $U_j$。
- 在分项 $(c)$ 和 $(d)$ 中,应用可训练参数 $u$ 和 $v$ 取代 $U_{i}^{\text{T}} W_q^{\text{T}}$。因为 $U_{i}^{\text{T}} W_q^{\text{T}}$ 示意第 $i$ 个地位的 query 向量,这个 query 向量对于其余要进行 Attention 的地位来说都是一样的,因而能够间接应用对立的可训练参数进行替换。
- 在所有分项中,应用 $W_{k,E}$ 和 $W_{k,R}$ 计算基于内容 (词向量) 的 key 向量和基于地位的 key 向量。
式子中的每个分项别离代表的含意如下:
- $(a)$ 形容了基于内容的 Attention
- $(b)$ 形容了内容对于每个绝对地位的 bias
- $(c)$ 形容了内容的全局 bias
- $(d)$ 形容了地位的全局 bias
1.2.3 残缺的 Self-Attention 计算过程
上边形容了 Transformer-XL 中的两个核心技术:Segment-Level 循环机制 和绝对地位编码,引入了这两项技术之后,Transformer-XL 中从第 $n-1$ 层到第 $n$ 层残缺的计算过程是这样的:
$$ \begin{align} \tilde{h}_{\tau}^{n-1} &= \left[\text{SG}(h_{\tau-1}^{n-1}) \; \circ \;h_{\tau}^{n-1} \right] \\ q_{\tau}^{n}, \; k_{\tau}^n, \; v_{\tau}^n &= h_{\tau}^{n-1}{W_{q}^n}^{\mathrm{ T}}, \; \tilde{h}_{\tau}^{n-1}{W_{k,E}^n}^{\mathrm{ T}}, \; \tilde{h}_{\tau}^{n-1}{W_{v}^n}^{\mathrm{ T}} \\ A_{\tau,i,j}^{n} &= {q_{\tau, i}^{n}}^{\text{T}}k_{\tau,j}^{n} + {q_{\tau, i}^{n}}^{\text{T}}W_{k,R}^{n}R_{i-j} + u^{\text{T}}k_{\tau,j} + v^{\text{T}}W_{k,R}^{n}R_{i-j} \\ {\alpha}_{\tau}^n &= \text{Masked-Softmax}(A_{\tau}^n)v_{\tau}^n \\ {\omicron}_{\tau}^n & = \text{LayerNorm}(\text{Linear}({\alpha}_{\tau}^n)+h_{\tau}^{n-1}) \\ h_{\tau}^n &= \text{Positionwise-Feed-Forward}({\omicron}_{\tau}^n) \end{align} $$
- 相干材料:
- Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
- Transformer-XL Github
2.Longformer: The Long-Document Transformer
2.1. Longformer 简介
目前基于 Transformer 的预训练模型在各项 NLP 工作纷纷获得更好的成果,这些胜利的局部起因在于 Self-Attention 机制,它运行模型可能疾速便捷地从整个文本序列中捕捉重要信息。然而传统的 Self-Attention 机制的时空复杂度与文本的序列长度呈 平方 的关系,这在很大水平上限度了模型的输出不能太长,因而须要将过长的文档进行截断传入模型进行解决,例如 BERT 中可能承受的最大序列长度为 512。
基于这些思考,Longformer 被提出来拓展模型在长序列建模的能力,它提出了一种时空复杂度同文本序列长度呈 线性 关系的 Self-Attention,用以保障模型应用更低的时空复杂度建模长文档。
这里须要留神的是 Longformer 是 Transformer 的 Encoder 端。
2.2 Longformer 提出的 Self-Attention
Longformer 对长文档建模次要的改良是提出了新的 Self-Attention 模式,如 图 1 所示,上面咱们来具体讨论一下。
图 1 经典的 Self-Attention 和 Longformer 提出的 Self-Attention
图 1 展现了经典的 Self-Attention 和 Longformer 提出的 Self-Attention,其中 图 1a是经典的 Self-Attention,它是一种”全看型”的 Self-Attention,即每个 token 都要和序列中的其余所有 token 进行交互,因而它的时空复杂度均是 $O(n^2)$。左边的三种模式是 Longformer 提出来的 Self-Attention 模式,别离是 Sliding Window Attention(滑窗机制)、Dilated Sliding Window(空洞滑窗机制)和 Global+Sliding Window(交融全局信息的滑窗机制)。
2.2.1 Sliding Window Attention
如 图 1b所示,对于某个 token,经典的 Self-Attention 可能看到并交融所有其余的 token,但 Sliding window attention 设定了一个窗口 $w$,它规定序列中的每个 token 只能看到 $w$ 个 token,其左右两侧能看到 $\frac{1}{2}w$ 个 token,因而它的工夫复杂度是 $O(n\times w)$。
你不须要放心这种设定无奈建设整个序列的语义信息,因为 transformer 模型构造自身是层层叠加的构造,模型高层相比底层具备更广阔的感触野,天然可能可能看到更多的信息,因而它有能力去建模交融全副序列信息的全局示意,就行 CNN 那样。一个领有 $m$ 层的 transformer,它在最上层的感触野尺寸为 $m\times w$。
通过这种设定 Longformer 可能在建模品质和效率之间进行一个比拟好的折中。
2.2.2 Dilated Sliding Window
在对一个 token 进行 Self-Attention 操作时,一般的 Sliding Window Attention 只能思考到长度为 $w$ 的上下文,在不减少计算量的状况下,Longformer 提出了 Dilated Sliding Window,如 图 1c所示。在进行 Self-Attention 的两个相邻 token 之间会存在大小为 $d$ 的间隙,这样序列中的每个 token 的感触野范畴可扩大到 $d\times w$。在第 $m$ 层,感触野的范畴将是 $m\times d \times w$。
作者在文中提到,在进行 Multi-Head Self-Attention 时,在某些 Head 上不设置 Dilated Sliding Window 以让模型聚焦在部分上下文,在某些 Head 上设置 Dilated Sliding Window 以让模型聚焦在更长的上下文序列,这样可能进步模型体现。
2.2.3 Global Attention
以上两种 Attention 机制还不能齐全适应 task-specific 的工作,因而 Global+Sliding Window 的 Attention 机制被提出来,如 图 1d所示。它设定某些地位的 token 可能看见全副的 token,同时其余的所有 token 也能看见这些地位的 token,相当于是将这些地位的 token”裸露”在最里面。
这些地位的确定和 具体的工作 无关。例如对于分类工作,这个带有全局视角的 token 是”CLS”;对于 QA 工作,这些带有全局视角的 token 是 Question 对应的这些 token。
那么这种交融全局信息的滑窗 Attention 具体如何实现呢,咱们先来回顾一下经典的 Self-Attention,公式如下:
$$\text{Attention}(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})$$
行将原始的输出别离映射到了 $Q,K,V$ 三个空间后进行 Attention 计算,Global+Sliding Window 这里波及到两种 Attention,Longformer 中别离将这两种 Attention 映射到了两个独立的空间,即应用 $Q_s,K_s,V_s$ 来计算 Sliding Window Attention,应用 $Q_g,K_g,V_g$ 来计算 Global Attention。
2.3. Longformer Attention 的实现
上述提出的 Attention 机制在以后的深度学习框架中尚未实现,比方 PyTorch/Tensorflow,因而 Longformer 作者实现了三种形式并进行了比照,如 图 2 所示。
图 2 Longformer Attention 的不同实现形式
其中 Full Self-Attention 是经典的自注意力实现;Longformer-loop 是一种 PyTorch 实现,它可能无效节俭内存应用并且反对 Dilated Sliding Window, 但这种实现形式太慢,因而只能用于测试阶段。Longformer-chunks 不反对 Dilated Sliding Window,被用于预训练 / 微调阶段。Longformer-cuda 是作者应用 TVM 实现的 CUDA 内核办法。能够看到,Longformer 可能获得比拟好的时空复杂度。
- 相干材料
- Longformer: The Long-Document Transformer
- Longformer Github
3.GPT
3.1 简介
2018 年 6 月,OpenAI 发表论文介绍了本人的语言模型 GPT,GPT 是“Generative Pre-Training”的简称,它基于 Transformer 架构,GPT 模型先在大规模语料上进行无监督预训练、再在小得多的有监督数据集上为具体任务进行精密调节(fine-tune)的形式。先训练一个通用模型,而后再在各个工作上调节,这种不依赖针对独自工作的模型设计技巧可能一次性在多个工作中获得很好的体现。这中模式也是 2018 年中自然语言解决畛域的钻研趋势,就像计算机视觉畛域风行 ImageNet 预训练模型一样。
NLP 畛域中只有小局部标注过的数据,而有大量的数据是未标注,如何只应用标注数据将会大大影响深度学习的性能,所以为了充分利用大量未标注的原始文本数据,须要利用无监督学习来从文本中提取特色,最经典的例子莫过于词嵌入技术。然而词嵌入只能 word-level 级别的工作(同义词等),没法解决句子、句对级别的工作(翻译、推理等)。呈现这种问题起因有两个:
- 不分明上游工作,所以也就没法针对性的进行优化;
- 就算晓得了上游工作,如果每次都要大改模型也会得失相当。
为了解决以上问题,作者提出了 GPT 框架,用一种半监督学习的办法来实现语言了解工作,GPT 的训练过程分为两个阶段:无监督 Pre-training 和 有监督 Fine-tuning。在 Pre-training 阶段应用单向 Transformer 学习一个语言模型,对句子进行无监督的 Embedding,在 fine-tuning 阶段,依据具体任务对 Transformer 的参数进行微调,目标是在于学习一种通用的 Representation 办法,针对不同品种的工作只需略作批改便能适应。
3.2. 模型构造
GPT 应用 Transformer 的 Decoder 构造,并对 Transformer Decoder 进行了一些改变,本来的 Decoder 蕴含了两个 Multi-Head Attention 构造,GPT 只保留了 Mask Multi-Head Attention,如下图所示。
GPT 应用句子序列预测下一个单词,因而要采纳 Mask Multi-Head Attention 对单词的下文遮挡,避免信息泄露。例如给定一个句子蕴含 4 个单词 [A, B, C, D],GPT 须要利用 A 预测 B,利用 [A, B] 预测 C,利用 [A, B, C] 预测 D。如果利用 A 预测 B 的时候,须要将 [B, C, D] Mask 起来。
Mask 操作是在 Self-Attention 进行 Softmax 之前进行的,具体做法是将要 Mask 的地位用一个无穷小的数替换 -inf,而后再 Softmax,如下图所示。
Softmax 之前须要 Mask
GPT Softmax
能够看到,通过 Mask 和 Softmax 之后,当 GPT 依据单词 A 预测单词 B 时,只能应用单词 A 的信息,依据 [A, B] 预测单词 C 时只能应用单词 A, B 的信息。这样就能够避免信息泄露。
下图是 GPT 整体模型图,其中蕴含了 12 个 Decoder。
GPT 只应用了 Transformer 的 Decoder 局部,并且每个子层只有一个 Masked Multi Self-Attention(768 维向量和 12 个 Attention Head)和一个 Feed Forward,共叠加应用了 12 层的 Decoder。
这里简略解释下为什么只用 Decoder 局部:语言模型是利用上文预测下一个单词的,因为 Decoder 应用了 Masked Multi Self-Attention 屏蔽了单词的前面内容,所以 Decoder 是现成的语言模型。又因为没有应用 Encoder,所以也就不须要 encoder-decoder attention 了。
3.3. GPT 训练过程
3.3.1 无监督的预训练
无监督的预训练(Pretraining),具体来说,给定一个未标注的意料库 $U=\{u_{1},u_{2},…,u_{n}\}$,咱们训练一个语言模型,对参数进行最大(对数)似然预计:
$$L_{1}(U)=\sum_{i}log P(u_{i}|u_{1},…,u_{k-1};\Theta)$$
其中,k 是上下文窗口的大小,P 为条件概率,$\Theta$ 为条件概率的参数,参数更新采纳随机梯度降落(GPT 试验实现局部具体用的是 Adam 优化器,并不是原始的随机梯度降落,Adam 优化器的学习率应用了退火策略)。
训练的过程也非常简单,就是将 n 个词的词嵌入 $W_{e}$ 加上地位嵌入 $W_{p}$,而后输出到 Transformer 中,n 个输入别离预测该地位的下一个词
能够看到 GPT 是一个单向的模型,GPT 的输出用 $h_{0}$ 示意,0 代表的是输出层,$h_{0}$ 的计算公式如下
$$h_{0}=UW_{e}+W_{p}$$
$W_{e}$ 是 token 的 Embedding 矩阵,$W_{p}$ 是地位编码的 Embedding 矩阵。用 voc 示意词汇表大小,pos 示意最长的句子长度,dim 示意 Embedding 维度,则 $W_{p}$ 是一个 pos×dim 的矩阵,$W_{e}$ 是一个 voc×dim 的矩阵。在 GPT 中,作者对 position embedding 矩阵进行随机初始化,并让模型本人学习,而不是采纳正弦余弦函数进行计算。
失去输出 $h_{0}$ 之后,须要将 $h_{0}$ 顺次传入 GPT 的所有 Transformer Decoder 里,最终失去 $h_{n}$。
$$h_{l}=transformer\_block(h_{l-1}), \forall l \in [1,n]$$
n 为神经网络的层数。最初失去 $h_{n}$ 再预测下个单词的概率。
$$P(u)=softmax(h_{n}W_{e}^T)$$
3.3.2 有监督的 Fine-Tuning
预训练之后,咱们还须要针对特定工作进行 Fine-Tuning。假如监督数据汇合 $C$ 的输出 $X$ 是一个序列 $x^1,x^2,…,x^m$,输入是一个分类 y 的标签,比方情感分类工作
咱们把 $x^1,..,x^m$ 输出 Transformer 模型,失去最上层最初一个时刻的输入 $h_{l}^m$,将其通过咱们新增的一个 Softmax 层(参数为 $W_{y}$)进行分类,最初用穿插熵计算损失,从而依据规范数据调整 Transformer 的参数以及 Softmax 的参数 $W_{y}$。这等价于最大似然预计:
$$P(y|x^1,…,x^m)=softmax(h_{l}^mW_{y})$$
$W_{y}$ 示意预测输入时的参数,微调时候须要最大化以下函数:
$$L_{2}(C)=\sum_{x,y}log P(y|x^1,..,x^m)$$
失常来说,咱们应该调整参数使得 $L_{2}$ 最大,然而为了进步训练速度和模型的泛化能力,咱们应用 Multi-Task Learning,GPT 在微调的时候也思考预训练的损失函数,同时让它最大似然 $L_{1}$ 和 $L_{2}$
$$L_{3}(C)=L_{2}(C)+\lambda \times L_{1}(C)$$
这里应用的 $L_{1}$ 还是之前语言模型的损失(似然),然而应用的数据不是后面无监督的数据 $U$,而是应用当前任务的数据 $C$,而且只应用其中的 $X$,而不须要标签 y。
3.3.3 其它工作
针对不同工作,须要简略批改下输出数据的格局,例如对于类似度计算或问答,输出是两个序列,为了可能应用 GPT,咱们须要一些非凡的技巧把两个输出序列变成一个输出序列
- Classification:对于分类问题,不须要做什么批改
- Entailment:对于推理问题,能够将先验与假如应用一个分隔符离开
- Similarity:对于类似度问题,因为模型是单向的,但类似度与程序无关,所以要将两个句子程序颠倒后,把两次输出的后果相加来做最初的揣测
- Multiple-Choice:对于问答问题,则是将上下文、问题放在一起与答案分隔开,而后进行预测
3.4. GPT 优缺点
-
长处
- 特色抽取器应用了弱小的 Transformer,可能捕捉到更长的记忆信息,且较传统的 RNN 更易于并行化;
- 不便的两阶段式模型,先预训练一个通用的模型,而后在各个子工作上进行微调,缩小了传统办法须要针对各个工作定制设计模型的麻烦。
-
毛病
- GPT 最大的问题就是传统的语言模型是单向的;咱们依据之前的历史来预测以后词。然而咱们不能利用前面的信息。比方句子 The animal didn’t cross the street because it was too tired。咱们在编码 it 的语义的时候须要同时利用前后的信息,因为在这个句子中,it 可能指代 animal 也可能指代 street。依据 tired,咱们推断它指代的是 animal。然而如果把 tired 改成 wide,那么 it 就是指代 street 了。Transformer 的 Self-Attention 实践上是能够同时关注到这两个词的,然而依据后面的介绍,为了应用 Transformer 学习语言模型,必须用 Mask 来让它看不到将来的信息,所以它也不能解决这个问题。
3.5. GPT 与 ELMo 的区别
GPT 与 ELMo 有两个次要的区别:
- 模型架构不同:ELMo 是浅层的双向 RNN;GPT 是多层的 Transformer encoder
- 针对上游工作的解决不同:ELMo 将词嵌入增加到特定工作中,作为附加性能;GPT 则针对所有工作微调雷同的根本模型
参考文献:
Improving Language Understanding by Generative Pre-Training