赞
踩
1. BERT
2. GPT
目录
本文记录经典论文GPT的阅读记录。GPT是OpenAI的生成式预训练语言模型。目前已经有GPT,GPT-2,GPT-3三个版本了。我们先从最早的GPT开始。有一点需要说明的是,其实GPT是比BERT更早出现的。首先GPT的原文标题是《Improving Language Understandding by Generative Pre-Training》,GPT stands for Generative Pre-Training。
先来看看摘要。
NLU任务包括文本蕴含(textual entailment),问答,语义相似度评估,文档分类等。从摘要中我们了解到论文主要贡献是提出了:在无标注的文本语料中进行生成式预训练,然后进行判别式微调能获得巨大的性能提升。实验结果是对每个任务微调训练一个模型,12个任务中的9个任务的性能大幅提升(如常识推理提升了8.9%,问答提升了5.7%,文本蕴含提升了1.5%)。
看完摘要,其实我才发现自己之前对GPT是有误解的,我以为GPT是做专门做生成任务的。实际上,至少GPT-1做的还是NLU任务。造成这个误解的原因是:GPT只是说做的是生成式预训练,下游任务还是判别式任务。
文本蕴含任务:给定一个前提文本(premise),根据这个前提去推断假说文本(hypothesis)与premise的关系,一般分为蕴含关系(entailment)和矛盾关系(contradiction),蕴含关系(entailment)表示从premise中可以推断出hypothesis;矛盾关系(contradiction)即hypothesis与premise矛盾。
首先提到了无监督学习方式对学习好的表示很大帮助,证据是人们已经大量使用预训练的word embedding来提升NLP任务。
但是利用无标注文本中的word-level的信息是具有挑战性的,有两个原因:第一,尚不清楚哪种类型的优化目标函数在学习对迁移有用的文本表示方面最有效。第二,如何最有效的将学习到的表示迁移到目标任务上,还没有达成共识。
因此,本文探讨了一种结合了无监督预训练和有监督微调的半监督语言理解任务方法。目标是学习一个通用的表示以适应各种任务。我们不要求目标任务和未标记语料库属于相同的领域。这是一个两阶段预训练策略:首先在无标注的语料上使用language modeling的目标函数来学习网络的初始参数,然后使用对应的监督目标函数在下游任务上训练。
标准的language modeling的目标函数是最大化如下似然函数:
U = \{u_1_, ..., u_n_ \}是语料,k是context window size,条件概率P使用一个参数为θ的神经网络建模。
模型架构是Transformer,评估了四个语言理解任务:自然语言推理,问答,语义相似度,文本分类。最后还分析了pre-trained model的zero-shot性能,表明模型获得了对下游任务有用的语言学知识。
相关工作中提到了:
训练过程分为两阶段:第一段学习一个大容量(high-capacity)的语言模型,第二阶段将模型适用到判别式下游任务上。
无监督预训练的目标函数是language modeling objective:
优化方法是SGD。
架构是多层Transformer Decoder。
如图所示:
它是Transformer的一个变体,包括在input context tokens上进行的multi-head self-attention操作接着position-wise feedforward layers用于产生在target tokens上的输出分布:
其中U是tokens的上下文向量,n是层数,是token embedding matrix,是position embedding matrix。
输入经过网络得到隐层激活,然后加一个线性输出层来预测y:
因此优化目标是最大化对数似然:
另外还发现在微调是加入language modeling的辅助目标可以提供监督模型的泛化能力并加速收敛。因此我们优化以下目标:
微调需要训练的参数只有和分割符的embedding。
将特定任务的结构化输入转换层模型能处理的有序序列。转换方式如上图右方所示。
无监督预训练:
数据集:BooksCorpus(7000不同的未发表的书籍,包括冒险、幻想、浪漫等题材,数据集中包含大量连续文本)
GPT语言模型在这个数据集上达到了很低的18.4的token level的困惑度。
模型设置:12层decoder-only的transformer,隐藏状态维度为768,12和attention heads,3072位feedforward内部状态维度。Adam优化器,最大学习率2.5e-4,最初的2000次updates学习率从0线性增加,然后余弦退火到0。epochs = 100, batch size = 64(随机采样),序列长度为512个tokens,N(0, 0.02)权重初始化。字节对编码(BPE),词汇表大小40000。residual,embedding,attention dropouts prob = 0.1。修改版的L2正则化(w = 0.01)。激活函数使用Gaussian Error Linear Unit(GELU)。使用学习到的position embedding而不是原始工作中的正弦编码。使用ftfy库清洗原始文本,标准化标点和空白,使用spaCy tokenizer。
微调细节:
重用预训练的超参数。对classifier增加0.1的dropout。大多数人数使用6.25e-5的学习率,batch size = 32。模型微调很快,大多数情况3个epochs就够。使用线性学习率递减(linear rate decay),warmup时间超过训练的0.2%。 = 0.5。
下游任务包括自然语言推理(NLI,也叫识别文本蕴含,即阅读一和句子对,判断是entailment还是contradiction还是neutral),问答,语义相似度,文本分类。有些任务在GLUE benchmark中。任务数据集:
NLI任务评估了5个不同来源的数据集:图像描述(SNLI),翻译的演讲稿,流行小说,政府报告(MNLI), Wikipedia文章(QNLI),科学考试(SciTail),新闻文章(RTE)。
评估结果:
问答和常识推理使用了RACE数据集,此外还在Story Cloze Test上进行了评估。
评估结果:
语义相似度(也叫paraphrase detection释义检测,即判断两个句子是否语义等价)。这个任务的挑战在于重新措辞(rephrasing),理解否定和处理句法歧义。使用了Microsoft Paraphrase corpus(MRPC), Quora Question Pairs(QQP)dataset,Semantic Textual Similarity benchmark(STS-B)三个数据集。
分类任务评估了两个:The Corpus of Linguistic Acceptability(CoLA)用于判断句子语法合法性的专家判断,测试语言模型的内在的语言偏置(linguistic bias); The Stanford Sentiment Treebank(SST-2)是一个二分类任务。
评估结果:
这一部分主要分析了迁移层数的影响和零次学习(即直接测试)的表现。下图说明了GPT在MultiNLI和RACE上迁移层数的影响以及zero-shot的表现:
可以观察到:迁移层数越多,性能越好。转移embedding可以提高性能,全部迁移提升了9%,这表明每一层都包含了有用的功能。
消融实验:证明了微调是辅助的LM目标函数有助于学习,并且较大的数据集更受益。以及架构优于LSTM。
本文引入了一个能使一个任务无关的单模型具有强大自然语言理解能力的框架:生成式预训练和判别式微调。
本次GPT文章的解读,我们了解了GPT的生成式预训练和判别式微调能极大提升模型自然语言理解任务的能力。GPT的架构是Transformer Decoder,它并没有做生成任务。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。