本文主要是介绍ELMO、BERT、ERNIE、GPT,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这一讲承接了上一讲关于Transformer的部分,依次介绍了基于Transformer的多个模型,包括ELMO、BERT、GPT。
因为上述的模型主要是应用在NLP中,因此首先我们必须清楚如何将离散的文本数据喂给模型,即如何用向量的方式来表征输入到模型的中的文本数据。最简单的一种方式就是one-hot向量,假设现在文档中只有apple、bag、cat、dog、elephant五个单词,那么就可以使用维度为5的向量对它们进行唯一的表示,如 a p p l e = [ 1 , 0 , 0 , 0 , 0 ] 、 b a g = [ 0 , 1 , 0 , 0 , 0 ] 、 c a t = [ 0 , 0 , 1 , 0 , 0 ] 、 d o g = [ 0 , 0 , 0 , 1 , 0 ] 、 e l e p h a n t = [ 0 , 0 , 0 , 0 , 1 ] apple = [ 1,0,0,0,0]、bag = [ 0,1,0,0,0]、cat = [ 0,0,1,0,0]、dog = [ 0,0,0,1,0]、elephant = [ 0,0,0 ,0,1] apple=[1,0,0,0,0]、bag=[0,1,0,0,0]、cat=[0,0,1,0,0]、dog=[0,0,0,1,0]、elephant=[0,0,0,0,1]。但是这样的表示方式不仅在数据量很大时十分稀疏,浪费大量的内存资源,而且无法表示出单词之间的关系,因为每两个词向量的内积都是零。另一种方法是word class,它将相同类别的词归到一起,用相同的词向量进行表示,例如dog、cat、bird都属于动物,理论可以使用一个词向量表示动物这个类别。这样的表示方式虽然抓住了词之间一定的关联,但仍处于十分宽泛的概括,难以捕获词之间其他细微特征的差别。现在使用的最多的便是word embedding的方法,例如word2vec、glov……它们可以使用更具有表示意义的词向量对每一个词唯一的表示。如果它们的嵌入空间降维后,我们可以发现,语义相似的词往往在嵌入空间中相近的位置。
但是在自然语言中,一个词在不同的上下文环境中往往具有不同的意思。例如bank在下面的四个句子中就表示为三个意思,第1,2句表示“银行”;第3,4句表示‘’岸‘,最后一句又可以表示为“库”的意思。因此如何根据单词所在的上下文来判断单词的准确意思就变得十分重要。
具体来说假设现在有一个contextualized word embedding的模型,我们希望将上面的句子输进去后,不同的词义应该可以得到不同的词嵌入向量。
ELMO
ELMO 是一个芝麻街中的人物
而NLP中的ELMO(Embeddings from Language Model )出自Matthew E. Peters, Mark Neumann等人发表在 NAACL 2018上的《Deep contextualized word representations》,它是一种基于RNN的语言模型。例如当我们给模型一个句子“潮水退了就知道谁没穿裤子”,希望看到的标记后输入潮水,然后下一时刻根据前一时刻的输出”潮水“输出“退了“”,依次往复,最后就可以训练得到一个词嵌入向量。通常使用的是双向的RNN,因此每一个方向都可以得到一个词嵌入向量,将它们拼接起来就可以得到一个更好的词向量。
当然我们可以将模型做的很深,在每一层中都会产生一个词向量,那么我们应该选择哪一个呢?ELMO的做法就是:我全都要!
假设每一层得到的词向量为 e 1 , e 2 , . . . , e m e_{1},e_{2},...,e_{m} e1,e2,...,em,ELMO就使用一种加权的方式 e = α 1 e 1 + α 2 e 2 + . . . + α m e m e=\alpha_{1}e_{1}+\alpha_{2}e_{2}+...+\alpha_{m}e_{m} e=α1e1+α2e2+...+αmem将它们组合起来得到最后的此嵌入向量。而其中的参数 α i \alpha_{i} αi是需要模型学习的。
BERT
BERT是Bidirectional Encoder Representations from Transformers的缩写,它好巧不巧也是芝麻街的人物,没错正是?
source:https://muppet.fandom.com/wiki/Bert
NLP中的BERT出自Jacob Devlin, Ming-Wei Chang的《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》一文中,它可以看做是Transformer的Encoder,使用大量无标注的文本数据进行学习。例如上面给出的例子”潮水退了就知道谁没穿裤子“,将其输入到BERT中,每一个词都会给出一个相应的词向量
那我们应该如何训练BERT呢?在原始的paper中,作者提出了两种不同的训练方式,第一种为Masked LM 。它将属于语句中的某些词标记为MASK,然后使用一个线性的多分类器来判别mask掉的是哪一个词
第二种方式称为Next Sentence Prediction ,顾名思义就是给定一个句子,预测出它的下一句应该是什么。这里需要使用到一些标记符号,例如CLS表示输出分类结果的位置,SEP表示两句话的边界……。例如我们将“醒醒吧”和“你没有妹妹”作为输入,经过训练得到的词向量就需要通过一个线性的二分器判别它们是否是上下句的关系。
因为Transformer中每个词的词向量都是在看过句中的所有词后得出的,因此选择哪一个输入到分类器中并没有本质上的区别。
在实际的模型训练中,以上的两种方式是同时使用的。此外,在原始的paper中作者提供了四种使用BERT的场景。第一种是文本分类:将一个文本输入到BERT中,最近经过一个线性的分类器就会得到这个文本的类别。通常在不同类别的文本上训练,线性分类器的参数更新较多,而BERT部分只是做一些微调,所以训练的开销并不大。
第二种为类似于词性标注的任务,给定模型一个输入语句,最后输入每一个词的词性类别。
第三种是推理的任务,给定一个前提语句,判断另一个假设语句是真的、假的还是不确定。
第四种方式是QA,喂给模型一篇文章,然后给出一些文中已有答案的问题,看模型能否给出正确的答案。
在BER提出后,疯狂的刷新了各种NLP任务的记录
ERNIE
ERNIE居然也是芝麻街中的一个任务,强行凑梗。
ERNIE全称Enhanced Representation through Knowledge Integration ,它是由百度提出的一种知识增强的语义表示模型,通过对词、实体等语义单元的掩码,使得模型学习完整概念的语义表示。在语言推断、语义相似度、命名实体识别、情感分析、问答匹配等多项中文 NLP 任务上表现出色,有些甚至优于 BERT 在处理同类中文任务的结果。
例如下面的例子所示,BERT只能判断出缺失的是哪个字,而ERNIE可以做到知道缺失的是哪个词。
GPT
GPT全称Generative Pre-Training ,出自OpenAI的《Improving Language Understanding by Generative Pre-Training》一文,它是一个非常大的模型,到底有多大呢?ELMO的参数有94M,BERT的参数有340M,而GPT-2的参数就有1542M之多!所以官方一开始放出的只有GPT的小版本,不过前几天看到一个新闻,来自慕尼黑工业大学的Connor Leahy同学,在两个月的时间里,付出了200个小时的时间,花费了大约6000人民币,复现了GPT-2项目。
https://weibo.com/ttarticle/p/show?id=2309404381252827355401#_0
GPT的整个过程和Transformer是类似的,例如前面的例子:潮水退了就知道谁没穿裤子,当我们输入“潮水”后,希望模型经过计算可以给出下一个词为“退了”
当输入“退了”后,模型就会给出下一个词"就"
上面主要是对李宏毅老师课程的课后总结,以及对于ELMO、BERT、ERNIE、GPT基本原理的简单介绍,后面读过原论文后,希望可以总结的更好~
这篇关于ELMO、BERT、ERNIE、GPT的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!