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

训练的两个阶段如下:

  1. 无监督的预训练

对于无标签的文本 U = \left\{ u_1, . . . , u_n \right\},最大化语言模型的极大似然函数:

 

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

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

2. 有监督的fine-tuning

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

Loss函数为:

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

三、具体任务的模型微调

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

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

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

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

四、总结

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

 

 

 

©️2020 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值