阅读 57

土壤剖面分为哪四个层次,马洛斯需求层次理论

在最优化的求解过程中,从隐藏层到输出的Softmax层的计算量很多。 这是因为计算所有词的Softmax概率,寻找概率最大的值。

除了上一篇文章中介绍的负采样外,Hierarchical Softmax也可以解决此问题。

Huffman Tree (哈夫曼树) ) ) ) ) ) ) )。

哈夫曼树是最有权重路径长度最短的二叉树,也称为最好的二叉树。 在下图中进行说明。

图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四个单词,数字表示词数,结构过程如下。

霍夫曼编码

左边的子树是0,右边的子树是1

那么,d码是0,b码是10,c码是110,a码是111。

逻辑回归) )。

Logistic Regression的思路很简单,利用Sigmoid函数将任意值映射到(0,1 )的区间来实现分类问题(主要是二分类)。

这里不详细叙述。

Softmax其实是一个多分类的逻辑注册,相当于组合了很多逻辑注册。

这里的Logistic Regression的应用是判断在哈夫曼树中走左边的子树还是右边的子树,其输出的值是走哪一个的概率。

Hierarchical Softmax

CBOW是已知的语境,是推断当前话语的语言模型。 其学习目标是最大化对数似然函数:

其中w表示语料库c中的任一词。 从上图中可以看出,对于CBOW,

输入层是上下文语言的词向量(什么! 我们不是在训练语言的向量吗? 不,我们在训练CBOW模型。 语言的向量不过是副产物。 准确地说是CBOW模型的参数。 训练开始时,语向量是随机值,并随着训练的进行而不断更新)。

投影层将其相加。 加法是指简单的矢量加法。

输出层输出最有可能的w。 由于语料库中的词汇量固定为|C|个,上述过程其实可以看作是多分类问题。 赋予特征,从|C|个分类中选出一个。

对于神经网络模型的多分类,最朴素的做法是softmax回归:

在softmax回归中,需要对语料库中的每个单词(类)计算一次输出概率并将其正规化,这无疑为几十万词汇量的词汇而头疼。

不用softmax怎么样? 例如,众所周知,SVM中的多分类是由两种分类组合而成的。

这是哈夫曼树结构,适用于word2vec中被作者称为Hierarchical Softmax的东西。

上图中输出层的树结构为Hierarchical Softmax。

各叶节点表示语料库内单词,各单词被唯一编码为0.1,该编码序列与事件序列对应,因此能够计算条件概率

在开始计算之前,必须引入一些符号。

1.

从:根节点出发到与w相对应的叶节点的路径

2.

:路径中包含的节点数

3.

:次通过

的各节点

4.

:字w的代码

表示路径

与第j个节点对应的代码(根节点没有代码) ) )。

5.

:次通过

与中非叶节点对应的参数向量

因此可以给出w的条件概率:

这是一个简单易懂的公式,从根节点到叶节点都通过了

个节点、代码从下标2开始,对应的参数向量的下标从1开始(根节点为1 )。

其中,各个项目是逻辑上的斯谛回归:

考虑到d只有0和1两种值,可以很容易地用指数形式写。

p>


我们的目标函数取对数似然:


代入上式,有:



这也很直白,连乘的对数换成求和。不过还是有点长,我们把每一项简记为:


怎么最大化对数似然函数呢?分别最大化每一项即可(这应该是一种近似,最大化某一项不一定使整体增大,具体收敛的证明还不清楚)。怎么最大化每一项呢?先求函数对每个变量的偏导数,对每一个样本,代入偏导数表达式得到函数在该维度的增长梯度,然后让对应参数加上这个梯度,函数在这个维度上就增长了。这种白话描述的算法在学术上叫随机梯度上升法,详见

每一项有两个参数,一个是每个节点的参数向量

,另一个是输出层的输入

,我们分别对其求偏导数:


因为sigmoid函数的导数有个很棒的形式:


于是代入上上式得到:


合并同类项得到:


于是

的更新表达式就得到了:


其中,

是学习率,通常取0-1之间的一个值。学习率越大训练速度越快,但目标函数容易在局部区域来回抖动。

再来

的偏导数,注意到

是对称的,所有直接将

的偏导数中的

替换为

,得到关于

的偏导数:


于是

的更新表达式也得到了。

不过

是上下文的词向量的和,不是上下文单个词的词向量。怎么把这个更新量应用到单个词的词向量上去呢?word2vec采取的是直接将

的更新量整个应用到每个单词的词向量上去:


其中,

代表上下文中某一个单词的词向量。我认为应该也可以将其平均后更新到每个词向量上去,无非是学习率的不同,欢迎指正。

感谢原作者http://www.hankcs.com/nlp/word2vec.html#respondwww.hankcs.com


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