Hello 大家好，我是花花
我们今天读的这篇论文是来自OpenAI
文章的标题叫《Language Models are Few-Shot Learners》
翻译成中文为《语言模型是小样本学习者》
本文的署名作者高达31位
论文的长度也来到72页
当然很大一部分是实验结果和分析
如果我告诉你它的另外一个名字
相信有一部分同学应该有所耳闻
对，它就是最近火遍全网的GPT-3
没听说过？
没关系
让我们先看一些demo
看看GPT-3能做什么
我们看到的第一个例子就是从
一句自然语言描述来生成相对应的网页
包含HTML和CSS
这边我们可以看到模型输出出错了
还是有一些地方需要去手工修改
同时也从侧面证明它不是造假造出来的
第二个例子就是从自然语言生成SQLQuery的代码
第三个例子就是用GPT-3生成Keras Model
用AI Model来创建AI Model
是不是有点细思极恐啊？
相信现在大家应该了解GPT-3是什么了吧
本视频到此结束
你还没有关掉视频吗？
那就让我们一起来深入了解一下GPT-3吧
这期视频会比较长
但我相信你看完后
会和我一样
对NLP...
还是一无所知
今天的提纲基本还是按照文章的结构来
先是Introduction （简介）
然后是Approach （方法）
第三章是Results（结果）
第四章是讲Measuring和Preventing Memoization
GPT-3也不是完美的
第五章作者列出了模型的一些局限性
GPT-3的应用非常广泛
第六章就是讲它的影响力
相关工作放到了第七章
最后第八章是结论
就是典型的八股文
由于时间关系我门今天会讲最重要的前三章
在NLP（Natural Language Processing）领域
最近几年的趋势是
使用Pre-trained language representations
预先学习的语言表示
比如早期的word vectors
采用单层的表示
后面接task-specific architecture
即任务相关的网络结构
之后又出现了RNN和多层网络用来构建更强的表示
但还是需要接任务相关的结构
直到最近
预训练的recurrent或transformer语言模型
可以直接被fine-tune
完全从任务相关的结构中解放出来
然而之前的这些方法还是需要
任务相关的数据集来进行fine-tuning
每个任务需要几千到几十万个样本来训练
成本高可扩展性差
而且通常泛化能力有限
对此，作者给出的解决方案有两点
第一 Meta-learning 元学习，学习如何学习
模型在训练阶段学习到了广泛的技能和模式识别能力
能快速地在inference阶段快速适应
或者直接认出任务
第二 作者看到了Transformer模型的参数这几年在不断地膨胀
从2018年的1000万/3000万
一路高歌猛进到2019年的15亿/80亿/110亿
2020年2月，微软刚刚放出了人类历史上最大的language model
拥有170亿参数的Turing
参数的增加也给模型带来了显著的性能提升
再加上有paper提出log loss会随着模型的增大而变小
作者猜想一个更大的模型应该会有更好的表现吧
于是就有了GPT-3
一个参数高达1750亿的怪兽
足足是Turing的10倍之多
和其他模型相比
除了参数更多之外
最主要的差别就是
GPT-3在训练的过程中没有使用fine-tuning
就在很多任务中和fine-tune过的模型
取得了更好或者相似的成绩
GPT-3的模型到底长什么样呢？
文章中说模型和GPT-2类似
于是我又找到了GPT-2的paper
Language Models are Unsupervised Multitask Learners
结果说和GPT类似
我只好再去看GPT的paper
Improving Language Understanding by Generative Pre-Training
Generative Pre-Training
这也是GPT名字的由来
终于这篇文章明确地说了GPT使用了transformer结构
训练目标也很简单粗暴
就是给你前n-1个字符
让你去预测第n个字符
从GPT-1一直到GPT-3
网络结构和方法都没有什么本质上的改变
仅仅是参数和数据集的大幅提升
这就是所谓的大力出奇迹吧
作者一共训练了8组不同大小的模型
n_parameters 是可训练的参数个数
n_layers 是总的层数
d_model 是bottleneck layer的神经元数量
n_heads 是attension head的数量
d_head 是每个attension head的dimension
所有的模型都使用了相同的2048个token的context window
参数的规模从1250万一直到1750亿
跨越了三个数量级
用来研究尺度对模型的影响
GPT-3和其他众多的语言模型一样
都使用了Transformer 
Transformer是什么？
我Google了一下
是变压器呢还是变形金刚？
好像都不是
Transformer是Google于2017年
提出的一种新的语言模型结构
论文的名称是《Attention is all you need》
发表于NIPS，目前已经有10857个引用
三年前的文章你就知道这个东西有多厉害有多火了
主要用来解决sequence to sequence问题
输入是一个sequence
比如一句英文的句子
输出也是一个sequence
比如一句中文的句子
也就实现了英译中
当Transformer也可以被用在其他任务上
Transformer是auto regressive的
上一个输出的符号会作为新的输入的一部分
来预测下一个符号
和大多数语言模型一样
Transformer用的也是encoder-decoder结构
但是完全移除了recurrent或者convolution layers
仅仅依靠attention mechanisms
这个使Transformer的训练速度大大提高
并且在机器翻译任务上取得了更加优秀的成绩
前一段时间比较火的BERT
全称为Bidirectional Encoder Representations from Transformers
也是基于Transformer的
由于时间的关系我们今天就不展开讲Transformer了
大家感兴趣的可以去看一下论文
之前也提到过
GPT-3和其他模型最主要的不同
是在于它没有fine-tuning
所以GPT-3在跑分上并不占优势
作者也另辟蹊径
从其他角度来验证GPT-3的威力
首先让我们来看一下一些定义
Fine-tuning 微调
是指在一个预训练好的模型上
进行任务相关的监督学习
并更新模型的权重
这使得模型能在benchmark上有出色的变现
但往往泛化能力有限
作者又强调了一次GPT-3没有使用fine-tuning
Few-Shot (FS) 小样本
也就是GPT-3着重（关注）的模式
在这个模式下
不允许更新模型的参数
但可以给模型10-100个样本（<2048 tokens）
这个数量比想象中的要多
但比起fine-tuning的成千上万还是要小不少
而且这些样本是作为conditioning（制约）
而不是作为（训练）数据 还是不能更新weights
One-Shot (1S) 单样本
和Few-Shot一样
只是样本数量降到了1个
作者说加入这个评测条件是为了和人类对比
其实人类更接近
最后一种Zero-Shot (0S)
只有自然语言描述的问题
没有给样例
下面我们就通过一个例子
来看一下上面几种方法的不同
最左边的是fine-tuning
甚至都不用给出任务描述
是不断地看 pair组成的examples
然后更新weights
最后给你一个input
让你predict output
然后我们来看一下Zero-shot
给你一个自然语言表述的题目：
Translate English to French
然后直接给出input
模型需要predict output
是不是想起以前的英语考试
将下列句子翻译成英文
就是一个典型的Zero-shot
没有给你任何的提示和样例
One-Shot稍微好一点
给了你一个例子
另外给你一个input
然后在不更新weight的情况下
Predict output
这边给你了sea otter对应的法语翻译
其实是帮助你更好地理解问题本身
我看下来GPT-3最大的问题是在于
它并不能很好地理解这个问题本身
对于同一个输入在不同的context下在不同的task下
它其实可以有完全不同的输出
所以说从目前来看它还是需要Few-Shots
来帮助它去了解到底要干什么事情
Few-shot就是增加样例数量
同样不允许更新weight
你一定很好奇这么多参数的GPT-3
到底需要多少训练数据吧？
现在的模型都越来越大
数据集也在与时俱进
GPT-3所使用的Common Crawl dataset
已经达到了10000亿单词的规模
这个数据集的的来源就是爬虫收集到互联网上的文章
作者发现必须使用一个过滤后的版本
才能获得比较好的性能
最后只留下了4100亿个token
这是不是从侧面反映了目前互联网上的整体水平不太行？
除了Common Crawl dataset
作者还是用了
WebText2和Wikipedia等其他数据集
并且还在document level做了fuzzy deduplication来去重
以确保training set和validation set没有交集
一个方法论上的担忧就是
现在的模型都太大了
大到足以记住大部分的训练数据
其中有一部分不可避免地会和下游任务重叠
这相当于作弊了
所以作者尝试去移除所有的overlap
不幸的事情是中间出现了一个bug
导致有一部分重叠的内容没有filter掉
但是没有办法重新训练了
因为代价实在太高了
据说训练一次的成本是460万美元
也有说是1200万美元的
反正很贵就是了
这篇文章中并没有过多地谈论训练过程
估计是和之前的GPT-2基本一样
只知道使用了微软提供的V100GPU集群
当然这不是我们这些人应该关心的东西
接着就是结果了
首先我们来看一下计算量和loss之间的关系
其中横轴是计算量
单位是PFLOPS/s - 天
也就是说如果算力为1PFLOPS/s
需要训练多少天
1PFLOPS/s大概是10块V100的算力
已经不低了
但拿来训练GPT-3则需要10年
你就能想象它的计算量到底需要多大了
纵轴是cross entropy validation loss
我们可以看到它和计算量之间
服从power-law
这说明了几何级数的计算量的增长
才能换取线性的性能提升
作者从将任务分为9组来验证模型的性能
它们分别是
传统的语言建模任务
闭卷的问题回答任务
翻译任务
Winograd Schema类似的任务
常识推理和问答
阅读理解任务
SuperGLUE benchmark
NLI
作者发明的一些任务，包括即时推理，适应技能，开放式文本分析等
由于时间关系
我会挑一些比较有意思的（GPT-3表现比较好）的任务来讲
首先是传统的语言建模任务
例如单词预测
句子和段落的补全
完形填空等
在PTB数据集上
GPT-3的Zero-Shot performance直接比
当时的state-of-the-art的GPT-2提高了整整15分
接着是LAMBDA数据集
这个任务是让模型阅读一个段落
然后预测最后一个单词
考验模型的长距离能力
我们来看一个例子：
Alice was friends with Bob. Alice went to visit her friend __
这个问题很明显填Bob，比较简单是因为Bob在前文中出现过
George bought some baseball equipment, a ball, a glove, and a __
乔治买了一些棒球装备：一个球，一副手套和一__
这个就需要推理了，因为答案并没有直接出现在上下文中
这里应该填bat, 球棒
当然你也可以说是衣服帽子球鞋等等
也是有可能的
最好的答案的话应该还是球棒
GPT-3在Zero-Shot模式下准确度已经比
state-of-the-art提高了8%
在few-shot模式下更是足足提高了18之多
来到了86%
但还是比人类96%左右的准确度差了不少
右图给出了在不同参数下GPT-3的
Zero-Shot, One-Shot和Few-Shot的性能比较
有趣的是Zero-Shot的performance
居然比One-Shot高
因为如果例子找的不好One-shot反而会误导模型
接着我们来看下闭卷你问我答
主要用来测试事实性的知识
比如地球到月球的距离
传统你问我答系统都会使用一个信息检索系统
你可以想像成通过搜索引擎搜索关键词
然后再把回答整合一下
这种其实是属于开卷
最近的研究表明
大型语言模型已经可以
在不依赖外部信息的情况下
回答这些问题
在下图中我们可以看到
GPT-3在TriviaQA数据集上的表现
One-Shot和Few-Shot
均已经超过了Fine-tuned的state-of-the-art
在另外两个数据集
WebQuestions和Nature Questions
和专门这些数据集优化过的模型相比
GPT-3的表现就要逊色一些
作者连图表都懒得放了
我专门地去看了下TriviaQA的样例
大部分都是些非常冷门的小众知识
比如第一个问题
2011年2月，在英国哪个赛马场有两匹马在亮相圈中碰撞后触电身亡的？
让你去回答是哪个赛马场
如果你没有看到那篇文章或者新闻的话
几乎是不可能回答的出来的
但如果看过的话，或者使用开卷模式
基本都能回答出来
所以说这个任务还是比较简单的
只要模型足够大数据足够多就行了
接下来是非常实用的机器翻译的性能表现
目前无监督学习的机器翻译模型通常
在一对单语言的数据集上进行预训练
然后通过反向翻译来连接两种语言
反向翻译就是将翻译后的文本再翻回原来的语言
然后和原文进行对比
比如先将英文翻译成中文
再从中文翻译回英文
好的翻译软件应该可以得到和原文差不多结果
但GPT-3却不是这么做的
GPT-3直接从融合了多语言的训练数据中学习
当然训练集主要还是以英语为主大约有93%
剩下7%是其他语言
而且GPT-3只有一个训练目标
并没有给任何一个任务做设计或者定制
在Zero-Shot的模式下GPT-3的表现不够理想
但在Few-Shot的模式下
GPT-3的表现有了大幅提高
从法语/德语/罗马尼亚语转换到英语的表现
都达到甚至超过supervised state-of-the-art
说明作为翻译模型GPT-3还是很强的
只是在Zero-Shot模式下它还不知道自己要干什么而已
这就是我之前说的它对任务本身的理解能力是有限的
这张图展现了翻译能力和模型参数的关系
基本上也是参数指数增长性能线性增长
有意思的是从其他语言翻译到英文的表现
要远好于从英文翻译到其他语言
我估计可能还是数据集英语占大部分的问题
为了更加系统地和一些热门的模型
比如BERT和RoBERTa比较
GPT-3也跑了SuperGLUE benchmark
可惜表现不太理想
和Fine-tuned BERT-large互有胜负
但和state-of-the-art还有不小的差距
从这两张图我们可以看到
模型的表现随着参数提升还是比较平稳地增长的
但Zero-shot的表现不尽人意
使用了32个example的Few-shot模式下
也只有在1750亿参数下稍微能打一下
GPT-3也可以被当作计算器来用
在Few-Shot模式下已经可以非常可靠地计算
2位数的加法和减法了
但3位数字以上的表现就直线下降了
虽然基本的数学运算是一个非常简单的task
但需要注意的是GPT-3并没有针对这个任务做相关的学习
我想这才是GPT-3真正强大的原因吧
虽然还有很多可以改进提高的地方
下一个任务是News Article Generation
新闻文章生成
我觉得可以好好讲一下
早在GPT-2时代
其实也就是去年
就可以用机器生成新闻了
文章的开头第一句话是人写的
模型就会把它续写成一篇新闻
不过这个方法在GPT-3上不太管用
因为新闻在训练集中之占很小一部分
所以GPT-3会把人类写的一句话当成一条微博
然后自动生成回复或者转发的内容
真是让人哭笑不得
为了解决这个问题
作者利用了GPT-3的Few-Shot学习能力
把三篇新闻放入GPT-3的context来约束它
之前说了GPT-3的context window是2048个token
可以放下三篇比较短的新闻
然后只要给一个标题和副标题
GPT-3就能可靠地生成一篇新闻类的文章了
这继续说明了GPT-3本身还是很强的
就是对任务的理解能力比较弱
为了验证GPT-3新闻的生成能力
作者从新闻网站上随机取了25篇文章
平均长度为215个单词
把文章的标题和副标题输入模型
让模型生成文章
参与者会读到原来的文章和机器生成的文章
然后问参与者这篇文章是人写的还是机器写的
这下面这张表中我们可以看到
随着模型参数的增加
生成的文章越来越难被区分
从最小的模型的86%
一路降低到GPT-3的52%
已经接近随机猜测的50%
下面这篇文章就是由GPT-3生成的
大家可以自己读一下
感觉有那么点味儿了
只有12%的参与者认为这篇文章是机器写的
所以说GPT-3还是十分强大的
由于时间关系我们今天就看前三章
相信你对NLP和GPT-3已经有了一点点了解
希望这个视频能够对你有所帮助
我们下期再见
我是花花
Byebye
