GPT系列:GPT-1详解

44次阅读

由于众所周知的原因,不得不复习一下 GPT 系列的论文。以此为记录,先从 GPT1 开始,后面 GPT2、GPT3 都会有,其它得生成式的大模型也会陆续更新。

一. 概述

NLP 包含很多类型的任务,包括文本分类、文本匹配等。现在主流的做法是通过人工标注数据,针对某个具体场景训练一个模型,这也使得这种方法在缺乏标注数据的场景下很难奏效。在这些场景下,往往会有很多未标注数据可以利用起来,在无标注的情况下也能较好的完成相应的任务,甚至比监督学习的效果更好。之前的词向量的训练就是一个很好的例子,像 word2vec 这种基本就是在无标注的情况下训练得到的,曾经也是被广泛使用的。

利用无标注文本进行学习仍存在两个待解决的问题:1. 目前尚不清楚哪种类型的优化目标在学习文本表征方面最有效。当下有很多研究在不同的任务中用了不同的优化目标而达到最优;2. 如何将学习到的文本表征用于下游任务也不明确。现有的方法一般是针对下游任务更改模型结构等;

本文提出一种半监督的方法 GPT,用于自然语言理解任务,GPT 的整体流程结合了无监督的预训练和有监督的微调。目标旨在学习到一种通用的表征能够以极小的代价用于各种下游任务。本质上 GPT1 是基于 Transformer 的 Decoder(变体)开发的。

二. GPT1

训练过程整体上分为两步:1)在大规模文本数据上学习到一个高容量的语言模型;2)在标注数据上进行微调;

这两步训练步骤和 BERT 系列模型类似,也说明 GPT1 这个时期在生成时模型解决任务的流程上和 BERT 是一致的。

1. 无监督预训练

给定一个无监督 token 序列\mathcal{U}={u_1,u_2,…,u_n},用一个标准的语言模型目标去极大化这个似然函数:

L_1(\mathcal{U})=\sum_{i}logP(u_i|u_{i-k},…,u_{i-1};\theta) \\

其中 k 是上下文滑窗的大小,\theta为神经网络模型的参数,用 SGD 去更新参数。

GPT1 所谓的神经网络模型其实就是 multi-layer transformer decoder,一种对 transformer 的改进(与原始的 Transformer Decoder 相比,因为只用到 decoder,没用到 encoder,所以把 decoder 中与 encoder 相关的 Encoder-Decoder Attention 层删除了,只保留了 Masked Multi-Head Attention 层和 Feed Forward 层)。将输入上下文 token 输入进 multi-head self-attention, 然后再接一层 position-wise feedforward 去输出一个 token 的分布:

h_0 = UW_e + W_p \\h_l = transformer_block(h_{l-1}),\forall i \in [1,n] \\P(u) = softmax(h_nW_e^T) \\

其中,U=(u_{-k},…,u_{-1})是上下文 token 对应的 embedding 向量,n 是 decoder 的层数,W_e是 token embedding 矩阵,W_p是 position embedding 矩阵。

Decoder 的修改(相较于 Transformer decoder):

1.Transformer Decoder:Masked multi-head self-attention + encoder-decoder multi-head self-attention +feed forward

2.GPT Decoder:Masked multi-head self-attention+ feed forward

2. 监督微调

设标注数据为 \mathcal{C}, 每个样本的输入为一个 token 序列:x^1, x^2,…,x^m,对应的标签为 y。将 token 序列输入到预训练模型中,获取最后一个 transformer decoder 的输出h_l^m,然后将h_lm 输入到参数为 W_y 的线性输出层去预测 y:

P(y|x^1,…,x^m)=softmax(h_l^m W_y) \\

接下来就是极大化下列目标函数:

L_2(\mathcal{C})=\sum_{(x,y)}logP(y|x^1,…,x^m) \\

GPT 的实验中发现,加入语言模型学习目标作为辅助任务,也就是损失函数中加入 L_1(\mathcal{u}) 能带来两点好处:1. 提升监督模型的泛化能力;2. 加快收敛;因此,最终的优化目标如下:

L_3(\mathcal{C}) = L_2(\mathcal{C})+\lambda L_1(\mathcal{C}) \\

3. 特定任务的输入调整

针对文本分类之类的任务,可以按照上述步骤进行微调。但是类似于问答、文本蕴含之类的以有序的句子对作为输入的任务,就需要根据这些特定的任务做一些修改。论文针对不同的任务提出了不同的修改,将输入数据进行规范化以满足模型要求。具体对应的结构可以看 Figure 1.

GPT系列:GPT-1详解插图

三. 实验

1. 设置

