ELMO,BERT,GPT (三种解决一词多意问题的模型)
本章主要在介绍ELMO、BERT和GPT 这三种解决一词多意的方法:
机器是如何理解我们的文字的呢? 怎样让机器读懂人类文字?
最早的技术是1-of-N encoding,把每一个词汇表示成一个向量,每一个向量都只有一个地方为1,其他地方为0。但是这个方法是有不足的,这样词汇和词汇之间的相关性反映不出来,而且过于稀疏。
接下来有Word Class:建立word class,把有相同性质的word放在同一个 class内,将词汇进行分类,这个方法也比较粗糙,比如动物也分了很多种,不能完全概况。
更进阶的想法Word Embedding:每一个的词汇也用向量来描述,相近的词汇距离较近。主流的做word embedding 算法是Word2vec,其具体训练模式有:通过上下文来预测当前词,通过当前词来预测上下文。与one-hot编码和word class相比,词嵌入可以将更多的信息塞入更低的维度中。
但是呢,同一个词汇是可能有不同的意思的,如下图中的bank,前两个指银行,后两个是指河堤,还有第三种意思-血库:
尽管有不同的意思,但使用之前传统的word embedding的方法,每一个word type有一种embedding,但是现在是每一个Word token就有一种embedding,即每一个词义就会有一个embedding。
对不同意思的bank,可以给出不同的embedding表示:(Contextualized Word Embedding根据语义对word进行编码)
根据上下文语境的不同,同一个单词bank我们希望能够得到不同的embedding。
那怎么样才做到这个操作呢? 基于上述思想——引出ELMO技术
ELMO是一个RNN-based的语言模型,其任务是学习句子中的下一个单词或者前一个单词是什么。
它是train一个双向的RNN,这样每一个单词都对应两个hidden state,进行拼接便可以得到单词的Embedding表示。该Embedding不仅考虑了前文意思,也考虑了后文意思。当同一个Word ,它的上下文不一样,得到的embedding就不同。
当我们的RNN是Deep的时候,对于同一个词汇,每一层都会输出一个Embedding,这样该如何选择?
ELMO的做法就是我全都要:如下图所示,将每一层的的两个Embedding都加权求和,得到代表能够每一层的Embedding,权重的值是learning到的,不同的任务是会有不一样的权重。
BERT的中文意思是来自于转换器的双向编码表示,Transformer中的Encoder就是Bert 预训练的架构。
我们要记住BERT做的事情是:将一个句子丢进BERT(输入word),然后输出word对应的Embedding。BERT里面的架构是与Transformer中的Encoder是一样的。(如果是中文的话,可以把字作为单位,而不是词,用字为单位是更为恰当的。)
Masked LM
它就是随机的将句子中间的词用[Mask]替代,然后让machine去找合适的词填好,通过的上下文预测该单词,类似于一个完形填空任务。这样如果是多个词填在一起没有违和感时,那么它们就会有非常接近的Embedding。
Next Sentence Prediction(NSP)
它做的事情是,给machine两个句子,在句子开头,输入标志符[CLS],句子间用标志符[SEP]表示两个句子的分隔符,[CLS]标志符得到的Embedding会送给一个二分类model,该线性model判断这两个句子该不该连在一块,是连在一起的即输出yes。
BERT 内部架构是Transformer,即是Self-attition机制,所以[CLS]放在开头或末尾结果都可以,即 [CLS] 的 output 里面肯定含有整句话的完整信息。
case 1: classification
如果现在的任务是 classification,首先在输入句子的开头加一个代表分类的符号 [CLS],将分类标志符的对应位置的Embedding丢给Linear Classifier,让其 predict 一个 class 即可。
整个过程中 Linear Classifier 的参数是需要从头开始学习的,而 BERT 中的参数微调(fine-tuning)就可以了。
case 2: Slot Filling(classification)
比如:Slot Filling问题,向BERT输入word和分类标志符[CLS],然后将句子中各个字对应位置的 output 分别送入不同的 Linear,预测出该字的标签。其实这本质上还是个分类问题,只不过是对每个字都要预测一个类别。
case 3: NLI(自然语言推理)
它的做法是输入两个句子和分类标志符[CLS],句子间用标志符[SEP]隔开。即给定一个前提,然后给出一个假设,模型要判断出这个假设是 正确、错误还是不知道。这本质上是一个三分类的问题,和 Case 1 差不多,对 [CLS] 的 output 进行预测即可。
首先将问题q和文章d通过 [SEP] 分隔,丢入 BERT 之后,得到上图中黄色的输出。(此时我们还要训练两个 vector,即上图中红色和蓝色的向量。)将红色vector和所有的黄色向量进行 dot product,然后通过 softmax,看哪一个输出的值最大,例如上图中d2对应的输出概率最大,那我们就认为 s=2。
我们用蓝色的向量和所有黄色向量进行 dot product,最终预测得d3 的概率最大,因此 e=3。最终,答案就是 s=2,e=3。
Generative Pre-Training是一个生成式的预训练模型与ELMO不同的是,GPT是一个Transformer Decoder架构,其采用多层Transformer Decoder作为特征抽取器,多项研究也表明,Transformer的特征抽取能力是强于LSTM的。它的思想也很简单,使用单向 Transformer 学习一个语言模型,对句子进行无监督的 Embedding,然后根据具体任务对 Transformer 的参数进行微调。
它做的事情是自动填词。GPT是最复杂的,是非常巨大的,神奇的,但是它也是很有效,相比其他model。
由于GPT-2的模型非常巨大,它在很多任务上都达到了惊人的结果,甚至可以做到zero-shot learning(简单来说就是模型的迁移能力非常好),如阅读理解任务,不需要任何阅读理解的训练集,就可以得到很好的结果。比如给一篇文章,然后给一个问题,直接就给答案,
还可以做翻译,特别快。
ELMO在处理一词多意的问题上是很有效的,当同一个Word ,它的上下文不一样,得到的embedding就不同,可以适当增加Deep来提高准确率。相比这三个model,ELMO所占内存也是最小的。BERT则是更适合用在处理文本分类的问题上,以及自然语言推理,阅读问答。在文本分类问题的比赛中常常被应用。GPT是这三个model最复杂,占用内存最大的,使用更少的训练数据完成同样的效果。