大家会经常听到说w2v产出的向量是静态的,而像elmo或者bert是动态的,可以解决一词多义的问题,原因是elmo或者bert在预测的时候,是会根据输入重新走一遍模型,所以elmo或者bert又称之为预训练模型(PTM)。
今天我听到有人问:如果我在用word2vec的时候,我也把输入重新走一遍word2vec,那不同的上下文中的同一个词得到的embedding也是不一样的?
结论是:即使word2vec在预测的时候重新走一遍模型,得到的embedding还是固定的。这是由word2vec模型结构决定。
我们可以看一下word2vec的模型过程,参考word2vec详解-基础 - 知乎。
等模型训练好之后,W和W’就固定了。那对于一个词来说,不论任何时候,是训练的时候还是重新走一遍预测的时候,它的向量都是固定的,都是W*x(即图中I*D)。一般来说x是one-hot编码,所以W*x其实就是查字典操作(look-up),取对应的词的词向量,是固定的,与上下文无关的。
那我们看看为啥bert可以做到动态的?
关键在于bert在计算每个词向量的时候,不是简单的查字典,而是会跟其他词进行一个交互的,最后在此交互基础上,得到自己的词向量表达(通过self attention的q、k、v)。这种方式,它是可以结合上下文的语境的。所以当我们在预测,重新走一遍模型的时候,不同的句子,上下文不同,经过self-attention之后,得到的词向量也是不同的,从而可以解决一词多义的问题。