详解Hierarchical Softmax

1. 霍夫曼树

输入:权值为(w1,w2,…wn)的n个节点

输出:对应的霍夫曼树

  1. 将(w1,w2,…wn)看做是有n棵树的森林,每个树仅有一个节点

  2. 在森林中选择根节点权值最小的两棵树进行合并,得到一个新的树,这两颗树分布作为新树的左右子树。新树的根节点权重为左右子树的根节点权重之和

  3. 将之前的根节点权值最小的两棵树从森林删除,并把新树加入森林

  4. 重复步骤 2 和 3 直到森林里只有一棵树为止

下面我们用一个具体的例子来说明霍夫曼树建立的过程,我们有(a,b,c,d,e,f)共6个节点,节点的权值分布是(16,4,8,6,20,3)。

首先是最小的b和f合并,得到的新树根节点权重是7.此时森林里5棵树,根节点权重分别是16,8,6,20,7。此时根节点权重最小的6,7合并,得到新子树,依次类推,最终得到下面的霍夫曼树。

详解Hierarchical Softmax_第1张图片

 

那么霍夫曼树有什么好处呢?一般得到霍夫曼树后我们会对叶子节点进行霍夫曼编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,也符合我们的信息论,即我们希望越常用的词拥有更短的编码。如何编码呢?一般对于一个霍夫曼树的节点(根节点除外),可以约定左子树编码为0,右子树编码为1。如上图,则可以得到c的编码是00。

在word2vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。

更多原理可参考:霍夫曼树原理

2. Hierarchical Softmax过程

为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。

霍夫曼树的建立:

  • 根据标签(label)和频率建立霍夫曼树(label出现的频率越高,Huffman树的路径越短)

  • Huffman树中每一叶子结点代表一个label

详解Hierarchical Softmax_第2张图片

如上图所示:

详解Hierarchical Softmax_第3张图片

 

详解Hierarchical Softmax_第4张图片

注意:此时的theta是一个待定系数,它是由推导最大似然之后求解得到迭代式子。 

详解Hierarchical Softmax_第5张图片

 

3. 使用gensim训练word2vec

from gensim.models.word2vec import Word2Vec
model = Word2Vec(sentences, workers=num_workers, size=num_features)

参考:

  1. CS224n笔记2 词的向量表示:word2vec

  2. 斯坦福大学深度学习与自然语言处理第二讲:词向量

  3. (Stanford CS224d) Deep Learning and NLP课程笔记(三):GloVe与模型的评估

  4. http://www.cnblogs.com/pinard/p/7249903.html

  5. https://blog.csdn.net/yinkun6514/article/details/79218736

  6. https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html

你可能感兴趣的:(机器学习,数学)