由word2vec、ELMo、OpenAI GPT、BERT 得到预训练词向量

        最近预训练模型大火,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),这就相当于one-hot向量在输入到神经网络前,经过了一个权重矩阵为M(5 * m)的全连接层。
        所以经过上面的分析可知:词向量矩阵M(5 * m)就是在one-hot后面接的全连接层的权重矩阵。

2、词向量矩阵M可以怎样训练得到?

        下面就说说第1小节提到的词向量矩阵M可以怎样训练得到?有两种方法:

a、 和神经网络(针对具体任务而设计的一个神经网络)中的其他参数一样,先用均匀分布随机初始化一下,然后随网络训练得到;
b、 使用大量无标签语料,采用无监督的方式预训练得到;

3、由word2vec、ELMo、OpenAI GPT、BERT 得到预训练词向量

        由word2vec、ELMo、OpenAI GPT、BERT得到词向量的方式,就对应了第2小节中的方式b。这四种方法得到词向量的流程大概是这样的:

a、 准备大量的单语语料(不用带任何标签);
b、 设计一个神经网络;
c、 用大量的单语语料无监督的训练这个神经网络;

        当这个神经网络训练好后,就会得到一种副产品:权重矩阵,这个权重矩阵中的向量就是对应词的词向量。一个神经网络会得到几个这种权重矩阵和网络的设计和层数有关,比如word2vec(CBOW,Skip-Gram)会得到一个权重矩阵,BERT-Base有12层会得到12+1=13个权重矩阵(one-hot后面的全连接层也算一个)。
        由上面的分析可以看出,word2vec、ELMo、OpenAI GPT、BERT 这几个模型得到的词向量的整体流程是一样的,而他们的区别就在于采用的神经网络各不相同,无监督训练的方式也不尽相同,word2vec、ELMo、OpenAI GPT是采用训练语言模型的方式进行预训练,BERT是自己设计了两个任务(Masked LM和Next Sentence Prediction)来对网络进行预训练。
        以上就是我对于由word2vec、ELMo、OpenAI GPT、BERT 得到预训练词向量的一些思考。

你可能感兴趣的:(深度学习)