本文为预训练语言模型专题系列第四篇

前期回顾:[萌芽时代]、[风起云涌]、[文本分类通用训练技巧]

感谢清华大学自然语言处理实验室对预训练语言模型架构的梳理,我们将沿此脉络前行,探索预训练语言模型的前沿技术,红色框为前期脚印,绿色框为本期介绍,欢迎大家留言讨论交流!

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模型不同于之前模型的特点:

  1. GPT的模型核心组件选择了Transformer,区别于之前的其他一些模型包括ELMo的LSTM。这确实给模型带来了极大的性能和速度提升。关于Transformer原理,我受限于篇幅,不在这里赘述,但是强烈推荐大家对Transformer进行深入了解,可以查阅文后的参考阅读,网上的介绍也很多,如果大家希望我们出一期Transformer的推送,也可以在后台留言。

  2. 为了方便将语言模型的能力transfer到下游的各种任务上去,GPT对模型的输入进行了规范,称为 traversal-style input transformations。把各种任务的结构化输入统一转化为有序的序列。避免在应对不同任务时,要对模型进行大的改动。其实做法很简单,我们看下面这个图就知道,使用特定的符号,来界定文本序列的开始,间隔和结束,并在预训练时做相同的处理即可,BERT也使用了这种方法。

  3. GPT对词典使用了 bytepair encoding (BPE) 。这样做的目的是为了缩小词典,就英文来说词是表示意义的基本单位,但是常用词有30000-50000个,全量的可达130000。字符只有256个,但是并不能很好地展现语义信息。所以应该可以找到一个更好的subword units来作为基本单元,即不能将句子长度被增加太多而降低模型性能,也能有效减少词典的大小以减少模型参数量,这种做法也确实对模型性能的提高有很大帮助。BPE的实现在下方模型细节会提到。

GPT模型和之前模型的共同点:

  1. GPT模型使用经典的two stage training。第一个阶段,将一个大容量的语言模型在很大的无监督语料上进行预训练。第二个阶段,在特定任务的监督数据上进行finetune。

  2. GPT模型沿袭了我们第一期 [萌芽时代] 中所讲文章 Semi-supervised Sequence Learning 的方法。将语言模型预训练后,把模型的参数作为监督模型的起始点的做法。而有区别于第一期所讲另一篇context2vec,或第二期 [风起云涌] 所讲的ELMo这样,通过预训练模型生成带上下文信息的向量表示,然后作为监督模型的特征。

  3. GPT使用了标准的语言模型目标,优化某个词在其前面k个词出现情况下的条件概率。

  4. 与之前的一些文章一样,GPT在特定任务的训练时,会把语言模型目标的误差一起加在总误差中联合训练,以提升模型的泛化能力,缓解灾难性遗忘

模型细节

GPT使用了 multi-layer Transformer decoder 作为语言模型的层结构。GPT模型一共有12层,每层是一个 transformer的decoder,有768维hidden state和12个attention头。position-wise feed-forward network 使用了3072维内部状态。输入层的tokens 经过word embedding 和 position embedding ,最后通过softmax得到输出的概率分布。语言模型的训练使用了2000轮的warmup,最大学习率为2.5e-4,接着通过cosine schedule下降到0,dropout使用0.1,输入的最大长度为512。在直接finetune任务目标的时候,模型训练了三轮。

同时GPT使用了 BPE vocabulary with 40,000 merges。BPE算法在论文Neural Machine Translation of Rare Words with Subword Units 中也有具体的代码,简单的说,算法会把相邻字符的bigram计算出现的次数,每次都把出现次数最多的bigram合并。原来的词典是256个unicode,最后经过num_merges次合并以后,词典中就多了num_merges个在整个文章中出现较多的“词根”, 比如lower中的low,widest中的est都会被合并起来。编者自己运行了一下下方的代码,最后得到的vocab是 {'low': 5, 'low e r ': 2, 'newest': 6, 'wi d est': 3}。出现最多的字符对都被merge起来,他们一般会倾向于具有独立的含义,而没有被merge的相邻字符对显然是很少联合表达某个含义,所以他们被分开进行embedding是合理的。

