深度学习-nlp-分层softmax以及负样本-words2vec训练-69
参考链接:https://www.cnblogs.com/pinard/p/7243513.html
1. 引入
铺垫基础知识 霍夫曼树,
霍夫曼树的建立过程如下:
输入:权值为
输出:对应的霍夫曼树
- 将
看做是有n棵树的森林,每个树仅有一个节点。
- 在森林中选择根节点权值最小的两棵树进行合并,得到一个新的树,这两颗树分布作为新树的左右子树。新树的根节点权重为左右子树的根节点权重之和。
- 将之前的根节点权值最小的两棵树从森林删除,并把新树加入森林。
- 重复步骤2)和3)直到森林里只有一棵树为止。
下面我们用一个具体的例子来说明霍夫曼树建立的过程,我们有(a,b,c,d,e,f)共6个节点,节点的权值分布是(20,4,8,6,16,3)。
最终得到下面的霍夫曼树
到霍夫曼树后我们会对叶子节点进行霍夫曼编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,也符合我们的信息论,即我们希望越常用的词拥有更短的编码。如何编码呢?一般对于一个霍夫曼树的节点(根节点除外),可以约定左子树编码为0,右子树编码为1.如上图,则可以得到c的编码是00。
在word2vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。
CBOW(Continous Bag of words)和 Skip-gram模型,一个是根据上下文预测中心target词,一个是根据中心词预测上下文,在输出层是一个全链接层,输出最有可能出现的词,
语料库里面的词,往往很多10^6 成千上万个,输出每个词的概率,这计算量也太大了,所以有没有更好的训练方法,Hierarchical Softmax以及 负样本训练 就是2种思路,
2. Hierarchical Softmax
google的word2vec也使用了CBOW与Skip-Gram来训练模型与得到词向量,但是并没有使用传统的DNN模型。
最先优化使用的数据结构是用霍夫曼树来代替隐藏层和输出层的神经元,霍夫曼树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大。
而内部节点则起到隐藏层神经元的作用。