Word2vec基础之霍夫曼树

        word2vec使用了CBOW与Skip-Gram来训练模型与得到词向量,但是并没有使用传统的DNN模型。最先优化使用的数据结构是用霍夫曼树来代替隐藏层和输出层的神经元,即霍夫曼树的:

         叶子节点:起到输出层神经元的作用,叶子节点的个数即为词汇表的小大。

         内部节点:起到隐藏层神经元的作用。


霍夫曼树的建立过程如下

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

输出:对应的霍夫曼树

处理步骤

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

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

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

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

下面我们用一个具体的例子来说明霍夫曼树建立的过程,我们有(a,b,c,d,e,f)共6个节点,节点的权值分布是(20,4,8,6,16,3)。首先是最小的b和f合并,得到的新树根节点权重是7.此时森林里5棵树,根节点权重分别是20,8,6,16,7。此时根节点权重最小的6,7合并,得到新子树,依次类推,最终得到下面的霍夫曼树。

                                Word2vec基础之霍夫曼树_第1张图片

       那么霍夫曼树有什么好处呢?一般得到霍夫曼树后我们会对叶子节点进行霍夫曼编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,也符合我们的信息论,即我们希望越常用的词拥有更短的编码

       如何编码呢?一般对于一个霍夫曼树的节点(根节点除外),可以约定左子树编码为0,右子树编码为1。如上图,则可以得到c的编码是00。注意,是从左到右,从上到下(根节点除外)的顺序开始编码。

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

你可能感兴趣的:(自然语言处理,深度学习)