无监督预训练: 数据集 1 为 BooksCorpus dataset,包含了超过 7000 本多领域的书。该数据集包含很多长的连续的文本,也使得模型能够学习到长距离的信息。数据 2 是 Word Benchmark,和 ElMo 的数据集一样,但在句子层面进行了打乱。

模型细节: 结构上,GPT 是 12 层的 decoder-only transformer with masked self-attention heads。优化器用的是 Adam。最大学习率是 2.5e-4,基于余弦 schedule 变化的。编码使用的是 bytepair encoding(BPE).

微调细节 对于大多数任务,学习率是 6.25e-4,batch size 是 32. \lambda 是 0.5.

2. 数据集

Table 1 表明了评估模型的各个任务,及对应的使用的数据集。

GPT系列:GPT-1详解插图1

3. 实验结果

Table 2 是在自然语言推理 NLI 任务上的表现,可以看出除了在 RTE 这个数据集以为,其它数据集都能达到 sota。当然这个结果已经比较早了,GPT1 毕竟是 18 年的模型,对比的模型现在看来也不是很先进的。

GPT系列:GPT-1详解插图2

Table 3 是在问答和常识推理任务的表现,均达到最优,也说明的 GPT1 对 long-range contexts 的学习很不错。

GPT系列:GPT-1详解插图3

Table4 是关于语义相似和分类任务的评估

GPT系列:GPT-1详解插图4

4. 结果分析

1)层数的影响:Figure 2 左图展现了随着层数的增加,效果的增加。说明预训练的每一层都对下游任务带来不同的信息。

2)Zero-shot 的表现:Figure 2 右边展示的不用微调,而直接用预训练用于各种任务的结果,虚线是 LSTM,实线是 Transformer。比较直接的说明了,就预训练而言,Transformer 的迁移能力比 LSTM 好。

3)消融实验:Table 5 是做的一些消融实验。主要是三个方面,1. 第一个是针对以语言模型学习目标作为辅助任务来进行训练是否有提升,结果是在 QQP 和 NLI 数据集上有帮助,其它的则无,说明针对大规模数据集而言,针对小规模数据集则无提升。2. 针对 Transformer 和 LSTM 的对比,除了 MRPC 以外,Transformer 均更优优势。3. 针对预训练带来的提升进行的实验,结果现实如果没有预训练,则所有任务表现均下降。

GPT系列:GPT-1详解插图5
GPT系列:GPT-1详解插图6

四. GPT 特点

1. 优点

特征抽取器使用了强大的 Transformer,能够捕捉到更长的记忆信息,且较传统的 RNN 更易于并行化;transformer 的并行化可以参考 zhuanlan.zhihu.com/p/36

2. 缺点

GPT 最大的问题就是传统的语言模型是单向的;

五. GPT 与 ELMo,BERT 的区别

5.1 GPT 与 ELMo 的区别

模型架构不同:ELMo 是浅层的双向 RNN;GPT 是多层的 Transformer decoder。

针对下游任务的处理不同:ELMo 将词嵌入添加到特定任务中,作为附加功能;GPT 则针对所有任务微调相同的基本模型。

5.2 GPT 与 BERT 的区别

预训练:GPT 预训练的方式和传统的语言模型一样,通过上文,预测下一个单词;BERT 会同时利用上下文的信息。

模型效果:GPT 因为采用了传统语言模型所以更加适合用于自然语言生成类的任务 (NLG),因为这些任务通常是根据当前信息生成下一刻的信息。而 BERT 更适合用于自然语言理解任务 (NLU)。(当然这是之前的说法,现在 chatgpt 出来以后哪个更适合 NLU 任务还真不一定)。

模型结构:模型结构:GPT 采用了 Transformer 的 Decoder,而 BERT 采用了 Transformer 的 Encoder。GPT 使用 Decoder 中的 Mask Multi-Head Attention 结构

六. 简单总结

GPT- 1 是基于 Transformer decoder 的变体构成的模型,针对各种任务的思路仍然是 pretrain+fintune,在当时和 Bert 的思路一样,都是比较先进的思路。只不过从现在 chatgpt 的生成式处理思路来看,其实差距还是挺大的,虽然名字都是 gpt…。finetune 的思路带来的问题就是针对某一种任务就以某一种结构和相应场景的数据去做,并不是通用的。这个在 GPT- 2 后面会改进,关于 GPT- 2 应该这两天会复习下论文,也相应地写一篇文章再。

原文链接:https://zhuanlan.zhihu.com/p/508053361

正文完
 
追风者
版权声明:本站原创文章,由 追风者 2023-12-07发表,共计3810字。
转载说明:声明:本站内容均来自互联网,归原创作者所有,如有侵权必删除。 本站文章皆由CC-4.0协议发布。