OpenAI-GPT原理详解

本文参考

OpenAI GPT算法原理解析
openai-GPT模型

一、前言

本文对论文《Improving Language Understanding
by Generative Pre-Training》做一个解析。

一个对文本有效的抽象方法可以减轻NLP对有监督学习的依赖。目前大多数深度学习方法依靠大量的人工标注信息,这限制了在很多领域的应用。此外,即使在可获得相当大的监督语料情况下,以无监督学习的方式学到的表示也可以提供显着的性能提升。到目前为止,最引人注目的证据是广泛使用预训练词嵌入来提高一系列NLP任务的性能。

二、基础知识

Transform模型原理

三、OpenAI GPT

3.1 OpenAI GPT 原理

本文提出一种半监督的方式来处理语言理解的任务。使用非监督的预训练和监督方式的微调。我们的目标是学习一个通用的语言标示,可以经过很小的调整就应用在各种任务中。这个模型的设置不需要目标任务和非标注的数据集在同一个领域。
GPT是“Generative Pre-Training”的简称,从名字看其含义是指的生成式的预训练。GPT也采用两阶段过程,第一个阶段是利用语言模型进行预训练,第二阶段通过Fine-tuning的模式解决下游任务。
GPT的预训练过程,其实和ELMO是类似的,主要不同在于两点:首先,特征抽取器不是用的RNN,而是用的Transformer,上面提到过它的特征抽取能力要强于RNN,这个选择很明显是很明智的;其次,GPT的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,所谓“单向”的含义是指:语言模型训练的任务目标是根据 [公式] 单词的上下文去正确预测单词 WiW_iWiW_i 之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。ELMO在做语言模型预训练的时候,预测单词 WiW_i同时使用了上文和下文,而GPT则只采用Context-before这个单词的上文来进行预测,而抛开了下文。

3.2 OpenAI GPT模型结构

OpenAI-GPT提出一种半监督的方式来处理语言理解的任务。使用非监督的预训练和监督方式的微调。模型的目标是学习一个通用的语言表示,可以经过很小的调整就应用在各种任务中。这个模型的设置不需要目标任务和非标注的数据集在同一个领域。模型有两个过程。
OpenAI-GPT原理详解OpenAI-GPT原理详解

3.2.1 非监督预训练

非监督:
通过前k-1个词预测第k个词,从前往后,不断前进,属于单向的预测。此处记整个无监督训练的任务为L1。
处理非监督文本(u1,u2,...,um)(u_1,u_2,...,u_m)的普通方法是用语言模型去最大化语言模型的极大似然。

L1(X)=ilogP(uiuik,...,ui1:θ)L_1(X)=\sum_ilogP(u_i|u_{i-k},...,u_{i-1}:\theta)

文章中使用的是多层(12层)Transformer的decoder的语言模型。这个多层的结构应用multi-headed self-attention在处理输入的文本加上位置信息的前馈网络,输出是词的概率分布。
h0=UWe+Wph_0=UW_e+W_p

hl=transformer_block(hl1)h_l=transformer\_block(h_{l-1})

P(u)=softmax(hnWeT)P(u)=softmax(h_nW^T_e)
这里
U=(uk,uk1,...,u1)U=(u_k,u_k-1,...,u_1)是tokens的上下文。
n是网络层数WeW_e是tokens的embedding矩阵。
WpW_p是tokens的位置embedding矩阵
P(u)P(u)是通过softmax输出的一个概率

3.2.2 监督微调fine-tuning

这个阶段要对前一个阶段模型的参数,根据监督任务进行调整。我们假设有标签数据集CC,里面的结构是(x1,x2,...,xm,y)(x_1,x_2,...,x_m,y)。输入(x1,x2,...,xm)(x_1,x_2,...,x_m)经过我们预训练的模型获得输出向量hlmh_l^m,然后经过线性层和softmax来预测标签。
P(yx1,x2,...,xm)=softmax(hlmWy)P(y|x_1,x_2,...,x_m)=softmax(h_l^m{W_y})

L2(C)=x,ylogP(yx1,...,xm)L_2(C)=\sum_{x,y}logP(y|x_1,...,x_m)

我们增加了语言模型去辅助微调,提高了监督模型的结果。最后的损失函数可以标示为

L3(C)=L2(C)+λL1(C)L_3(C)=L_2(C)+\lambda{L_1(C)}

3.2.3 改造OpenAI GPT用于下游NLP任务

OpenAI-GPT原理详解
输入变换
对于有些任务,像文本分类,我们能够直接用上文的模型进行微调。另外的任务,问答系统,需要构造输入的句子对,或者三个文档。由于我们的预训练模型需要连续的文本序列,我们需要改变这种多句文本的输入。

  • 文本含义:用$链接前后两个文本
  • 相似度:对于相似度的问题,由于没有文本内部的先后顺序。我们可以有两个输入Text1Text1$Text2Text2Text2Text2$Text1Text1,输出的表示向量在加起来。
  • 问答系统:有ContextContextAnswer1,...,AnswerNAnswer1,...,AnswerN,我们可以组合成NNContextContext$AnsweriAnswer_i输入,获得NN个输出,在通过linear后softmax出概率分布。