NLP/台大 Bert、ELMO、GPT 学习笔记
这篇文章用于记录台大李宏毅老师的 ELMO,BERT,GPT 课程 的学习笔记。课程地址:https://www.bilibili.com/video/av64570585/
这篇文章用一句话概括,就是:如何让机器看懂人类的文字。
为了让机器更好地理解人类的文字,学术界做了许多的研究,截至目前为止,在这个方向上最新的进展:ELMO、BERT、GPT。上一篇文章讲了 Transformer,而 BERT 是 Transformer 里的 Encoder,GPT 是 Transformer 里的 Decoder。
EMLO
上一篇文章讲了 Word Embedding,也就是每个词都使用一个向量来表示,向量中包含了词的语义信息。
通常一个词只有一个 Embedding 向量已经足够了,但是实际中,同一个词出现在不同的句子,可能有不同的含义。
例如:下面 4 个句子中,前 2 个句子的bank
表示银行,后 2 个句子的bank
表示河边。
1 | Have you paid that money to the bank yet ? |
在之前的 Word Embedding 中,所有的bank
的 Embedding 都是一样的。但是在上面 4 个句子中,前 2 个句子的bank
和后 2 个句子的bank
的 Embedding 应该是不一样的。我们希望,模型对于同一个词,能够根据不同的上下文,学习出不同的 Embedding。这种方法叫做 Contextualized Word Embedding 。
为了达到这个目的,一种叫 ELMO (Embedding from Language Model)的方法被提出来了。这是一种基于 RNN 的。
具体是使用两个 RNN:
- 左边的 RNN 根据前一个词,输出后一个词,学习到了前文的信息
- 右边的 RNN 根据后一个词,输出前一个词,学习到了后文的信息。
两个 RNN 训练完成后,取中间的 Hidden state,并拼接起来,得到最终的 Embedding,这个 Embedding 包含了上下文的信息。
上面的图中只有一层 RNN,在实际中,可以设置多层的 RNN ,这样就会得到多个层对应的 Embedding。那这时应该选择哪些层的 Embedding 呢?ELMO 的做法是这些 Embedding 全都要,将每一层的 Embedding 加权求和,得到最终的 Embedding。这里的权值,是和具体的 NLP 任务一起训练得到的,比如 Coreference(找出指代词对应的词)、SQuAD(问答系统)、SST-5(文本情感分类)。
BERT
Bert 就是 Transformer 的 Encoder 部分,全称是 Bidirectional Encoder Representations from Transformers。
在 transformer 中,Encoder 的输入是一句话的序列,输出是每个词的 Embedding 向量。
所以,BERT 的作用也是训练得到每个词的 Embedding。
训练 BERT 的方法包括两个:Masked LM 和 Next Sentence Prediction。
在实际中,这两个训练方法是同时应用到 BERT 中的。
Masked LM
- 输入给 BERT 的句子中,会随机选择 15% 的字或者单词置换为一个特殊的 token,称为 MASK。
- 然后把整句话输入到 BERT,得到每个词的 Embedding。
- 把 MASK 位置的 Embedding,输入一个线性的分类器,根据 Embedding 预测这个位置的词是哪一个。
因为最后的分类器是一个简单的线性分类器,拟合能力弱,而它的输入是从 BERT 中学习到的 Embedding,这就要求从 BERT 中学习到的 Embedding 是一种非常好的 representation。
Next Sentence Prediction
第二种训练方法是:把两个句子拼接起来,中间添加一个 SEP 的分隔符,并在最前面添加一个 CLS 的 token,经过 BERT 得到每个位置的 Embedding,把 CLS 位置输出的 Embedding 输入一个线性 2 分类器,判断这两个句子是不是属于前后关系。
你可能有 一个疑问,为什么 CLS 的位置要放在句子的最开始,而不是最后面。这是因为 BERT 内部的 Self-Attention 可以连接整个上下文的信息。因此,CLS 放在句子的前面还是后面,是没有影响的。
在实际中,Bert 是可以和具体的任务,一起训练的。
下面是 4 个应用例子。
BERT 的应用例子
文章分类
BERT 可以用来做情感分类,文档分类等任务。
具体是在文档最前面添加一个 CLS 的 token,然后整个文档经过 BERT 得到 Embedding,把 CLS 位置的 Embedding 输入到一个线性分类器做分类。其中 BERT 的网络可以使用别人已经训练好的参数做 fine-tune。
Slot filling(每个词做分类)
在 Slot filling 中,每个词都有一个类别。只需要把句子经过 BERT 得到的每一个 Embedding 都输入到线性分类器中,对每一个词做分类。
Natural Language Inference
在 Natural Language Inference 任务中,输入是两个句子,前面一句是前提,后面一句是推论,判断根据前一个句子是否能够推导出后一个句子。这是一个 3 分类问题,输出有: True/False/ unknown。
和第一个问题类似,也是在句子前面添加一个 CLS 的 token,然后把 CLS 位置的 Embedding 输入一个线性分类器。
Extraction-based Question Answering
这是问答系统的任务,输入是一篇文章 \(D=\{ d_{1}, d_{2}, ...,d_{N}\}\),和一个问题 \(Q=\{ q_{1}, q_{2}, ...,q_{M}\}\),输出是答案在文章 \(D\) 中的位置 \((s, e)\),\(s\) 表示答案的开始位置,\(e\) 表示答案的结束位置。那么答案 \(A = =\{ d_{s}, ...,d_{e}\}\)。
如下图所示,问题和答案的序列拼接起来,输入到 BERT,得到每个词的 Embedding。然后训练两个向量,与文档 \(D\) 里面的每一个词计算相似度,再经过 Softmax 层输出概率。
在下图左边,一个向量用于匹配答案的开始位置 \(s\)。
在下图右边,另一个向量用于匹配答案的结束位置 \(e\)。
那么最终的答案就是 \(A = =\{ d_{s}, ...,d_{e}\}\)。
如果 \(s > e\),表示开始的位置比结束的位置还要大,意味着对应的问题没有答案。
在原始论文中,BERT 有 24 层网络,也就是会有 24 个向量输出,最终的向量是 24 个向量的加权求和,权重是和具体的任务一起训练得到的。有论文研究了不同任务对 BERT 中每一层 Embedding 的权重的分布图。
论文地址:https://arxiv.org/abs/1905.05950
ERNIE
你可以把 ERNIE 和 BERT 类似,但是 ERNIE 是为中文设计的,全称是 Enhanced Representation through Knowledge Integration。
它和 BERT 的区别是:
- 在 BERT 的训练中,Masked LM 会随机选择 15% 的字替换成特殊的 MASK。
- 而在 ERNIE 的训练中,Masked LM 会随机选择 15% 的词替换成特殊的 MASK。
论文地址:https://arxiv.org/abs/1904.09223
GPT
GPT 是 Generative Pre-Training,是 Transformer 的 Decoder 部分。也就是根据前一个词生成下一个词。
目前, GPT 已经发展到第 3代,称为 GPT 3,是目前最大的模型,使用的数据集在处理前容量达到了 45TB,具有 1750 亿参数,被赋予“最强 NLP 模型”的称号。GPT-3 可以做到非常多的事,它可以写诗、写剧本、写小说、甚至输出一些代码。GPT-3 的能力前所未有地强大。目前 GPT-3 已经开放了 API,你可以尝试申请体验一下。
如果你觉得这篇文章对你有帮助,不妨点个赞,让我有更多动力写出好文章。
我的文章会首发在公众号上,欢迎扫码关注我的公众号张贤同学。