查看原文
其他

NLP重铸篇之LLM系列(gpt-1)

错乱空时 NLP杂货铺 2023-04-24

论文标题:Improving Language Understanding by Generative Pre-Training
论文链接:https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf
论文代码地址:https://github.com/openai/finetune-transformer-lm

GPT系列主要会分享生成式模型,包括gpt1、gpt2、gpt3、codex、InstructGPT、Anthropic LLM、ChatGPT等论文或学术报告。本文主要分享gpt1的论文。

重铸系列会分享论文的解析与复现,主要是一些经典论文以及前沿论文,但知识还是原汁原味的好,支持大家多看原论文。分享内容主要来自于原论文,会有些整理与删减,以及个人理解与应用等等,其中涉及到的算法复现都会开源在:https://github.com/wellinxu/nlp_store ,更多内容关注知乎专栏(或微信公众号):NLP杂货铺。

  • 介绍
  • 模型结构
    • 无监督预训练
    • 有监督微调
    • 任务相关的输入形式
  • 实验
    • 超参设定
    • 有监督微调
  • 分析
    • transformer层数的影响
    • 零样本学习
    • 消融实验
  • 总结
  • 论文之外
  • 参考

介绍

对于一些特定任务来说,有标签的数据通常是稀缺的,这让模型很难在这些任务上表现得很好。不过无标签的文本数据是非常充足的,本论文就在这些无标签的文本数据上进行语言模型的预训练,然后对各个特定的任务进行微调,取得了较好的效果(12项任务中,9个是当时最优结果)。

从大量无标签的文本上学习词的表示,已经被证明能够提升很多nlp任务的表现,但仍有两个难点。一个是,在学习文本表示的时候,不确定哪种优化目标是最有效的;另一个是,将学习到的表示应用到下游特定任务的时候,还没有一个公认的好办法。

本论文中,提出了一种半监督的方法,先进行无监督的预训练,再进行有监督的微调。旨在学习一个通用的表示,让其在后续训练不同的任务时,只需要很小的改动。论文假设,可以获取大量无标签的文本数据以及少量带标签的下游任务数据,并且不要求无标签的数据跟任务数据是同一个类型的。在这些数据的基础上,进行了两阶段的训练。第一阶段,使用语言模型的目标函数,在无标签的数据上训练一个神经网络模型;第二阶段,根据目标任务,选择其相应的监督学习目标函数,对第一阶段的模型参数进行调整。

本论文,主要使用了Transformer-decoder结构,该结构在很多任务上都表现了较好的性能,对比LSTM之类的结构来说,transformer的结构在处理文本的长程依赖时,能够提供更多的结构化信息,并且在不同任务上,其迁移学习的性能更好。

模型结构

本论文包含两个阶段,第一阶段是在大量的文本语料上训练语言模型,第二阶段是在具体的任务数据上微调模型。整体如下图所示。

无监督预训练

论文优化的是标准的语言模型目标函数,即最大化以下函数:

其中是文本窗口大小,是模型参数。论文中的语言模型,使用的是多层Transformer-decoder结构,可以通过以下公式计算P:

其中是层数,是词向量矩阵,是位置向量矩阵。BERT模型中使用的是Transformer-encoder结构,本文与之的最主要区别,是上下文的可见性,encoder框架中,每一个字符可以得到其前后的所有信息,而decoder框架中,每个字符只能够得到其之前字符的信息,得不到其之后字符的信息。本文中没有详细介绍Transformer结构,可以参考【1】论文,获取更多的信息。

有监督微调

语言模型训练完成后,则会使用任务的监督数据进行微调。可以通过以下方式进行计算:

其中是任务的文本序列,y是任务的标签,是文本序列输入到语言模型中transformer-block模块的最后一层输出。论文还将语言模型的目标函数添加到下游微调任务中去了,可以提高模型的泛化性能以及收敛速度。新的目标函数如下:

任务相关的输入形式

如上图的右半部分显示,对于不同的下游任务,使用了不同的输入形式。

文本分类任务:直接使用上小节描述的方式进行微调。