Language Models are Unsupervised Multitask Learners(2019)

GPT家族的杰出后代GPT-2同样是由OpenAI发表,GPT-2希望能够使模型不经过任何改变就可以在下游任务上获得比较好的性能,也就是zero-shot

要达成这个目标,模型就要是通用的,不能只在某些任务上进行训练。它的语言模型目标,跟GPT相似,但是因为模型要在多任务上都能有较好的表现,所以模型的预测不仅要基于前几个词作为条件,同时也要将任务考虑在内。

GPT2相比于GPT的几个变化:

  1. 数据集变大了,GPT2建立了一个包含了45M个链接的数据集,经过了去重和基于经验的清洗后还有8M个文章总共40GB的文字数据。

  2. BPE现在会避免不同类型的字符进行merge,上面介绍过了BPE的原理,作者们发现在merge后会出现dog. dog? 等组合,这使字典的构建引入了噪声和不必要的变化。

  3. 模型上的微小变化, Layer normalization被移到了transformer层的输入位置,在最后一个self attention block 后添加了额外的 Layer normalization。

  4. 超参变化,字典扩充了10000个左右,一句句子最长长度从512提升到了1024,训练时batch_size 提升到了512

它最小的模型结构等同于GPT模型,其次的等同于BERT-LARGE,最大的才是真正被称为GPT2的模型有1.5B个参数。模型如此庞大,比之前最先进的预训练语言模型大了12倍,数据集大了15倍。作者们认为一个巨大的模型,在一个巨大的数据集上经过了高效的训练,就能在不同的任务上取得优异的效果。事实也是这样,GPT2在七个任务上不需任何标注数据,就能超过原来的state-of-art。简直惊呆了!

更令人惊讶的是,GPT2竟然还会写代码!!!

难怪Facebook AI研究院的 Tim Rocktäschel 看了GPT2写的代码都表示:我们要有大麻烦了! GPT2如此强大,以至于OpenAI 的研究人员们当时决定暂时不发布训练模型所用的数据、也不发布最大的真正GPT2的参数,因为他们认为模型有遭到恶意滥用的风险==

未完待续

本期的论文就给大家分享到这里,感谢大家的阅读和支持,下期我们会给大家带来预训练语言模型其他的论文阅读分享,敬请大家期待!

欢迎关注朴素人工智能,这里有很多最新最热的论文阅读分享,有问题或建议可以在公众号下留言。

参考资料

  1. Attention Is All You Need (2017)

    https://arxiv.org/abs/1706.03762

  2. [NLP] Transformer详解

    https://zhuanlan.zhihu.com/p/44121378

  3. GPT2

    http://m.elecfans.com/article/880042.html

  4. 一分钟搞懂BPE

    https://blog.csdn.net/qq_27590277/article/details/88343988

推荐阅读

  • 十分钟了解文本分类通用技巧

  • 一次实体识别和实体消岐的积极尝试

  • Kaggle TensorFlow 2.0 Question Answering 16名复盘

  • [预训练语言模型的前世今生] 风起云涌

  • LaserTagger: 文本生成任务的序列标注解决方案

