大模型论文:Improving Language Understanding by Generative Pre-Training
OpenAI2018
文章地址:https://www.mikecaptain.com/resources/pdf/GPT-1.pdf
摘要
自然语言理解包括各种各样的任务,如文本蕴涵、问题回答、语义相似性评估和文档分类。尽管大量未标记的文本语料库丰富,但用于学习这些特定任务的标记数据很少,这使得判别训练模型难以充分执行。我们证明,通过在不同的未标记文本语料库上对语言模型进行生成式预训练,然后对每个特定任务进行判别性微调,可以实现这些任务的巨大收益。与以前的方法相反,我们在微调期间利用任务感知输入转换来实现有效的传输,同时需要对模型体系结构进行最小的更改。我们在自然语言理解的广泛基准上证明了我们的方法的有效性。我们的通用任务不可知模型优于为每个任务使用专门设计的架构的判别训练模型,在研究的12个任务中的9个任务中显著提高了技术水平。例如,我们在常识性推理(故事完形测试)上实现了8.9%的绝对改进,在问题回答(RACE)上实现了5.7%的绝对改进,在文本蕴涵(MultiNLI)上实现了1.5%的绝对改进
文本蕴含(Textual Entailment) 是自然语言处理(NLP)中的一项核心任务,旨在判断一段文本(称为“前提”,Premise)是否能够逻辑上蕴含另一段文本(称为“假设”,Hypothesis)。其本质是分析两者之间的语义关系
模型背景
-
大多数深度学习方法需要大量的人工标记数据,在无监督的情况下学习良好的表示也可以显著提高性能,因此选择无监督的方式进行模型学习。但存在下列问题
-
首先,是因为不清楚要下游任务,所以也就没法针对性的进行行优化;
-
其次,就算知道了下游任务,如果每次都要大改模型也会得不偿失
-
-
本文提出的GPT框架探讨了使用无监督预训练和有监督微调相结合的方法来处理语言理解任务。目标是学习一个通用表示,它可以适应各种任务,而无需太多调整。本文假设可以访问大量未标记文本以及包含手动注释训练示例(目标任务)的几个数据集。本文的设置不要求这些目标任务与未标记语料库属于同一域
-
本文用一种半监督学习的方法来完成语言理解任务,GPT 的训练过程分为两个阶段:Pre-training 和 Fine-tuning。目的是在于学习一种通用的文本表征方法,针对不同种类的任务只需略作修改便能适应
-
预训练模型:预训练具有类似正则化的作用,能让深度神经网络具有更好的泛化能力。正则化是防止过拟合的手段,预训练在这里被视为帮助模型不容易陷入训练集“记忆陷阱”的方法之一
模型框架及训练
- GPT 训练过程分为两个阶段:第一个阶段是 Pre-training 阶段,主要利用大型语料库完成非监督学习;第二阶段是 Fine-tuning,针对特定任务在相应数据集中进行监督学习,通过 Fine-tuning 技术来适配具体任务。下图为 GPT 的架构图:

