一、词向量模型
这里主要横向比较一下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
# 反正一直以来用的这个,感觉方便有效率,后来才知道too young。。。
线性模型:
很神奇的地方,从而也说明高维空间映射的词向量可以很好体现真实世界中token之间的关系。如:king-man = queen-woman
负采样:
由于训练词向量模型的目标不是为了得到一个多么精准的语言模型,而是为了获得它的副产物——词向量。所以要做到的不是在几万几十万个token中艰难计算softmax获得最优的那个词(就是预测的对于给定词的下一词),而只需能做到在几个词中找到对的那个词就行,这几个词包括一个正例(即直接给定的下一词),和随机产生的噪声词(采样抽取的几个负例),就是说训练一个sigmoid二分类器,只要模型能够从中找出正确的词就认为完成任务。
这种负采样思想也应用到之后的BERT里,只不过从word-level变成sentence-level,这样能获取句子间关联关系。
缺点是上下文无关(static):
因而为了让句子有一个整体含义(context),大家会在下游具体的NLP任务中基与词向量的序列做encoding操作。
下面是一个比较表格,模型不细讲了,预测目标这里的next word下一个词,是所有传统语言模型都做的事——寻找下一个词填什么。
2. ELMo
# 10月份初做一个任务还被建议使用ELMo提升模型效率,但后来可能哪里没调好导致运行时间很长,所以放弃了。。。
ELmo模型是AllenNLP在2018年8月发布的一个上下文无关模型,甚至在9月10月BERT没出来时,也小火了一把。但据说使用时很慢效率很低,再加上马上就提出的强势BERT,ELMo很快就被人们忘掉了。。。但BERT的提出,算是对ELMo的致敬,硬是凑了一个和ELMo一个动画片里的角色名。。。(下面左图,红色的是ELMo,右二是BERT