【李宏毅2020 ML/DL】P25 ELMO, BERT, GPT
我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的、自己不知道的东西。
已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-notes
本节内容综述
- 首先概略地复习一下,在有
ELMO, BERT, GPT
这些技术前,我们如何做NLP:对词独热编码;之后考虑了Word Class
,Word Embedding
技术。 - 但是,一个词汇可能有不同的意义,传统来讲:
In typical word embedding, each word type has an embedding
。因此,我们不考虑word type
,而是word token
对嵌入。见[小细节](#Contextualized Word Embedding) - 如何做到Contextualized Word Embedding呢?使用
Embeddings from Language Model (ELMO)
。 - 之后,介绍了
Bidirectional Encoder Representations from Transformers (BERT)
。包括BERT的训练与用法。 - BERT在NLP领域的比赛基本屠榜。
- 接下来介绍了
Enhanced Representation through Knowledge Intergration (ERNIE)
。 - What does BERT learn?
- 接着介绍了 Multilingual BERT。
- 接下来进入
Generative Pre-Training (GPT)
部分。体积巨大,BERT是Transformer的Encoder,而GPT是Transformer的Decoder。 - GPT很有趣,能做很多有趣的事,且无需额外训练。
文章目录
小细节
Contextualized Word Embedding
如图,对有颜色的输出,是对 bank 进行 embedding。如果语意相近,比如下面的两个句子,那么其bank输出对应的embed向量就会是相近的。
Embeddings from Language Model
如上,ELMO是一种基于RNN的技术:
- 在训练时,输入第i个词,输出为第i+1个词;
- 这样,把隐层的值拿出来,就是输出那个词的embedding向量;
- 值得注意的是,为什么叫做
Contextualized
:因为如上,同样都是输出“退了”,但是前文却不同。
但是,这样,只考虑到了前文,没有后文。因此,我们再来一个返向的RNN。
如上,正向反向、不同层都会对同一个词产生Embedding`,ELMO这篇文章就选择了“我全都要”的思路。
如上,将不同层的嵌入向量求加权,其中权重是通过任务的表现学出来的。
Bidirectional Encoder Representations from Transformers
- BERT = Encoder of Transformer
- Learned from a large amount of text without annotation
如上,李老师提醒我们:
- 中文的词太多了,几乎无法穷举;
- 因此我们把常用的 4000 + 的中文的“字”做embedding更为合适。
Training of BERT
Approach 1: Masked LM
如上,给某一个词盖上MASK,接着将其由BERT产生的向量取出,放入线性分类器
中:
- 线性分类器能力较弱,如果线性分类器都能很好好得区分,说明词嵌入做得好;
- 这样得效果就是,如果两个词放在同一地方没有违和感,那么它们就有类似的embedding。
Approach 2: Next Sentence Prediction
如上,我们有两个句子,将其以[SEP]
作为中介进行拼接,在开头放置一个[CLS]
,其对应的输出放入一个线性二分器,对应“两个是拼接在一起的
”,或“不是拼接在一起的
”,以此进行训练:
- [CLS]放在哪里都没关系,因为 Transformer 中的 Self-attention 是“天涯若比邻”的。
在 BERT 文章中,两个方法一起训练。
How to use BERT
文章中有四个BERT应用示例。
Case 1
如上,可用于对句子的情感进行分类:
- [CLS]对应的输出,放入线性分类器中,作为最终的类别;
- BERT中的参数只需要跟着任务训练微调就好。
Case 2
如图,BERT也可用来做 Slot filling ,为句子中的每个词确定成份与类别。
Case 3
如图,输入两个句子(比如一个前提,一个假设),输出这个假设是否成立或是不确定。
Case 4
如上图,进行阅读理解并回答。但是这里放了个水:答案一定出现在文章里
。
输入一个文章(以 token 形式),输入一个问题;输出两个整数:
- s代表答案的第一个token在文章中的起始索引;
- e则代表结束索引。
BERT在其中起的作用如上。其中:
- 如果s大于e,那说明机器认为这个问题是不可回答的;
- BERT只要搬过来就好,而红色和蓝色代表的向量是从文章中学来的。
Enhanced Representation through Knowledge Intergration
特别为了中文设计的。
其将由字组成的词汇盖住,让机器进行推测。
What does BERT learn?
BERT接近输入的层,进行了与文法有关的任务;在输出附近的层,进行的会是比较困难的任务。
可以通过下面的实验看出。
BERT有24层,因此每个词汇可以抽出 24 个向量,把这 24 个向量做统计(叫 weight sum),见https://arxiv.org/abs/1905.05950。
我们就会值得,这些任务特别需要 BERT 中的哪些层。
对于 POS (词性标记)这个任务,把第 11-13 层的word embedding抽出来,更为合适。
如果比较困难的任务,则抽出后面的层作为embedding更为合适。
Multilingual BERT
谷歌自动爬了 104 种语言的文章。
这个 BERT 可以做到说:教它英文文章分类,其会学到中文文章的分类。
Generative Pre-Training
如图,GPT-2多达 1542M 个参数,体积巨大。
但是 GPT 不是芝麻街人物…
BERT是Transformer的Encoder,而GPT是Transformer的Decoder。
如上,依次输入句子元素,进行预测。
GPT做的神奇的事
Zero-shot Learning?
如上,GPT在输入A:
后会自动输出答案,原因可能为其训练数据种出现过问答的句子。其表现在参数量大时也是较为可观的。但是对于 Summarization 与 Translation 这两个问题,表现则没有那么好。
Visualization
如图,很多次都要倾向于attend到第一个词汇;第一个词没有特别的地方,当不需要attention时,机器可能学到,自己找第一个词汇。
自动写文章
OpenAI输入一段文字,GPT-2自动输出了一段话。
OpenAI没有开放参数最多的版本,但是参数较小的版本已经有了Demo:
- https://talktotransformer.com/
- 目前已经用不了了…因为运营成本太高
甚至程序都能写。
这个图有两个意思:
- GPT-2 很有趣,甚至比 BERT 有趣;
- 但是你难以得到 GPT-2 。