[预训练语言模型专题] 银色独角兽GPT家族相关推荐

  1. 训练dnn_[预训练语言模型专题] MT-DNN(KD) : 预训练、多任务、知识蒸馏的结合

    本文为预训练语言模型专题系列第八篇 快速传送门 1-4:[萌芽时代].[风起云涌].[文本分类通用技巧].[GPT家族] 5-7:[BERT来临].[浅析BERT代码].[ERNIE合集] 感谢清华大 ...

  2. 训练dnn_[预训练语言模型专题] MTDNN(KD) : 预训练、多任务、知识蒸馏的结合

    本文为预训练语言模型专题系列第八篇 快速传送门  1-4:[萌芽时代].[风起云涌].[文本分类通用技巧] . [GPT家族]5-7:[BERT来临].[浅析BERT代码].[ERNIE合集]感谢清华 ...

  3. [预训练语言模型专题] MT-DNN(KD) : 预训练、多任务、知识蒸馏的结合

    本文为预训练语言模型专题系列第八篇 快速传送门   1-4:[萌芽时代].[风起云涌].[文本分类通用技巧] . [GPT家族] 5-7:[BERT来临].[浅析BERT代码].[ERNIE合集] 感 ...

  4. 预训练语言模型整理(ELMo/GPT/BERT...)

    预训练语言模型整理(ELMo/GPT/BERT...)简介 预训练任务简介# 自回归语言模型# 自编码语言模型 预训练模型的简介与对比 ELMo 细节# ELMo的下游使用# GPT/GPT2# GP ...

  5. [预训练语言模型专题] 十分钟了解文本分类通用训练技巧

    欢迎大家来到预训练语言模型的专题系列分享,本篇推送是该专题系列的第三篇.在前两篇推送[萌芽时代],[风起云涌]中,我们分享了该领域的奠基文章以及声名鹊起却生不逢时的ELMo模型,本期我们带来的文章将会 ...

  6. 赠书 | 一文了解预训练语言模型

    来源 | 博文视点 头图 | 下载于视觉中国 近年来,在深度学习和大数据的支撑下,自然语言处理技术迅猛发展.而预训练语言模型把自然语言处理带入了一个新的阶段,也得到了工业界的广泛关注. 通过大数据预训 ...

  7. 周末送新书 | 一文了解预训练语言模型!

    近年来,在深度学习和大数据的支撑下,自然语言处理技术迅猛发展. 而预训练语言模型把自然语言处理带入了一个新的阶段,也得到了工业界的广泛关注. 通过大数据预训练加小数据微调,自然语言处理任务的解决,无须 ...

  8. 大模型系统和应用——Transformer预训练语言模型

    引言 最近在公众号中了解到了刘知远团队退出的视频课程<大模型交叉研讨课>,看了目录觉得不错,因此拜读一下. 观看地址: https://www.bilibili.com/video/BV1 ...

  9. 业界分享 | 阿里达摩院:超大规模预训练语言模型落地实践

    2021年3月,阿里达摩院机器智能实验室AliceMind家族发布了最新训练的270亿参数规模的中文语言理解和生成统一模型--PLUG,但随着预训练模型规模越来越大,如何将大规模的预训练模型在下游任务 ...

最新文章

  1. IP地址和MAC地址
  2. Java平均工资再次上涨!这份宝藏资料限量免费送!
  3. 手写识别python_Python徒手实现识别手写数字—图像识别算法(K最近邻)
  4. c语言邻接表的构建_c语言数据结构--图的邻接矩阵和邻接表操作的基本操作
  5. LeetCode OJ -Happy Number
  6. stl-vector
  7. asp按钮跳转页面代码_重磅更新!全新Web编辑页面、编辑规则快速跳转、状态栏变色、富文本再次升级!...
  8. Requested resource=<memory:-1, vCores:1>问题解决
  9. oracle有sysdata,Oracle基础
  10. 从AIDL一窥Android Binder机制
  11. 在Mac下安装nvm管理node
  12. ftl不存在为真_科学网—世界上第一个真正的超光速实验 - 张操的博文
  13. TFS配置过程中的错误
  14. 写好PPT的四大要点
  15. dirt安装,记录两个印象深刻的问题
  16. android 离线语言识别
  17. 计算机磁盘图标变成软件的了,电脑的本地磁盘图标变成一个U盘形状图标了怎么回事?如何解决?...
  18. 车载服务器系统,车载系统平台与终端产品的介绍
  19. P3386 【模板】二分图最大匹配
  20. 计算机故障代码ff,电脑开机时主板上只显示FF怎么回事?

热门文章

  1. 如何读懂交易伙伴的EDI需求
  2. percent sql_使用SQL Server中的PERCENT_RANK函数计算SQL百分位数
  3. 微信小程序自定义底部弹窗
  4. matlab中的符号计算,sym、syms的区别
  5. 操作系统如何建立异常处理?
  6. 系统架构师(四)计算机网络
  7. IIC协议编程要点,24C04为例
  8. 【Java开发岗:SpringCould篇】
  9. 6-75 绘制多叶玫瑰线
  10. python opencv 三维重建_【python+opencv实现基于图片序列的三维重建】 - #1