ELMO,BERT和GPT的原理和应用总结(李宏毅视频课整理和总结)
Posted Y_蒋林志
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELMO,BERT和GPT的原理和应用总结(李宏毅视频课整理和总结)相关的知识,希望对你有一定的参考价值。
文章目录
0 前言
一个字可以有多种意思,例如:“你好捞哦”和“我捞起鱼”。很明显两个“捞”表达的意思并不相同,但是如果使用word2vec做静态embedding,那么神经网络看到的“捞”是同样的语意。于是就延伸出参考上下文的embedding(Contextualized word embedding)。这种embeding可以保证同一个字在不同的语境下有不同的embeding。本文由整理李宏毅老师视频课笔记和个人理解所得,介绍几种主流的NLP模型:ELMO,BERT和GPT,三个网络模型都是Contextualized word embedding的模型。我会及时回复评论区的问题,如果觉得本文有帮助欢迎点赞 😃。
1 Introduction
1.1 word2vec
最早的word2vec方法是1 of N Encoding,即每一个词汇都当做一个符号,都用向量来描述,这个方法是不足的,这样词汇和词汇之间的相关性反应不出来。后来有了word class,以某种类别标准将词汇进行分类。这个方法也比较粗糙,比如动物也分了很多种。Word Embedding 每一个的词汇都用向量来描述,但是每一个维度是一个属性。很多NLP的任务都不会用独热码,而是用Word Embedding 。这个概念已经详细讲过,有兴趣的朋友可以看我之前的文章。
同一个词汇有不同的意思,比如下图:
上面句子的四个Bank是不同的token,但是同样的type。过去是不区分token的,每一个word type只有一个embedding,即认为语义是一样的。但是事实并非如此。比如前两个句子的bank指的是银行,后面三个bank是指的堤坝。
所以我们希望机器可以依据不同的token给出不同的embedding。如果固定bank的type有两个embedding,如果有第三种意思出现,那么embedding就不够用了。
很多词汇和对象并不是严格对应的,比如说这两个角色,在角色设定上是一样的,但是实际上一个是真人真物,一个是动漫角色。你可以说是一样的,也不一样的。
1.2 Contextualized Word Embedding
我们期望是机器做到每一个word token都有一个embedding。我们考虑上下文越相近的token,可能有相同的embedding,这个技术叫做:Contextualized word embedding。如下图,后面两个bank可能是相近的,而前面一个带有river的bank可能有不同的embedding。
2 Embeddings from Language Model (ELMO)
ELMO是一个基于RNN的语言模型。给RNN很多句子,RNN学习并预测下一个token是什么,输入BOS表示开始就输出潮水,输入潮水,就输出退了等等。如果是单向的RNN,中间hidden layer的就是输入词汇的embedding;如果是双向的RNN,就将正向逆向的embedding接起来作为最终的embedding,双向RNN的好处是前后文的信息都可以使用到:
即使输入同一个词汇,比如“退了”,根据不同的上下文,下一个输出的词汇也不一样了。那么意味着“退了”就有了不同的embedding:
RNN可以是deep的,多加几层。但是这样会产生很多个embedding,所以应该用哪一层的embedding?ELMO的做法是全都要。
具体做法很简单,就是将RNN的每一层的embedding都做weight sum,而如下图的
a
1
a_1
a1和
a
2
a_2
a2这些权值也是根据具体的任务学习出来的。
3 Bidirectional Encoder Representations from Transformers (BERT)
3.1 Base Idea
BERT是transformer的encoder,网络架构是一致的。训练transformer需要输出,但是训练BERT只需要收集句子的数据集,不需要annotation(释文),就可以把这个encoder训练出来。BERT实际做的就是给一个句子,然后每一个词汇给一个embedding。
虽然下图使用的中文的词为单位,但是实际上中文用字要更合适。如果输入要表示为独热码,用词为单位这个独热码的维度几乎是无穷尽的,因为词的组合太多了,而如果用字来表示则会好很多。
3.2 Training of BERT
BERT是怎么训练呢?
- Masked LM: 第一个训练的方法 随机把一定比例的,比如15%的词汇遮盖住,输入到网络中。而BERT就是去猜测这些词汇,做一个测漏字的问题,要BERT填回来。假设第二个词汇是挖空了的(MASK),把挖空词汇的对应embedding丢入一个线性的分类器,要求这个分类器预测这个MASK的词汇是什么。因为这个分类器的能力很差,所以如果用这种分类器都能预测正确,就说明这个embedding比较合适。此时如果有两个词在MASK这一个地方都没有违和感,那么就说有一样的embedding。比如MASK这里用“退了”和“落了”都可以,因为语义是类似的。
- Next Sentence Prediction
给两个句子,比如“醒醒吧”和“你没有妹妹”,这两个句子是接在一起的,期望BERT能预测两个语句是接在一起的。使用SEP作为两个句子之间的分界符。使用CLS标识要做分类的位置,就是预测这两个句子是否相接的结果,将CLS的embedding丢入一个二分类的线性分类器,可以输出yes或者no。
那么为什么CLS不放在后面呢?不是最后才更合理吗?如果是单向的RNN,那么确实是需要从左读到右,最后才能做分类。但是BERT内部不是RNN,而是transformer,transformer使用的是self-attention的结构,这使得CLS放在开头和结尾是没有区别的。这些都是一起被训练的。在文献上,这两个方法是同时使用的。
3.3 Applications of BERT
问题是怎么使用BERT呢?最简单的是将BERT当作一个抽取特征的工具,就像是ELMO一样,训练新的embedding。但是原文不是只有这样,而是将BERT模型和你的要解的任务一起做训练,怎么结合呢?文中举了4种不同的例子。
3.3.1 Case 1
第一个例子是假设输入句子,输出句子的类别。比如判断这个句子是正面的还是负面的,或者输入新闻,判断是什么领域的。如下图,这个句子放进模型,然后在前面加CLS,CLS对应位置的embedding丢入一个线性分类器,分类器输出就是类别。BERT的参数和分类器的参数可以一起学,线性分类器需要从头学,而BERT的参数只需要微调即可。
3.3.2 Case 2
第二个任务是输入句子,输出句子的每一个词汇的类别。比如slot filing这类的任务,具体做法也是在第一位置放置CLS,但这里是将CLS之外的每一个词汇对应的embedding丢入线性分类器,分类器输出类别。
3.3.3. Case 3
输入两个句子,输出一个类别。比如Natural Language Inference任务,要机器根据一个前提,推论下一个句子的假设是对还是错,还是不知道。具体解法如下和Case 1差不多。
3.3.4 Case 4
第四个例子是解基于抽取的QA问题,即给模型读一篇文章,然后提出一个问题,模型能给答案,而答案本身一定能在文章中找到。给出文章D和问题Q,包含有不同的一些token,输出到模型中,模型可以输出s和e两个整数,则代表答案是第s到第e个token。举例说明的话,如果答案是“within a cloud”,那么输出s=77,e=79,即文中的第77-79的词汇就是答案。
那么怎么用BERT来搭建这个QA的模型呢?
将问题 q 1 q_1 q1, q 2 q_2 q2…输进去,再把文章 d 1 , d 2 , d 3 . . . d_1,d_2,d_3... d1,d2,d3...输入,使用SEP作为分隔符,CLS作为分类标识。每一个词汇都有一个embedding(黄色的vector),再让模型学习一个黄色和一个蓝色的vector,这个向量和embedding是同维的。将红色vector拿去和文章 d d d对应的黄色vector做点乘,算出一个scaler值,再输入softmax中看哪个词汇的分数最高,最高词汇的标号就是s;蓝色的也进行同样的操作,看最后分数,最高分数的下标就是e。
当然也有问题没有答案,比如s>e的时候,那么此题就无解。红和蓝都是学习出来的,训练的时候就要给出文章和问题,以及答案的位置。
3.4 Enhanced Representation through Knowledge Integration (ERNIE)
ERNIE这个缩写其实是硬凑的,为了凑出“芝麻街”的人物名字。ERNIE是特别为中文设计的,因为BERT是以字为单位,而ERNIE更考虑词汇,这里不展开讲。
3.5 More about BERT
3.5.1 What does BERT learn?
分析一下BERT每一层究竟学到了什么。假设BERT有24层,文献上的意思是,第一层是分析词性,第二层是分析语法,第三层是词汇之间的关系,以此类推。文献的做法是将每一层做weight sum,任务不同,比如词性和语法任务,那么每一层的权值也不同,根据权值来判断这一层主要是贡献什么。接近input的层就做简单的任务,而接近output的层就做困难的任务。
3.5.2 Multilingual(多语言的) BERT
谷歌使用104种语言训练了一个BERT,尽管BERT不知道这些语言之间的翻译,但是读过这104种语言之后,似乎BERT学习到了这些语言的词汇之间的对应关系。比如仅让BERT学习英语文章的分类,然后用中文文章测试,也能有一些好的分类结果。
4 Generative Pre-Training (GPT)
GPT是一个很大的语言模型,有很多参数。GPT的架构其实就是Transformer的Decoder。Transformer的Encoder是怎么运作的,具体可以看另外一篇文章。
GPT-2可以在完全没有训练资料的情况下,可以做到Reading Comprehension,Summarization和Translation。对于Reading Comprehension,输入文章和问题,以及标号“A:”,就会自动输出答案。
对于Summarization,同理输入文章,再输入“TL;DR.”的标号,就会自动输出摘要:
Translation,比如输入英文句子+ 等号 ,可以输出法语句子:
参数越多,效果好:
以上是关于ELMO,BERT和GPT的原理和应用总结(李宏毅视频课整理和总结)的主要内容,如果未能解决你的问题,请参考以下文章