前面介绍了Transformer,随着其发展在NLP领域应用越来越多,在其基础上主要有两篇影响非常大的文章,一篇是GPT,另一篇是BERT。OpenAI提出的GPT采用Transformer解码器结构,一路更新迭代到了现在有了GPT-4,而Google提出的BERT采用Transformer的编码器结构。大体时间线如下图所示。这里对几篇文章的一些主要内容和发展脉络进行记录,其他更加细节的东西可以查看下面给出的论文原文或者资料里面的视频讲解。
一、相关论文
GPT1: Improving Language Understanding by Generative Pre-Training
GPT2: Language Models are Unsupervised Multitask Learners
GPT3: Language Models are Few-Shot Learners
GPT4: GPT-4 Technical Report
BERT: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
二、相关资料
GPT,GPT-2,GPT-3 论文精读【论文精读】
GPT-4论文精读【论文精读·53】
李沫讲BERT
李宏毅ELMO、BERT、GPT
OpenAI GPT4精简
三、GPT(Generative Pre-Training)
PDF: Improving Language Understanding by Generative Pre-Training
3.1 背景及思想
在CV领域,由于存在存在标注好的大型数据集,如ImageNet,因此在这些数据集上训练好一个模型,然后在到下游子任务中依据少量数据进行微调就可以得到一个不错的效果,这也使其应用非常广泛。但在CV领域缺少大规模标注好的数据,因此没法按照上述思想进行训练。GPT基于此问题采用半监督思路,现在无标签数据集上训练得到一个预训练模型,然后再到子任务上基于标注好的数据进行监督学习。
3.2 相关内容
-
无监督学习
训练的目标是对于给定序列,在前面k个词出现的情况下使得预测第i个词的概率最大化。
其中语言模型采用的是Transformer的Decoder结构,也就是带掩码的注意力。 -
监督学习
目标是对于标注好的数据进行训练,保证正确的标签y在输入x的情况下其概率最大,文中也举了几个具体的任务。
分类问题:采用Extract提出的特征在接一个Linear
蕴含:把两个句子用分隔符拼接,然后接一个Linear来预测
判断是否相似:把文本用分隔符拼接
多选:把问题和答案用分隔符拼接,然后每个答案都接一个Linear,最后预测对应的概率。
可以看到可以把不同类型的任务都转换成文本作为输入,进而不改变预训练模型的结构,只是后续接入的Linear层不一样。
3.3 网络结构
采用的是Transformer的解码器,每一个解码器输入和输出维度是一致的,GPT中采用12层,维度是768。
3.4 效果
预训练的数据集采用的是BooksCorpus dataset数据集,大约800M个词。可以看到其在不同任务上都具有不错的效果。
四、BERT
PDF: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
4.1 背景及思想
GPT发布后不久,Google就提出了BERT,从结构上来看应该借鉴了GPT的部分思想,也是在一个没有标注的大数据集上训练一个预训练模型,然后在子任务上进行微调。另外还借鉴了一篇前期的工作是ELMo:Deep contextualized word representations,其大体思想是采用两层双向的LSTM来基于上下文给每个单词一个Word Embedding,这样就很大程度上缓解了词在不同句子中歧义的发生。BERT可以看成是ELMo和Transformer的结合,由于要上下文信息,因此BERT选择的是Transformer中的编码器来代替LSTM。
4.2 相关内容
-
预训练
提出来两种训练策略。第一种是对输入句子中进行挖空(有15%的概率),相当于完形填空。
另外一种预测下一句,就是给BERT两个句子,判断这两个句子是否是邻近的。两个句子中间用特殊标记符SEP进行隔开,然后开头也引入一个标记符,其输出用于做分类。这里CLS其实放在任何位置都可以,因为内部采用的是自注意力机制。
文中训练采用两种策略一起,训练的数据集在GPT采用BooksCorpus(800M words)的基础上还增加了English Wikipedia(2500M words)其输入如下:
-
微调
这一步和GPT类似,依据前面训练好的模型,然后根据特定的子任务,再接一个Linear层,得到对应任务的输出。在不同任务上微调:
4.3 网络结构
采用的是Transformer的编码器结构,每一个编码器输入和输出维度是一致的,BERT有两个版本,BERT_Base版本和GPT一样采用12层,维度是768,参数大小约110M,BERT_Large采用24层,维度选择1024。这里Base版本估计是为了和GPT比较,而后面Large应该是对应的数据集更大而设大的。
文中也给出了几种方法的结构对比,GPT采用的是解码器,需要按顺序,所以图中只画出了前面的连接,和后面的是没有连接的。
4.4 效果
在不同数据集上进行测试,发现效果都霸榜了。