【NLP】OpenAI GPT算法理解

论文《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语言模型的结构:

【NLP】OpenAI GPT算法理解_第1张图片

训练的两个阶段如下:

  1. 无监督的预训练

对于无标签的文本 ,最大化语言模型的极大似然函数:

 

这里的 是文本上下文窗口的大小。

论文中使用的是多层Transformer的decoder的语言模型,input为词嵌入以及单词token的位置信息;再对transformer_block的输出向量做softmax,output为词的概念分布。具体公式如下:

【NLP】OpenAI GPT算法理解_第2张图片

2. 有监督的fine-tuning

在对模型预训练之后,采用有监督的目标任务对模型参数微调。假设一个有标签的数据集,假设每一条数据为一个单词序列  以及相应的标签  ,通过之前预训练的模型获得输出向量 ,再送入线性输出层,来预测标签

Loss函数为:

最后,将两阶段的目标函数通过超参  相加训练整个模型:

三、具体任务的模型微调

对于文本分类,只需要在预训练模型上微调。对于QA任务或者文本蕴含,因为预训练模型是在连续序列上训练,需要做一些调整,修改输入结构,将输入转化为有序序列输入

 1)文本蕴含 :将前提  和假设  序列拼接,中间用($)符号来分隔两个序列。

2)文本相似度:分别将两个序列输入,通过模型输出两个序列的特征向量,再逐元素相加输入线性层。

3)问答和常识推理:给定上下文文本  ,问题 q,一组可能的候选答案 ,将上下文文本、问题以及每个候选答案拼接起来,得到这样一个序列 ,再将该序列输入预训练模型,经softmax层得到候选答案的概率分布。

四、总结

通过预训练的语言模型学习文本的长距离依赖信息,再用有标签数据集微调,迁移到不同的NLP任务上。

 

 

 

你可能感兴趣的:(论文阅读,深度学习)