最近预训练模型大火,ELMo、OpenAI GPT、BERT等等。我们对于这些模型的应用大概有两种:
a、 直接使用它们输出的词向量(或者叫context vector);
b、 在这些模型后面接一个简单浅层模型进行fine-tuning;
之前心中一直有个疑问:word2vec(CBOW,Skip-Gram)、ELMo、OpenAI GPT、BERT,这些模型都可以训练得到词向量,它们有什么区别和联系?这篇文章就来解释一下这个疑惑。
1、词向量是什么?
我们都知道one-hot向量,这里直接举例说明:给定一句话 “我 今天 好 开心”,一个词表 [他, 我,今天,好,开心],那这句话中每个单词的one-hot向量就是(输入one-hot矩阵Q的大小是4 * 5):
[0 1 0 0 0]
[0 0 1 0 0]
[0 0 0 1 0]
[0 0 0 0 1]
目前我们训练神经网络一般都是使用一个预训练好的词向量矩阵,通过查表的方式来获取输入中每个词的词向量,假设词向量是m维,则上面的词表对应的词向量矩阵M的大小是5 * m,上面这句话 “我 今天 好 开心” 通过查表得到的输入词向量矩阵N的大小是4 * m,分别取M的第2-5行得到。
上面这个查表的步骤等同于一个矩阵相乘的过程:Q(4 * 5) * M(5 * m) = N(4 * m