文章目录
词向量模型
横向比较word2vec,ELMo,BERT这三个模型:
词向量是一个工具,可以把真实世界抽象存在的文字转化成可以进行数学公式操作的向量,而对这些向量的操作,才是NLP真正要做的任务。因而某种意义上,NLP任务可以分成两个部分:预训练产生词向量和对词向量操作(下游具体NLP任务)。
从word2vec到ELMo到BERT,这个阶段做的其实就是把对下游具体NLP任务的活逐渐移到预训练词向量上。
word2vec --> ELMo
结果:上下文无关的static向量变成上下文相关的dynamic向量,比如苹果在不同语境vector不同。
操作:encoder操作转移到预训练产生词向量过程实现。
ELMo --> BERT
结果:训练出的word-level向量变成sentence-level的向量,下游具体NLP任务调用更方便,修正了ELMo模型的潜在问题。
操作:使用句子级负采样获得句子表示/句对关系,Transformer模型代替LSTM提升表达和时间上的效率,masked LM解决“自己看到自己”的问题。
1.word2vec
线性模型:
很神奇的地方,从而也说明高维空间映射的词向量可以很好体现真实世界中token之间的关系。如:king-man = queen-woman
负采样:
由于训练词向量模型的目标不是为了得到一个多么精准的语言模型,而是为了获得它的副产物——词向量。所以要做到的不是在几万几十万个token中艰难计算softmax获得最优的那个词(就是预测的对于给定词的下一词),而只需能做到在几个词中找到对的那个词就行,这几个词包括一个正例(即直接给定的下一词),和随机产生的噪声词(采样抽取的几个负例),就是说训练一个sigmoid二分类器,只要模型能够从中找出正确的词就认为完成任务。
这种负采样思想也应用到之后的BERT里,只不过从word-level变成sentence-level,这样能获取句子间关联关系。
缺点是上下文无关(static):
因而为了让句子有一个整体含义(context),大家会在下游具体的NLP任务中基与词向量的序列做encoding操作。
下面是一个比较表格,预测目标这里的next word下一个词,是所有传统语言模型都做的事——寻找下一个词填什么。
2. ELMo
介绍ELMo的两个方面,一个是它的encoder模型Bi-LSTM,另一个是它和下游具体NLP任务的接口(迁移策略)。
Bi-LSTM做encoder实现上下文相关(context):
这里就是之前说的把下游具体NLP任务放到预训练产生词向量里面,从而达到获得一个根据context不同不断变化的dynamic词向量。具体实现方法是使用双向语言模型Bi-LSTM来实现,如下面左图所示。从前到后和后到前分别做一遍LSTM的encoding操作,从而获得两个方向的token联系,进而获得句子的context。
但这里有两个潜在问题,姑且称作“不完全双向”和“自己看见自己”。
首先,“不完全双向”是指模型的前向和后向LSTM两个模型是分别训练的,从图中也可以看出,对于一个序列,前向遍历一遍获得左边的LSTM,后向遍历一遍获得右边的LSTM,最后得到的隐层向量直接拼接得到结果向量(前向的hidden state1 + 后向的hidden state2 = 总的hidden state,+是concat),并且在最后的Loss function中也是前向和后向的loss function直接相加,并非完全同时的双向计算。
另外,“自己看见自己”是指要预测的下一个词在给定的序列中已经出现的情况。传统语言模型的数学原理决定了它的单向性。
从公式 p ( s ) = p ( w 0 ) p ( w 1 ∣ w 0 ) p ( w 2 ∣ w 1 , w 0 ) p ( w 3 ∣ w 2 , w 1 , w 0 ) . . . p ( w n ∣ c o n t e x t ) p(s)=p(w_0)p(w_1|w_0)p(w_2|w_1,w_0)p(w_3|w_2,w_1,w_0)...p(w_n|context) p(s)=p(w0)p(w1∣w0