0%

读论文4-GPT系列

GPT

GPT作为NLP预训练语言模型的基石之一,从gpt1,gpt2到gpt3,不断扩大模型规模,将问题从fine-tuning拓展到zero-shot,试图解决更基础,但是更困难的无监督学习问题,三篇论文中的模型结构相同,不同的是试图解决的问题。

GPT1

Improving Language Understanding by Generative Pre-Training

要解决的问题

NLP中有监督训练数据较少,存在大量的无标签文本数据,如何使用这些数据解决NLP领域中各类问题?GPT提出了 自监督预训练+fine tuning 的方式,主要解决两个问题

  1. 预训练的训练目标是什么?损失函数是什么?
  2. 预训练得到的特征表示如何迁移到下游任务中?

解决方案

使用语言模型作为预训练的目标,在下游任务上做有监督的fine tuning

预训练

预训练使用无标签语料作为输入,以语言模型的最大似然函数为训练目标(给定前n-1个token,预测第n个token的条件概率)

模型使用transformer-decoder结构,最后一层通过softmax计算预测词的概率

下游任务-fine tuning

fine-tuning 使用下游任务的有标签语料,增加一个全连接sfotmax输出层,预测对应标签,损失函数为所有训练数据的log最大似然

另外增加了一个辅助训练目标,在下游任务上训练语言模型,使用两个损失函数求和作为最终的训练目标($\lambda$ 为控制辅助训练目标对结果影响程度的参数)

针对不任务,仅仅使用softmax预测概率无法满足任务要求(如句子相似度衡量,需要输入两个句子,判断两个句子之间的相似度),gpt针对不同任务设计了不同类型的输入(Task-specific input transformations

实现细节

模型细节

  1. 12层的transformer-decoder,768隐藏层维度+12注意力头数,去掉了与encoder输出共同计算的注意力层(或者说使用 masked Multi Self Attention的encoder
  2. 使用GLUE作为激活函数
  3. 使用 bytepair encoding (BPE) 词典,包含4000词
  4. 使用模型学习position encoding,而不是transformer论文中的三角函数计算

训练细节

  1. 训练数据集为 BooksCorpus dataset(contains over 7,000 unique unpublished books)
  2. 预训练:优化器为Adam,最大学习率为 $2.5*10^{-4}$,dropout=0.1,在batchsize=64,seq_length=512的条件下,训练100个epoch
  3. 微调:lr = 6.25e-5 , batchsize = 32, dropout = 0.1,训练3个epoch

总结

本文主要针对两个问题提出了解决方案,并在不同NLP上验证,得到了不错的效果

  1. 预训练的训练目标是什么

    使用语言模型作为与训练目标(predict next token)

  2. 预训练得到的特征表示如何迁移到下游任务中?

    Task-specific input transformations + softmax predict层 在下游任务微调

GPT2

Language Models are Unsupervised Multitask Learners

在BERT刷榜之后,GPT2带着更大的模型、更多的训练数据卷土重来,不再将关注点聚焦于 预训练+微调,转而研究语言模型在无监督多任务学习上的可能性

要解决的问题

论文中提出目前NLP领域主流的 预训练+微调 存在问题,即该方法仍需要监督学习,需要下游任务的大量有标签训练数据。本文将NLP的一般任务和特定任务定义为两种条件分布

  1. 一般任务为 $p(output|input)$ 给定输入,对应输出的条件分布
  2. 特定任务 $p(output|input,task)$ 在特定任务上,输出不仅取决于输入,还取决于任务类型

传统的预训练+fine-tuning方式

  1. 预训练即模拟 $p(output|input)$条件分布
  2. fine-tuning 通过在不同任务上调整模型架构、参数等,模拟 $p(output|input,task)$条件分布

gpt2想要避免监督学习过程,即不在下游任务上做微调,引出了两个问题

  1. 如何预训练能使得预训练过程中学到下游任务的信息?(原文中的句子:the global minimum of the unsupervised objective
    is also the global minimum of the supervised objective. 全局非监督的收敛 等价于 全局监督学习的收敛)
    • 举个例子:像人学英语一样,背单词+看文章看看多了,就算从来没刷过题,题目也能做得效果不错
  2. 如何不调整模型参数或者架构实现从 $p(output|input)$ 到 $p(output|input,task)$ 转变,以适应下游任务?

解决方案

基本思路和GPT1区别不大,预训练语言模型+下游任务输入调整,不进行微调训练,个人觉得他的第二章Approach 前面关于理论来源的部分写的非常好,我读完感觉非常科学(也可能是我知识比较薄,看不出问题),分问题阐述一遍

如何预训练能使得预训练过程中学到下游任务的信息

Preliminary experiments confirmed that sufficiently large language models are able to perform multitask learning in this toy-ish setup but learning is much slower than in explicitly supervised approaches.

从两个角度解决该问题:

  1. 训练具备多任务学习能力的模型:语言模型

    • 通过论文证明,语言模型具备多任务学习的能力,缺点是训练速度较慢
  2. 输入包含多任务信息的数据:WebText 数据集

    • 本文认为网络文本信息量巨大,包括各种下游任务中需要的数据信息,使用大量网络文本训练,能够使得模型学到不同任务的信息(multi task learning)

    • 本文构造了一个WebText数据集,作者举了一些包含下游任务(NMT)数据的例子

如何不调整模型参数或者架构,就能适应下游任务

延续了GPT中的一些思路,通过修改输入表达方式,实现对下游任务的适应,以从英文到法文的机器翻译任务为例,在输入源句子的同时,以”english sentence = french sentence”为条件合并输入模型(文中成为 task hint)

在摘要任务中,论文尝试剔除了这种 ”task hint“,发现任务指标下降了6.4个点,作者认为这证明了 使用自然语言提示模型针对任务改变的可行性

顺带探讨的问题

在研究论文主要问题时,还顺带提了一下数据污染问题,即训练数据集和测试数据集之间重叠的问题,作者推荐在构建划分新的NLP数据训练集和测试集时,使用基于n-gram重叠的方法验证是否存在该问题

实现细节

模型细节

  1. 使用BPE构建子词字典,为了避免无意义单词出现(”dog.“,”dog?”),限制不同类型字符共同出现,字典大小为 50257

  2. 将transformer檐式结构结构中的 Post-LN 修改为了 Pre-LN(即把layer normalization移动到每个子层的前面,输入做归一化,输出不做)

训练细节

  1. batchsize=512,seq_length=1024

  2. 共有四个模型大小,最小的和gpt一一致,第二个与bert_large一致,最大的为GPT2

总结

本文使用更大的模型尝试证明语言模型在zero-shot上的可行性,在许多任务上取得不错的成绩。

GPT3

GPT3是对GPT2在zero shot learning上的进一步推进,GPT2效果没有达到预期,就在GPT3上继续增加模型和训练数据规模,提升效果,在完全预训练模型上继续推广,提出了三种将预训练应用到下游任务的非预训练方式(所谓的 in-context learning

  1. Few-Shot 解决下游任务时,在输入中提供几个任务样例

    • 一个任务提示

    • 几个任务样例(prompt)

  2. One-shot

    • 只给一个任务提示

  3. Zero-shot 完全不给任务提示,只告诉任务是什么

GPT3将模型规模增大到原来的1000倍

又构建了一个集合以往各种文本数据的巨大数据集

总结

GPT3文章太长,我只粗略地读了一遍,总体思路还是企图证明大规模预训练语言模型,在下游任务中,即使没有经过预训练,也能实现不错的效果,相较于前两篇论文没有太多新的东西