四、GPT
目前机器学习系统通过使用大型标注数据集、高容量模型的监督学习来训练。这种方式的缺点是:对数据分布和任务目标敏感,一旦数据分布发生变化,或者任务目标发生变化,则训练好的模型就无法很好工作。
因此这种机器学习系统是数据相关的、任务相关的狭隘系统,而不是数据无关、任务无关的通用系统。
GPT
的目标是学得一个能够执行多种任务的、更通用的机器学习系统,同时不需要为每个任务提供标注数据集(zero-shot learning
),或者只需要提供很少的标注数据集(one-shot learning
)。
4.1 GPT V1
通过未标记语料来训练词向量具有挑战性,有两个主要困难:
无法确定合适的目标函数来获取通用词向量,使得词向量有助于迁移学习。
如:生成式语言模型的目标函数是句子生成概率,判别式上下文预测模型的目标函数是给定上下文时单词出现的概率。
每种方法在不同的任务中表现不同,没有哪一个方法在所有任务中均表现最好。
无法确定合适的迁移学习方式。
如:无监督词向量作为辅助特征引入监督学习模型,或者将无监督词向量作为监督学习模型初始化点。
论文
《Improving Language Understanding by Generative Pre-Training》
提出了GPT
模型来利用未标记语料,它采用两阶段训练任务:- 首先在大量的未标记语料上进行生成式预训练。
- 然后通过标记语料对具体任务进行针对性的微调。
其中未标记文本和标记文本可以来自不同的领域。
GPT
结合了无监督预训练模型和监督微调模型,可以认为是一种半监督学习。GPT
区别于其它模型的地方在于:GPT
在微调期间仍然使用无监督预训练网络,只是针对具体的监督学习任务来调整网络的输出层。可以认为无监督预训练是半监督学习的一种特殊情况,其目标是为监督学习任务找到一个好的初始化点。
也可以将无监督预训练模型的隐向量作为监督学习任务的辅助特征,同时在目标任务上训练监督模型。
这种方式涉及到为每个目标任务建立监督模型,并且每个目标任务的大量新参数需要更新。
与之相比,
GPT
只需要在迁移学习过程中对预训练模型架构进行很小的修改就能够适应所有目标任务。
4.1.1 模型
预训练阶段:通过在大量未标记预料上学习网络的初始参数。
给定一个
token
序列 , 为单词在词表中的编号。GPT
通过生成式语言模型来最大化概率:其中 为窗口大小, 为网络参数。
论文通过一个多层
Transformer decoder
来建模,其中:其中 为上下文, 为词向量矩阵, 为位置向量矩阵, 为网络层数。
原始
Transformer
采用正弦函数来产生位置向量,但这里采用模型来学习位置向量。微调阶段:针对具体任务改变网络的输出层,并微调网络参数来匹配具体任务。
给定监督学习语料库 ,设样本 对应的标签为 ,其中 。
将预训练模型的输出层替换为线性输出层,则有:
其中 为预训练模型最后一层
transformer
的输出。因此得到监督学习任务的损失函数: 。
论文通过实验发现:在微调任务中引入语言模型能够改进监督学习的泛化性能,同时也能够加速监督学习的收敛速度。
因此监督学习任务的损失函数为:
其中 为加权系数,是模型的一个超参数。
可以看到:微调过程唯一需要学习的参数是 ,因此网络学习参数的数量相比于重新训练网络要小得多。
对于分类任务可以简单的、直接使用微调后的模型,对于文本蕴含、知识问答等任务需要调整模型来适应这些任务。
对所有任务都执行输入转换,不同的任务转换方式不同。
对于所有任务,都在序列开始添加
start
标记 ,在序列结束添加extract
标记 。文本分类任务:直接使用微调后的模型。
文本蕴含任务:将前提
Premise
和假设Hypothesis
通过分隔符Delim
拼接,然后使用微调后的模型。文本相似度任务:考虑到
A
和B
的相似度等于B
和A
的相似度,即:句子之间的相似度与句子顺序无关,因此:- 首先将句子
Text1
和句子Text2
通过分隔符Delim
拼接,然后将句子Text2
和句子Text1
通过分隔符Delim
拼接。 - 将得到的两个样本输入网络得到的
representation
相加,结果灌入线性输出层。
- 首先将句子
问答和知识推理任务:给定文档
Doc
和问题Question
,以及一组回答Answer1,Answer2,...
,GPT
将其转化为一个文本分类任务。首先根据每个回答通过分隔符
Delim
来拼接文档和问题,得到样本Doc Question Delim Answer_k
。其中上下文
Context
是文档和问题的直接拼接(未添加分隔符):Context = Doc Question
。然后对每个样本提取
representation
,灌入线性分类层(得到每个答案是否正确的概率),最后送入softmax
输出层得到归一化概率。
4.1.2 实验结论
模型结构:
GPT
模型采用12层的、仅包含decoder
的Transformer
模型。Transformer
的结构为:- 12 个
masked
的self attention head
,其隐向量为 768 维。 Feed Forward
的输出为 3072 维。
- 12 个
GPT
模型在不同任务上的表现:文本蕴含任务:其中
5x
表示集成了 5 个模型。自然语言推理任务
natural language inference:NLI
也称作文本蕴含任务textual entailment
,其目标是:给定一对句子,判定其关系是蕴含、矛盾、还是中立。这里评估了5个不同来源的数据集,包括图片标题SNLI
、新闻文章RTE
、维基百科文章QNLI
、科学考试SciTail
、转录语音&通俗小说&政府报告MNLI
。问答和知识推理任务:其中
9x
表示集成了 9 个模型。问答和知识推理任务包含两个数据集:
RACE
数据集:包含来自初中、高中考试的一些问答题。Story Cloze
数据集:该任务从两个选项中选择一个来作为故事的正确结尾。
语义相似度任务:其中
mc
表示Mathews
相关系数,acc
表示准确率,pc
表示皮尔逊系数。语义相似度任务检测两个句子在语义上是否等价。这里采用了3个数据集:
Microsoft Paraphrase corpus:MRPC
、Quora Question Pairs:QQP
、Semantic Textual Similarity benchmark:STS-B
。
实验表明:迁移学习时
GPT
的每一层都对目标任务有帮助。下图为采用不同层数时,模型在RACE
和MultiNLI
任务上的表现。即:迁移学习时并不是使用 ,而是 。与
LSTM
结构相比,Transformer
能够捕捉到更长的语言结构。因此Transformer
的迁移学习效果更好,且表现更加稳定。下图为直接使用预训练模型而不进行微调时,二者在新任务上的表现对比:
LSTM
的预测结果更差,且波动更大。通过实验表明:
GPT
在微调任务中引入语言模型的损失这个辅助目标可以提升监督任务的性能。实际上辅助目标对于大数据集有效,对于小数据集效果不佳。
下表中:
aux LM
表示使用预训练模型和辅助目标o pre-training
表示不使用预训练模型,也不使用辅助目标o aux LM
表示使用预训练模型,但是不使用辅助目标
4.2 GPT V2
论文
《Language Models are Unsupervised Multitask Learners》
提出了GPT V2
模型,其基本结构与GPT V1
相同,其区别在于:GPT V2
具有 15亿参数,网络层数更深、网络容量更大。下表中最小的模型等价于
GPT V1
,次小的模型等价于BERT
中的最大模型。最大的模型为GPT V2
。网络结构微调:
GPT V2
将Layer Normalization
移动到每个子块的输入之后,类似于pre-activation
残差网络。GPT V2
在最终的self-attention
块结束之后添加额外的layer normalization
层。
权重初始化方式微调:
GPT V2
将残差层的权重初始化缩放到GPT 1
的 ,其中 为残差层的数量。GPT V2
扩大词表到 50247 个词汇。GPT V2
将上下文大小从512 token
扩大到1024 token
。GPT V2
使用更大的batch size (512)
。
GPT V2
通过实验结果说明了语言模型可以基于zero-shot
来执行下游任务,而无需修改任何参数或者网络架构。
4.2.1 训练数据集
为了构建尽可能大和多样性的训练数据集,从而收集尽可能自然的语言分布,
GPT V2
采用爬取网页文本的方式。但是这种方式爬取的大多数网页的内容难以理解,因此严重降低了文本的质量。
GPT V2
的解决方案是:仅仅爬取由人类编辑、筛选的网页。GPT V2
构建训练数据集的步骤:首先从
Reddit
抓取出站计数超过3的所有超链接,最终爬取到4500万条超链接。然后爬取这些超链接的 HTML 文本,并进行过滤。
- 剔除2017年12月之后创建的超链接。这是为了划定时间范围,从而给定一个不可变的文档集合。
- 删除所有维基百科文档,因为它是很多任务的公共数据源,可能会对后续的迁移学习任务评估有影响。
- 去重。
最终得到 800多万文档,超过 40GB 的文本。该数据集称作
WebText
数据集。
4.2.2 预处理
通用语言模型应该能计算任何字符串的概率。但是,由于当前的大规模语言模型包含一些预处理步骤,如:大写字符转小写、词干化
tokenization
、表外标记OOV token
,这些步骤限制了字符串的模型空间。一种解决方案是将字符串转换为
UTF-8
字节序列。但是实验表明:在大型数据集上,bytes-level
字节粒度的语言模型不如word-level
单词级别的自然语言模型。GTP V2
采用Byte pari Encoding:BPE
方案,该方案 结合了word-level
的效果优势和bytes-leve
的通用性,是二者之间的折中方案。BPE
对高频的符号采用word-level
的输入,对低频的符号采用char-level
的输入。事实上
BPE
并不是采用字节,而是采用Unicode
码点。考虑到码点的数量较大(超过 13万个),而常见的单词词表大小在32000到 64000,因此也可以采用
bytes-level
的BPE
,它仅仅对词表引入 256个额外的token
。
GPT V2
不需要执行词干化,也不需要执行其它的有损预处理(如OOV
标记)。但是,对于标点符号需要特殊处理。由于英文是空格来分词,因此对于
dog?
这类带标点符号的单词需要将其拆分为dog
和标点符号两个token
。 这是因为GPT V2
没有词干化,所以dog?
并未归一化到单词dog
。
4.2.3 实验结论
GPT V2
在8个数据集上与其它模型进行比较,结果在其中 7 个数据集上GPT V2
取得了最佳效果。实验表明:数据集越小,
GPT V2
的优势越大。对于
One Billion Word Benchmark
数据集,GPT V2
差得多。原因可能有两个:One Billion Word benchmark
本身就是一个超大数据集,在它之上训练的专用模型效果已经非常好。One Billion Word benchmark
数据集执行了某些破坏性的预处理:进行了句子级别的混洗。这会破坏所有的长范围的结构。
评估指标:
PPL
困惑度、ACC
准确率、BPB
、BPC
。评估数据集:
LAMBADA
数据集:预测句子的最后一个单词。它测试了模型对文本长期依赖关系建模的能力。CBT
数据集:Children’s Book Test
数据集,预测省略单词的10个中哪个可能是正确的。它考察模型在不同类别的单词(命名实体、名字、动词)上的表现。CBT-CN
为普通名词数据集,CBT-NE
为命名实体数据集。
在语言模型中困惑度
perplexity
是一个比较重要的指标,它刻画了一个生成一个给定句子的概率。困惑度常用于评估语言模型的好坏:给测试集的句子赋予较高概率值的语言模型较好,否则语言模型较差。
对于给定句子 ,其定义为:
句子概率越大则困惑度越小,因此模型也就越好。
计算机视觉领域最近的研究表明:普通的图像数据集包含了大量的近似重复图像,如:
CIFAR-10
数据集在训练集和测试集之间有 3.3% 的重复。这会导致模型的泛化能力被高估。随着数据集大小的增长,这个问题可能会越来越严重:训练集越大,测试集中的样本越可能重复出现在训练集中。因此
GPT V2
的优秀表现有可能是由于测试集的测试样本曾经出现在训练集中,导致模型 “记住” 了这些样本。通过两个证据可以说明
GPT V2
的优秀表现是因为其本身泛化能力较强,而不是因为 “记忆” 效果。通过
Bloom
过滤器来检查不同数据集中,测试集和训练集的重复度。数据表明:
WebText train
的测试集、训练集的重复度较低。通过考察模型容量的性能表明:随着模型容量的增大,模型在训练集和测试集上的表现都在提升。
这说明更大的模型可以得到更好的效果,模型目前处于欠拟合(而不是过拟合)阶段。