1. 什么是word2vec
word2vec用于将词在高维稀疏空间的one-hot向量映射到低维稠密空间的向量,且要求这个向量保留尽量多的语义信息。word2vec在语料库中从词的上下文词中提取出语义信息,并作用到对该词的低维向量求解。word2vec会设置一个窗口大小,并认为窗口内的词组成窗口中心词的上下文。
2. CBOW
现在有一句话“A B C D E”,我们需要提取词“C”的语义特征,CBOW将“A”,“B”,“D”,“E”作为“C”的语义特征,首先将“A”,“B”,“D”,“E”的one-hot向量映射到低维空间,对这4个低维向量求和或取平均,然后再利用这个低维向量去预测最有可能的词,具体做法可以是将低维向量映射回高维空间,对映射结果进行softmax,值最大的词就是最有可能的词。这个最有可能的词的期望输出应该是“C”。CBOW在组合“A”,“B”,“D”,“E”的低维特征时,只是简单求和或取平均,没有考虑到词的位置顺序。
3. Skip-gram
同样有一句话“A B C D E”,同样需要提取“C”的语义特征,Skip-gram首先将“C”的one-hot向量映射到低维空间,然后将这个低维向量去预测最有可能的上下文,这个最有可能的上下文应该是“A”,“B”,“D”和“E”。Skip-gram在输出上下文时,只是简单认为“A”,“B”,“D”,“E”的输出概率应该尽量大,没有考虑它们的位置顺序,所以可以将数据样本(“C”,“A B D E”)分解成(“C”,“A”),(“C”,“B”),(“C”,“D”)和(“C”,“E”)。
4. 哈夫曼softmax过程
前面介绍CBOW和Skip-gram,在得到低维特征后,需要通过映射回高维空间,从高维的分布中去确定最有可能的输出。我们可以把这个过程看作是一个有一个隐藏层没有激活函数的神经网络,输入是one-hot,输出是一个分布,中间隐藏层是低维特征表示。我们现在想要学习输入映射到隐藏层的矩阵,这个矩阵决定了词的低维表示。这个神经网络模型的损失函数是输出分布与预期输出分布的交叉熵,优化方法是梯度下降法。如果词的种类很多,则高维空间的维度数很大,那么这个神经网络的训练过程需要消耗较多资源,所以这里提出了哈夫曼softmax过程。哈夫曼softmax有以下步骤:
(1) 对词构建哈夫曼树。
(2) 哈夫曼树每个节点构建一个逻辑回归二分类器。
(3) 低维特征输入到哈夫曼树的根节点。
(4) 对当前节点,其逻辑回归分类器的输出$out$表示往右子树走的概率,如果输出词在左子树,使用$1-out$作为概率输出,否则直接使用$out$作为输出。
(5) 对于输出词所在的路径,记录沿着这条路径走的概率,反向传播梯度更新路径上经过的逻辑回归分类器的参数。
假设低维空间维度等于$H$,高维空间维度等于$N$,则原来的方法在更新梯度时总共需要更新的参数量为$H \cdot N$,而使用哈夫曼softmax方法需要更新的参数量为$H\log N$,大大提高了参数学习效率。
5. 负采样
负采样是另一种提高参数学习效率的方法。负采样有以下过程:
(1) 选择目标输出的词,并随机选择$k$个不是目标输出的词。
(2) 对输出的高维分布,只关注这$k+1$个位置的表现,使用这$k+1$个位置的输出计算损失函数,计算梯度并反向传播梯度更新参数。
使用负采样的方法,需要更新的参数量为$(k+1)*H$,一般负采样的$k$设置为2~20之间的一个数。
6. 优缺点
word2vec模型的优点有:
(1) 实现简单
(2) 速度快
缺点有:
(1) 词的上下文提取使用词袋模型,没有考虑上下文词的位置与顺序,使得词的语义信息不够准。
(2) 不能很好的区分词的多义问题,比如“bank”可以是银行,也可以是“河岸”,然而一旦词向量确定,无法根据词的不同意义加以区分。
(3) 对于一个词只能提供一个确定的结果,无法根据词所处的实际上下文情况加以调整,在泛化能力上有待提高。