https://blog.csdn.net/sinat_24330297/article/details/102501549
OpenAI-GPT原理详解
本文参考
一、前言
二、基础知识
三、OpenAI GPT
3.1 OpenAI GPT 原理
3.2 OpenAI GPT模型结构
3.2.1 非监督预训练
3.2.2 监督微调fine-tuning
3.2.3 改造OpenAI GPT用于下游NLP任务
本文参考
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的预训练虽然仍然是以语言模型作为目标任务,但是采用的是单向的语言模型,所谓“单向”的含义是指:语言模型训练的任务目标是根据 [公式] 单词的上下文去正确预测单词 Wi
Wi,WiWi 之前的单词序列Context-before称为上文,之后的单词序列Context-after称为下文。ELMO在做语言模型预训练的时候,预测单词 Wi
Wi同时使用了上文和下文,而GPT则只采用Context-before这个单词的上文来进行预测,而抛开了下文。
3.2 OpenAI GPT模型结构
OpenAI-GPT提出一种半监督的方式来处理语言理解的任务。使用非监督的预训练和监督方式的微调。模型的目标是学习一个通用的语言表示,可以经过很小的调整就应用在各种任务中。这个模型的设置不需要目标任务和非标注的数据集在同一个领域。模型有两个过程。
在这里插入图片描述在这里插入图片描述
3.2.1 非监督预训练
非监督:
通过前k-1个词预测第k个词,从前往后,不断前进,属于单向的预测。此处记整个无监督训练的任务为L1。
处理非监督文本(u1,u2,...,um)
(u1,u2,...,um)的普通方法是用语言模型去最大化语言模型的极大似然。
L1(X)=∑ilogP(ui∣ui−k,...,ui−1:θ)
L1(X)=i∑logP(ui∣ui−k,...,ui−1:θ)
文章中使用的是多层(12层)Transformer的decoder的语言模型。这个多层的结构应用multi-headed self-attention在处理输入的文本加上位置信息的前馈网络,输出是词的概率分布。
h0=UWe+Wp
h0=UWe+Wp
hl=transformer_block(hl−1)
hl=transformer_block(hl−1)
P(u)=softmax(hnWTe)
P(u)=softmax(hnWeT)
这里
U=(uk,uk−1,...,u1)U=(uk,uk−1,...,u1)是tokens的上下文。
n是网络层数WeWe是tokens的embedding矩阵。
WpWp是tokens的位置embedding矩阵
P(u)
P(u)是通过softmax输出的一个概率
3.2.2 监督微调fine-tuning
这个阶段要对前一个阶段模型的参数,根据监督任务进行调整。我们假设有标签数据集C
C,里面的结构是(x1,x2,...,xm,y)(x1,x2,...,xm,y)。输入(x1,x2,...,xm)(x1,x2,...,xm)经过我们预训练的模型获得输出向量hmlhlm,然后经过线性层和softmax来预测标签。
P(y∣x1,x2,...,xm)=softmax(hmlWy)
P(y∣x1,x2,...,xm)=softmax(hlmWy)
L2(C)=∑x,ylogP(y∣x1,...,xm)
L2(C)=x,y∑logP(y∣x1,...,xm)
我们增加了语言模型去辅助微调,提高了监督模型的结果。最后的损失函数可以标示为
L3(C)=L2(C)+λL1(C)
L3(C)=L2(C)+λL1(C)
3.2.3 改造OpenAI GPT用于下游NLP任务
在这里插入图片描述
输入变换
对于有些任务,像文本分类,我们能够直接用上文的模型进行微调。另外的任务,问答系统,需要构造输入的句子对,或者三个文档。由于我们的预训练模型需要连续的文本序列,我们需要改变这种多句文本的输入。
文本含义:用$链接前后两个文本
相似度:对于相似度的问题,由于没有文本内部的先后顺序。我们可以有两个输入Text1
Text1$Text2Text2和Text2Text2$Text1
Text1,输出的表示向量在加起来。
问答系统:有Context
Context和Answer1,...,AnswerNAnswer1,...,AnswerN,我们可以组合成NN个ContextContext$AnsweriAnsweri输入,获得N
N个输出,在通过linear后softmax出概率分布。
GPT缺点:
单向语言模型
BERT使用双向语言模型,训练模型和GPT相同
https://blog.csdn.net/sinat_24330297/article/details/102501549