![bc8f91c9428988e47006ae2b7d4bc8a1.png](https://i-blog.csdnimg.cn/blog_migrate/ba60d7b51a2a2d4bcc817c3b6f7f39d1.jpeg)
在进行最优化的求解过程中:从隐藏层到输出的Softmax层的计算量很大,因为要计算所有词的Softmax概率,再去找概率最大的值。
除了上篇文章讲到的负采样可以解决,Hierarchical Softmax也可以解决该问题。
Huffman Tree(哈夫曼树)
哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明:
![f65d7b5ba20a96f5bec6d030c35c918b.png](https://i-blog.csdnimg.cn/blog_migrate/82868d5976274695ef7cb114ecfcd59b.jpeg)
图a中的数字表示权重,图a是常见的二叉树,图b就是图a转换过的最优二叉树。
图a中权重表示重要程度,可以看出,D是最重要的,那么有这样一个规则:最重要的放在最前面,由此构造了图b的哈夫曼树。
它们的带权路径长度分别为:
图a:WPL = 5 * 2 + 7 * 2 + 2 * 2 +13 * 2 = 54
图b:WPL = 5 * 3 + 2 * 3 + 7 * 2 + 13 * 1 = 48
可见,图b的带权路径长度较小,我们可以证明图b就是哈夫曼树。
哈夫曼树的构造
例子:
有A B C D 四个词,数字表示词频,构造过程如下:
![4945aa3e878e2aac21a04792b645fa2d.png](https://i-blog.csdnimg.cn/blog_migrate/a31b072c97f62367dd0072fd5e95b280.png)
哈夫曼树编码
左子树为0,右子树为1
![98593675c147ff8d44438f7e74e203b1.png](https://i-blog.csdnimg.cn/blog_migrate/15eb4a7479b2611378f51bf590c46910.jpeg)
那么D编码为0,B编码为10,C编码为110,A编码为111。
Logistic Regression(逻辑斯蒂回归)
Logistic Regression的思想很简单,利用Sigmoid函数把任意值映射到(0,1)的区间上来实现分类问题(主要是二分类),
![4f6d334b793faf7e2a27b096217a6ab3.png](https://i-blog.csdnimg.cn/blog_migrate/2c5b43eb7abcfee3571ed87266b93d35.png)
在这里不再详细阐述。
Softmax其实就是多分类的Logistic Regression,相当于把很多个Logistic Regression组合在一起。
Logistic Regression在这里的应用就是判断在哈夫曼树中走左子树还是右子树,其输出的值就是走某一条的概率。
Hierarchical Softmax
![6e61b2d0f6e675775bc0589c7f6aa4df.png](https://i-blog.csdnimg.cn/blog_migrate/135f382c307faf8a4b08269699511316.jpeg)
CBOW是已知上下文,估算当前词语的语言模型。其学习目标是最大化对数似然函数:
其中,w表示语料库C中任意一个词。从上图可以看出,对于CBOW,
输入层是上下文的词语的词向量(什么!我们不是在训练词向量吗?不不不,我们是在训练CBOW模型,词向量只是个副产品,确切来说,是CBOW模型的一个参数。训练开始的时候,词向量是个随机值,随着训练的进行不断被更新)。
投影层对其求和,所谓求和,就是简单的向量加法。
输出层输出最可能的w。由于语料库中词汇量是固定的|C|个,所以上述过程其实可以看做一个多分类问题。给定特征,从|C|个分类中挑一个。
对于神经网络模型多分类,最朴素的做法是softmax回归:
softmax回归需要对语料库中每个词语(类)都计算一遍输出概率并进行归一化,在几十万词汇量的语料上无疑是令人头疼的。
不用softmax怎么样?比如SVM中的多分类,我们都知道其多分类是由二分类组合而来的。
这是一种哈夫曼树结构,应用到word2vec中被作者称为Hierarchical Softmax:
![91eb74e78d92f02ab201fd3876f3c603.png](https://i-blog.csdnimg.cn/blog_migrate/1bc34510ce6a4a6e08e4faee673cea15.jpeg)
上图输出层的树形结构即为Hierarchical Softmax。
每个叶子节点代表语料库中的一个词,于是每个词语都可以被01唯一的编码,并且其编码序列对应一个事件序列,于是我们可以计算条件概率
在开始计算之前,还是得引入一些符号:
1.
2.
3.
4.
5.
于是可以给出w的条件概率:
这是个简单明了的式子,从根节点到叶节点经过了
其中,每一项是一个逻辑斯谛回归:
考虑到d只有0和1两种取值,我们可以用指数形式方便地将其写到一起:
我们的目标函数取对数似然:
将
这也很直白,连乘的对数换成求和。不过还是有点长,我们把每一项简记为:
怎么最大化对数似然函数呢?分别最大化每一项即可(这应该是一种近似,最大化某一项不一定使整体增大,具体收敛的证明还不清楚)。怎么最大化每一项呢?先求函数对每个变量的偏导数,对每一个样本,代入偏导数表达式得到函数在该维度的增长梯度,然后让对应参数加上这个梯度,函数在这个维度上就增长了。这种白话描述的算法在学术上叫随机梯度上升法,详见更规范的描述。
每一项有两个参数,一个是每个节点的参数向量
因为sigmoid函数的导数有个很棒的形式:
于是代入上上式得到:
合并同类项得到:
于是
其中,
再来
于是
不过
其中,
感谢原作者
http://www.hankcs.com/nlp/word2vec.html#respondwww.hankcs.com