本文为预训练语言模型专题系列第四篇
前期回顾:[萌芽时代]、[风起云涌]、[文本分类通用训练技巧]
感谢清华大学自然语言处理实验室对预训练语言模型架构的梳理,我们将沿此脉络前行,探索预训练语言模型的前沿技术,红色框为前期脚印,绿色框为本期介绍,欢迎大家留言讨论交流!
SHOCKING
在具体看论文之前,我们先来看看GPT-2,也是GPT家族巨人的惊人表现做一个开胃菜。在一个生成式任务上,OpenAI给出了这么一个开头:
翻成中文是:在一项惊人的研究中,科学家们发现了一群独角兽,它们生活在安第斯山脉一个偏远的还没被开发山谷中,更令人惊讶的是这些独角兽会说一口完美的英语。
就这么一句话,GPT-2能接着它写出以下这么一大段故事:
因为它们独特的角,科学家们把他们命名为Ovid’s Unicorn,这些长着四个银色角的独角兽是原来科学家所不曾见过的。
......中间还描写了,这些独角兽如何被发现,以及权威人士们评论这些生物是怎么出现的,最后还认为要验明这群独角兽是否是外星的种族,唯一方法就是通过DNA了。
这一本正经的胡说八道,让编者也是自愧不如啊。GPT-2这么强劲不是没有道理的,接下来让我们回归学术,查查GPT家族的户口本吧!
Improving Language Understanding by Generative Pre-Training (2018)
GPT是 “Generative Pre-Training” 的缩写,由OpenAI的四位作者发表于2018年。我想基于文章谈谈GPT模型的特点以及和之前模型的相似点。下图为GPT及ELMo的结构图。
GPT模型不同于之前模型的特点:
-
GPT的模型核心组件选择了Transformer,区别于之前的其他一些模型包括ELMo的LSTM。这确实给模型带来了极大的性能和速度提升。关于Transformer原理,我受限于篇幅,不在这里赘述,但是强烈推荐大家对Transformer进行深入了解,可以查阅文后的参考阅读,网上的介绍也很多,如果大家希望我们出一期Transformer的推送,也可以在后台留言。
-
为了方便将语言模型的能力transfer到下游的各种任务上去,GPT对模型的输入进行了规范,称为 traversal-style input transformations。把各种任务的结构化输入统一转化为有序的序列。避免在应对不同任务时,要对模型进行大的改动。其实做法很简单,我们看下面这个图就知道,使用特定的符号,来界定文本序列的开始,间隔和结束,并在预训练时做相同的处理即可,BERT也使用了这种方法。
-
GPT对词典使用了 bytepair encoding (BPE) 。这样做的目的是为了缩小词典,就英文来说词是表示意义的基本单位,但是常用词有30000-50000个,全量的可达130000。字符只有256个,但是并不能很好地展现语义信息。所以应该可以找到一个更好的subword units来作为基本单元,即不能将句子长度被增加太多而降低模型性能,也能有效减少词典的大小以减少模型参数量,这种做法也确实对模型性能的提高有很大帮助。BPE的实现在下方模型细节会提到。
GPT模型和之前模型的共同点:
-
GPT模型使用经典的two stage training。第一个阶段,将一个大容量的语言模型在很大的无监督语料上进行预训练。第二个阶段,在特定任务的监督数据上进行finetune。
-
GPT模型沿袭了我们第一期 [萌芽时代] 中所讲文章 Semi-supervised Sequence Learning 的方法。将语言模型预训练后,把模型的参数作为监督模型的起始点的做法。而有区别于第一期所讲另一篇context2vec,或第二期 [风起云涌] 所讲的ELMo这样,通过预训练模型生成带上下文信息的向量表示,然后作为监督模型的特征。
-
GPT使用了标准的语言模型目标,优化某个词在其前面k个词出现情况下的条件概率。
-
与之前的一些文章一样,GPT在特定任务的训练时,会把语言模型目标的误差一起加在总误差中联合训练,以提升模型的泛化能力,缓解灾难性遗忘