Word2Vec方法是对NLM模型的优化,由于计算机无法直接处理文本信息,因此利用词向量将文本信息转化成独热编码的形式。CBOW模型是Word2Vec方法的一种模型,本质就是将词转化为词向量。Word2Vec有两种有名的模型,一个是CBOW,另一个是Skip-gram。这篇文章主要来介绍一下CBOW。
CBOW的目的是通过某个词的上下文推导出这个词,整个CBOW模型分为三层,但实际上可以理解为两层,因为只有投影层和输出层有权值。
- 第一层是输入层,输入层的个数由Windows窗口大小决定,举个例子,I am fond of coffee.这句话共有五个词,如果我们拿fond这个词作为预测词的话,假设我们的Windows窗口大小是2,那么我们就会拿I am和of coffee分别作为上文和下文,若是Windows的窗口大小是1,那么我们就会拿am和 of分别作为上文和下文,因此输入层的向量个数取决于Windows窗口的大小。还有个需要注意的点就是,每个词向量的维度都是词库的总词个数,然后取one-hot编码,通俗来说每个词向量都是一条带有one-hot编码的向量。先假设我们上下文一共有C个词,每个词都有V个维度。
- 第二层是投影层,这里的投影层并不是如神经网络语言模型一样将词向量concatenate起来。我们会先用权重和每个词向量做点积运算,W权重的维度是VN(这里的N是需要我们自己设置的神经元个数),这一层的权值都是共享的,因此每个向量都与同样的权值做点积。做完点积运算后矩阵维度变成CN,然后将得到的每条向量对应的同一维度相加求平均,在python中相当于axis=0方向的reduce_mean。我们会得到一个新的向量,维度就变成1*N,
- 第三层是输出层,将投影层的输出与输出层的W’权值做点积,这层权值的维度是NV,因此维度变为1V,这个V也就是词库的数量。再经过激活函数的处理后变成概率分布,每一维度都代表着一个单词,我们得到的概率最大的那个维度就是预测出的中间词。
最后我们需要与true wold进行比较,得到的误差越小越好。为了优化我们的参数,我们需要定义一个交叉熵损失函数,优化方法就是梯度下降法,目的是优化我们的参数W和W’。
我们这里有个细节就是每个词向量与投影层的权重W点积后得到的向量就是我们想要的词向量,叫做词嵌入(word embedding),权重矩阵被叫做look up table,因为可以理解为将一个one_hot编码向量转化成一个词的新表示法,就相当于一次变换。做个不恰当的比喻,我们原来的词是在汉语中表示的,我们从词典中查询到汉语词的意思,然后转换成英语,英语能更加简洁方便的表示这个词的信息,而原来的情况下汉语必须用一个one-hot向量来表示这个词,因此这次的变换是十分有效的。我们经过多次的迭代优化,得到新的W和W’,这组新的权值的loss损失会尽可能地小,这就是CBOW模型的整体框架。