论文《Improving Language Understanding by Generative Pre-Training》
Pytorch代码实现:
huggingface/pytorch-openai-transformer-lm
一、论文原理
GPT的核心思想是先通过无标签的文本去训练生成语言模型,再根据具体的NLP任务(如文本蕴涵、QA、文本分类等),来通过有标签的数据对模型进行fine-tuning。
具体来说,在这篇论文中提出了半监督的方法,即结合了无监督的预训练和有监督的fine-tuning。论文采用两阶段训练。首先,在未标记数据集上训练语言模型来学习神经网络模型的初始参数。随后,使用相应NLP任务中的有标签的数据地将这些参数微调,来适应当前任务。
二、模型结构
模型的结构是使用了多层的单向Transformer结构(《Attention is All you need》提出)。下图是GPT语言模型的结构:
训练的两个阶段如下:
-
无监督的预训练
对于无标签的文本 ,最大化语言模型的极大似然函数:
这里的 是文本上下文窗口的大小。
论文中使用的是多层Transformer的decoder的语言模型,input为词嵌入以及单词token的位置信息;再对transformer_block的输出向量做softmax,output为词的概念分布。具体公式如下:
2. 有监督的fine-tuning
在对模型预训练之后,采用有监督的目标任务对模型参数微调。假设一个有标签的数据集,假设每一条数据为一个单词序列 以及相应的标签
,通过之前预训练的模型获得输出向量
,再送入线性输出层,来预测标签
Loss函数为:
最后,将两阶段的目标函数通过超参 相加训练整个模型:
三、具体任务的模型微调
对于文本分类,只需要在预训练模型上微调。对于QA任务或者文本蕴含,因为预训练模型是在连续序列上训练,需要做一些调整,修改输入结构,将输入转化为有序序列输入
1)文本蕴含 :将前提 和假设
序列拼接,中间用($)符号来分隔两个序列。
2)文本相似度:分别将两个序列输入,通过模型输出两个序列的特征向量,再逐元素相加输入线性层。
3)问答和常识推理:给定上下文文本 ,问题
q,一组可能的候选答案
,将上下文文本、问题以及每个候选答案拼接起来,得到这样一个序列
,再将该序列输入预训练模型,经softmax层得到候选答案的概率分布。
四、总结
通过预训练的语言模型学习文本的长距离依赖信息,再用有标签数据集微调,迁移到不同的NLP任务上。