6.2 GPT意境级讲解

目录

OpenAI GPT 是在 Google BERT 算法之前提出的,与 BERT 最大的区别在于,GPT 采用了传统的语言模型进行训练,即使用单词的上文预测单词,而 BERT 是同时使用上文和下文预测单词。因此,GPT 更擅长处理自然语言生成任务 (NLG),而 BERT 更擅长处理自然语言理解任务 (NLU)。

1. GPT基本思想

  先通过无标签的文本去训练生成语言模型,再跟据具体的NLP任务(如文本蕴含、QA、文本分类等),来通过有标签的数据对模型进行fine-tuning。具体来说提出了半监督的方法,即结合了无监督的预训练和有监督的fine-tuning。采用两阶段训练。首先在未标记数据集上训练语言模型来学习神经网络模型的初始参数。随后,使用NLP任务 中的有标签数据将这些参数进行微调,以适应当前任务。

2. GPT模型结构

GPT模型使用了多层的单向Transformer结构。

6.2  GPT意境级讲解

上图展示了 GPT 的预训练过程,其实和 ELMO 是类似的,主要不同在于两点:

  1. 特征抽取器不是用的 RNN,而是用的 Transformer,上面提到过它的特征抽取能力要强于 RNN,这个选择很明显是很明智的;
  2. ELMO使用上下文对单词进行预测,而 GPT 则只采用 Context-before 这个单词的上文来进行预测,而抛开了下文。

  GPT使用Transformer 的Decoder结构,并对Decoder进行了一些改动,原本的Decoder包含两个Multi-Head Attention结构,GPT只保留了Mask Multi-Head Attention结构。

6.2  GPT意境级讲解

  GPT使用句子序列预测下一个单词,因此采用Mask Multi-Head Attention对单词的下文进行遮挡,防止信息泄露。

  Mask 操作是在 Self-Attention 进行 Softmax 之前进行的,具体做法是将要 Mask 的位置用一个无穷小的数替换 -inf,然后再 Softmax,如下图所示。

6.2  GPT意境级讲解

6.2  GPT意境级讲解

可以看到,经过 Mask 和 Softmax 之后,当 GPT 根据单词 A 预测单词 B 时,只能使用单词 A 的信息,根据 [A, B] 预测单词 C 时只能使用单词 A, B 的信息。这样就可以防止信息泄露。

下图是 GPT 整体模型图,其中包含了 12 个 Decoder。

6.2  GPT意境级讲解

图:(左)这项工作中使用的Transformer架构和training目标。(右)用于微调不同任务的输入转换。将所有结构化输入转换为token序列,由预先训练的模型处理,然后是线性+Softmax层。

3. GPT预训练

  GPT模型的训练分为两个阶段:

3.1 无监督的预训练

  对于无标签的文本\(U=\{u_1,\ldots, u_n \}\),最大化语言模型的极大似然函数:

\[L_{1}(U)=\sum_{i} \log P\left(u_{i} \mid u_{i-k}, \ldots, u_{i-1} ; \Theta\right) \]

可以看到GPT是一个单向模型,其输入用\(h_0\)表示:

\[h_0=UW_e+W_p \]

\(W_p\)是单词的位置的Embedding,\(W_e\)是单词的embedding。用 voc 表示词汇表大小,pos 表示最长的句子长度,dim 表示 Embedding 维度,则 \(W_p\) 是一个 pos×dim 的矩阵,\(W_e\) 是一个 voc×dim 的矩阵。

得到输入 \(h_0\) 之后,需要将 \(h_0\) 依次传入 GPT 的所有 Transformer Decoder 里,最终得到 \(h_t\)。

\[h_t=transformer_block(h_{l-1} \in [1,t]) \]

再用\(h_t\)预测下个单词的概率。

\[P(u)=softmax(h_tW_e^T) \]

3.2 有监督的fine-tuning

  GPT 经过预训练之后,会针对具体的下游任务对模型进行微调。微调的过程采用的是有监督学习,训练样本包括单词序列 [x1, x2, ..., xm] 和 类标 y。GPT 微调的过程中根据单词序列 [x1, x2, ..., xm] 预测类标 y。

\[P\left(y \mid x^{1}, \ldots, x^{m}\right)=\operatorname{softmax}\left(h_{l}^{m} W_{y}\right) \]

\(W_y\)表示预测输出时的参数,微调时候需要最大化以下函数。

\[L_{2}=\sum_{(x, y)} \log P\left(y \mid x^{1}, \ldots, x^{m}\right) \]

最后,将两阶段的目标函数通过超参\(\lambda\) 相加训练整个模型:

\[L_{3}=L_{2}+\lambda L_{1} \]

4. 具体任务的模型微调

图 5中,对于文本分类,只需要在预训练模型上微调,加上一个起始和终结符号即可。对于QA任务或者文本蕴含,因为预训练模型是在连续序列上训练,需要做一些调整,修改输入结构,将输入转化为有序序列输入。

1)文本蕴含 :将前提 [公式] 和假设 [公式] 序列拼接,中间用($)符号来分隔两个序列。

2)文本相似度:把两个句子顺序颠倒下做出两个输入即可,这是为了告诉模型句子顺序不重要,通过模型输出两个序列的特征向量,再逐元素相加输入线性层。

3)问答和常识推理:给定上下文文本 [公式] ,问题 [公式] ,一组可能的候选答案 [公式] ,将上下文文本、问题以及每个候选答案拼接起来,得到这样一个序列 [公式] ,再将该序列输入预训练模型,经softmax层得到候选答案的概率分布。

5. GPT与BERT模型的区别

  • 预训练

  GPT 预训练的方式和传统的语言模型一样,通过上文,预测下一个单词;BERT 预训练的方式是使用 Mask LM,可以同时通过上文和下文预测单词。例如给定一个句子 [u1, u2, ..., un],GPT 在预测单词 ui 的时候只会利用 [u1, u2, ..., u(i-1)] 的信息,而 BERT 会同时利用 [u1, u2, ..., u(i-1), u(i+1), ..., un] 的信息。如下图所示。

6.2  GPT意境级讲解

  • 模型效果

   GPT 因为采用了传统语言模型所以更加适合用于自然语言生成类的任务 (NLG),因为这些任务通常是根据当前信息生成下一刻的信息。而 BERT 更适合用于自然语言理解任务 (NLU)。

  • 模型结构
      GPT 采用了 Transformer 的 Decoder,而 BERT 采用了 Transformer 的 Encoder。GPT 使用 Decoder 中的 Mask Multi-Head Attention 结构,在使用 [u1, u2, ..., u(i-1)] 预测单词 ui 的时候,会将 ui 之后的单词 Mask 掉。

参考

https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf

从Word Embedding到Bert模型——自然语言处理预训练技术发展史:https://www.jiqizhixin.com/articles/2018-12-10-8

GPT2 https://www.sohu.com/a/336262203_129720 https://jalammar.github.io/illustrated-gpt2/

Pytorch代码实现: huggingface/pytorch-openai-transformer-lm

完全图解GPT-2:看完这篇就够了

上一篇:【论文笔记】一种有效***BERT等模型的方法


下一篇:谷歌官宣:全面超越人类的最强NLP预训练模型BERT开源了!