如下图的架构,在进行最优化的求解过程中:从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。
1) cbow的对周围词的调整是统一的:求出的gradient的值会同样的作用到每个周围词的词向量当中去。那么,cbow预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次backpropgation, 而往往这也是最耗时的部分),复杂度大概是O(V);
2)Skip-gram 中,每个词在作为中心词时,都要使用周围词进行预测一次。这样相当于比cbow的方法多进行了K次(假设K为窗口大小),因此时间的复杂度为O(KV),训练时间要比cbow要长。
word2vec原理
基于Hierarchical Softmax的模型:
输入层到隐层:所有输入词向量求和并取平均的方法。
隐层到输出层:从隐藏层到输出的softmax层这里的计算量个改进,也就是层次softmax。由于我们把之前所有都要计算的从输出softmax层的概率计算变成了一颗二叉霍夫曼树,那么我们的softmax概率计算只需要沿着树形结构进行就可以了。如下图所示,我们可以沿着霍夫曼树从根节点一直走到我们的叶子节点的词w2。
和之前的神经网络语言模型相比,我们的霍夫曼树的所有内部节点就类似之前神经网络隐藏层的神经元,其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为"Hierarchical Softmax"。
如何“沿着霍夫曼树一步步完成”呢?在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数。使用霍夫曼树的好处:首先,由于是二叉树,之前计算量为V,现在变成了log2V。第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。
因此,目标:我们的目标就是找到合适的所有节点的词向量和所有内部节点θ, 使训练样本达到最大似然。
基于Hierarchical Softmax的CBOW模型
首先我们要定义词向量的维度大小M,以及CBOW的上下文大小2c,这样我们对于训练样本中的每一个词,其前面的c个词和后面的c个词作为了CBOW模型的输入,该词本身作为样本的输出,期望softmax概率最大。
1)在做CBOW模型前,我们需要先将词汇表建立成一颗霍夫曼树。
2)从输入层到隐藏层(投影层),就是对w周围的2c个词向量求和取平均即可。
3)通过梯度上升法来更新我们的θ和x,注意这里的xw是由2c个词向量相加而成,我们做梯度更新完毕后会用梯度项直接更新原始的各个xi.
转载:https://www.cnblogs.com/pinard/p/7243513.html