本文记录的目的是方便自己学习和复习,有误之处请谅解,欢迎指出。
看了许多网上word2vec的博客,感觉有点乱一大堆公式(可能我太菜了 0_0),花了两天自己整理了一下,方便复习。计算机无法直接理解人类的语言,为了处理自然语言方面的问题,我们需要将文字转换成为机器能计算的数据。如何将文本语言数字化呢?即词向量。转词向量前,需要做一些处理,如去停用词,分词等。
常见的文本向量化有One hot representation和Distributed representation。
One hot representation(独热编码)比较简单,词向量维度是字典库的大小,每个词对应位置为1,其他位置为0。如下图所示。但是存在一些问题
(1)可能向量维度太高。如果词典数量非常多,那每个词向量的维度爆炸,而且稀疏。
(2)不容易度量词向量之间相似性。每个词相对独立,不能表达词之间的相关性。
Distributed representation一定程度克服了独热编码词向量的问题,基本思想是:通过模型训练,将每个词映射为另外一个较短的词向量。它克服了独热编码的0-1稀疏性、词向量维度更小,而且经过与周边词的训练,能够较好表达词向量之间的相似性。如下图
上图词典表中有"Royalty","Masculinity", "Femininity"和"Age"4个来表示,King对应的词向量可能是(0.99,0.99,0.05,0.7),这样就可以表示它们之间的关系了。虽然有了基本思想,但是要这么训练得到这些向量呢?接下来需要引入word2vec的两种重要基础模型CBOW模型和Skip-gram模型,两种改进训练Hierarchical Softmax和Negative Sampling。改进训练单独介绍。
一、CBOW模型
连续词袋模型(Continuous Bag-of-Words Model,CBOW)思想是:通过中心词周边一定范围窗口内的词来预测中心词。如下图,利用learning中心词的上下文窗口为4,共八个词的One hot编码,去训练权重网络参数W,使得输出Learning的概率最大。
具体步骤,如图:
(1)输入层:上下文C个单词的One hot(V表示词典空间大小)。
(2)乘以权重矩阵(N表示隐藏层神经元个数),得到隐藏层
(3)乘以输出层权重矩阵
(4)softmax输出每个词的预测概率,使中心词概率最大,误差越小越好。
损失函数一般为交叉熵损失函数,梯度下降更新W和W'。现在训练完毕这么得到我们需要的词向量呢?其实权重参数W就是降维的词向量矩阵,每个单词与其相乘即可获得词向量。如下图,某词One hot乘以权重矩阵W得到词向量。
二、Skip-gram模型
与 CBOW 对应,Skip-gram 的模型基本思想和 CBOW 非常类似,只是换了一个方向,不做过大赘述。输入为中心词,softmax输出周边4个词的概率,取前八个概率词。同样地,训练完成后,通过权重矩阵W获得词向量。
这是一个基本模型,但是Word2vec一般不适用这种方式。因为一般词典表中词的数量非常多,百万级别,输出百万个词的概率,计算量非常大。所以有了后面改进训练Hierarchical Softmax和Negative Sampling。