文本蕴含任务:将前提(premise)和假设(hypothesis)的文本序列拼接到一起,并在中间添加了分隔符($)。

文本相似任务:将两个文本序列分别输入到语言模型,将两个输出结果直接相加,然后输入给线性分类层。

问答或者推理任务:这类任务有一个文档一个问题和多个答案,将文档、问题和每一个答案都拼接在一起,并在答案之前添加分隔符($)。将每一个文本序列都独立地输入给语言模型和线性分类层,再将所有结果进行softmax处理,获取最终结果。

实验

超参设定

  • 无监督语言模型
    • 优化器:Adam
    • 学习率:
    • epoch:100
    • batch size:64
    • 最大2.5e-4
    • 前2000步更新,学习率从0线性增加,之后cosine衰减成0
    • 12层Transformer-block
    • 正则:
    • 激活函数:GELU【4】
    • 位置编码:可学习的位置矩阵
    • 参数初始化方法:N(0, 0,02)
    • max seq length:512
    • Transformer:decoder-only
    • Attention:masked self-attention heads(768维、12head)
    • FFM:3072维度
    • Dropout:0.1
    • L2正则,w=0.01
    • 数据集:BooksCorpus【2】
    • 词表获取方式:BPE【3】
    • 模型参数:
    • 训练参数:
  • 微调
    • dropout:0.1
    • 学习率:6.25e-5,带warmup的线性衰减
    • batchsize:32
    • epoch:3
    • :0.5

有监督微调

论文在四种不同的数据集上进行了测试,在所有12个数据集中,有9个取得了当时最优的结果,所有的数据集如下表所示,包含自然语言推理、问答、语义相似度、文本分类。

自然语言推理

自然语言推理的几个任务结果如下表所示,6个数据集上,有5个都取得了当时最好的结果。论文表示,多任务训练可能会让模型收益,但当时还并没有对此研究。

问答或推理

问答相关的任务结果如下表所示,在4个任务上都取得了当时最好的结果,证明了该模型有效处理长程文本的能力。

语义相似度和文本分类


分析

transformer层数的影响

如下图左半所示,随着层数的增加,模型的表现越来越好,在MultiNLI数据集上,每多一层,大概会带来9%的收益。

零样本学习

如上图右半所示,实线代表Transformer结构的零样本学习效果,虚线代表LSTM结构的效果。每个任务的效果都是根据该任务随机猜测的准确性和当前最优方法的准确性进行了归一化。随着训练的不断进行,模型的效果越来越好,可以认为预训练模型学习到了处理各种任务的相关能力。并且也可以看出,LSTM模型有着更高的方差,Transformer结构在迁移学习上更加鲁棒。

消融实验

下表中展示了论文的消融实验,可以看出,1、将语言模型的目标函数添加到下游任务中,对较大的数据集有帮助,较小的数据集则不明显;2、用LSTM替换Transformer结构,在大部分数据集上效果都比较差,只有MRPC效果略好;3、如果不先在大语料上进行预训练,直接在任务数据集上训练,则效果有大幅下降,说明预训练的有效性。

总结

该论文在模型结构(decoder-only transformer)和数据集(大规模无标签语料)上给出了方向。

论文之外

ChatGPT的出现,惊艳了众人。OpenAI并没有给出最新模型相关的任何信息,这也是笔者重读该系列论文的动机之一。可以看出,OpenAI在gpt1时代已经规划了他们后续的道路,结构上用transformer-decoder,数据上用大规模的语料,方向上做不同任务的零样本学习。在后续的gpt2、gpt3以至最新的ChatGPT,OpenAI确实在他们设定的道路上走得越来越远,也越来越好。

公众号的文章不易修改,如果想看是否有更新或修改,请点击查看原文。

参考

【1】Attention is all you need 
【2】Aligning books and movies: Towards story-like visual explanations by                  watching movies and reading books
【3】Neural machine translation of rare words with subword units
【4】Bridging nonlinearities and stochastic regularizers with gaussian error                     linear units


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存