- 无监督预训练:给定一个无监督的令牌语料库 U = { u 1 , … , u n } U = {\{u_1,…,u_n}\} U={u1,…,un},本文使用标准的语言建模目标来最大化以下可能性:
L 1 ( U ) = ∑ i log P ( u i ∣ u i − k , … , u i − 1 ; Θ ) L_1(U) = \sum_i \log P(u_i | u_{i-k}, \dots, u_{i-1}; \Theta) L1(U)=i∑logP(ui∣ui−k,…,ui−1;Θ)
- k k k是上下文窗口,本文使用多层的 Transformer 解码器作为语言模型,它是 Transformer 的一种变体。该模型对输入的上下文标记应用多头自注意力操作,然后在position-wise前馈层上生成目标令牌的输出分布:
h 0 = U W e + W p h_0 = U W_e + W_p h0=UWe+Wp
h l = transformer_block ( h l − 1 ) ∀ i ∈ [ 1 , n ] h_l = \text{transformer\_block}(h_{l-1}) \quad \forall i \in [1, n] hl=transformer_block(hl−1)∀i∈[1,n]
P ( u ) = softmax ( h n W e T ) P(u) = \text{softmax}(h_n W_e^T) P(u)=softmax(hnWeT)
-
有监督微调:在无监督训练后,本文使用有监督的方式对模型进行微调,个标注数据集 C C C,每个实例由一组输入token,$x^1, \dots, x^m 和标签 和标签 和标签y 组成,输入被传入预训练的模型,通过最后一个 T r a n s f o r m e r 块的激活 组成,输入被传入预训练的模型,通过最后一个Transformer块的激活 组成,输入被传入预训练的模型,通过最后一个Transformer块的激活h_l^m ,然后再输入到一个额外的线性输出层,该层带有参数 ,然后再输入到一个额外的线性输出层,该层带有参数 ,然后再输入到一个额外的线性输出层,该层带有参数 W_y 来预测 来预测 来预测 y$:
P ( y ∣ x 1 , … , x m ) = softmax ( h l m W y ) P(y | x^1, \dots, x^m) = \text{softmax}(h_l^m W_y) P(y∣x1,…,xm)=softmax(hlmWy) -
优化目标为:
L 2 ( C ) = ∑ ( x , y ) log P ( y ∣ x 1 , … , x m ) L_2(C) = \sum_{(x, y)} \log P(y | x^1, \dots, x^m) L2(C)=(x,y)∑logP(y∣x1,…,xm) -
本文还发现:将语言建模作为微调辅助目标,通过 (a) 改进监督模型的泛化,以及 (b) 加速收敛来帮助学习,优化目标为:
L 3 ( C ) = L 2 ( C ) + λ ⋅ L 1 ( C ) L_3(C) = L_2(C) + \lambda \cdot L_1(C) L3(C)=L2(C)+λ⋅L1(C) -
在微调期间所需的唯一额外参数是$W_y $和分隔符标记的嵌入
特定于任务的转换
-
对于一些任务,比如文本分类,可以像上述那样直接对模型进行微调。其他任务,如问答或文本蕴涵,具有结构化输入,如有序的句子对或文档、问题和答案的三元组。由于预训练模型是在连续的文本序列上训练的,因此需要对模型做一些修改才能应用到这些任务上
-
本文使用了一种遍历样式的方法,将结构化输入转换为预训练模型可以处理的有序序列。这些输入转换方法允许我们避免对架构做出大量的修改,从而在不同任务中共享架构。下面简要描述了这些输入转换,并且图1提供了一个视觉示意。所有的转换都包括添加随机初始化的开始和结束标记 < s > , < e > < s > , < e > < s > , < e > <s>,<e><s>, <e><s>,<e> <s>,<e><s>,<e><s>,<e>
-
文本蕴涵:对于蕴涵任务,我们将前提 p和假设 h的标记序列拼接,并在它们之间加上分隔符标记($)
-
相似性:对于相似性任务,两个句子之间没有固有的顺序。为此,我们修改输入序列,使其包含两个可能的句子顺序(并在它们之间添加分隔符),然后分别处理这两个序列,生成两个序列表示 h l m h_l^m hlm,这些表示在输入到线性输出层之前逐元素相加
-
问答和常识推理:对于这些任务,给定一个文档 z z z,一个问题 q q q,以及一组可能的答案$ {{a_k}}$。将文档上下文和问题拼接,并在它们之间添加分隔符标记,得到 $[z;q;$;a_k]$。每个序列会独立地被模型处理,然后通过softmax归一化,输出可能答案的概率分布。
-
总结:GPT 是一种半监督学习,采用两阶段任务模型,通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-training 中采用了 12 层的修改过的 Transformer Decoder 结构,在 Fine-tuning 中会根据不同任务提出不同的分微调方式,从而达到适配各类 NLP 任务的目的