softmax层_Hierarchical Softmax(层次Softmax)

bc8f91c9428988e47006ae2b7d4bc8a1.png

在进行最优化的求解过程中:从隐藏层到输出的Softmax层的计算量很大,因为要计算所有词的Softmax概率,再去找概率最大的值。

除了上篇文章讲到的负采样可以解决,Hierarchical Softmax也可以解决该问题。

Huffman Tree(哈夫曼树)

哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。下面用一幅图来说明:

f65d7b5ba20a96f5bec6d030c35c918b.png

图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

哈夫曼树编码

左子树为0,右子树为1

98593675c147ff8d44438f7e74e203b1.png

那么D编码为0,B编码为10,C编码为110,A编码为111。

Logistic Regression(逻辑斯蒂回归)

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

4f6d334b793faf7e2a27b096217a6ab3.png

在这里不再详细阐述。

Softmax其实就是多分类的Logistic Regression,相当于把很多个Logistic Regression组合在一起。

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

Hierarchical Softmax

6e61b2d0f6e675775bc0589c7f6aa4df.png

CBOW是已知上下文,估算当前词语的语言模型。其学习目标是最大化对数似然函数:

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

输入层是上下文的词语的词向量(什么!我们不是在训练词向量吗?不不不,我们是在训练CBOW模型,词向量只是个副产品,确切来说,是CBOW模型的一个参数。训练开始的时候,词向量是个随机值,随着训练的进行不断被更新)。

投影层对其求和,所谓求和,就是简单的向量加法。

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

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

softmax回归需要对语料库中每个词语(类)都计算一遍输出概率并进行归一化,在几十万词汇量的语料上无疑是令人头疼的。

不用softmax怎么样?比如SVM中的多分类,我们都知道其多分类是由二分类组合而来的。

这是一种哈夫曼树结构,应用到word2vec中被作者称为Hierarchical Softmax:

91eb74e78d92f02ab201fd3876f3c603.png

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

每个叶子节点代表语料库中的一个词,于是每个词语都可以被01唯一的编码,并且其编码序列对应一个事件序列,于是我们可以计算条件概率

在开始计算之前,还是得引入一些符号:

1.

:从根结点出发到达w对应叶子结点的路径

2.

:路径中包含结点的个数

3.

:路径
中的各个节点

4.

:词w的编码,
表示路径
第j个节点对应的编码(根节点无编码)

5.

:路径
中非叶节点对应的参数向量

于是可以给出w的条件概率:

这是个简单明了的式子,从根节点到叶节点经过了

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

其中,每一项是一个逻辑斯谛回归:

考虑到d只有0和1两种取值,我们可以用指数形式方便地将其写到一起:

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

代入上式,有:

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

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

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

,另一个是输出层的输入
,我们分别对其求偏导数:

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

于是代入上上式得到:

合并同类项得到:

于是

的更新表达式就得到了:

其中,

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

再来

的偏导数,注意到
是对称的,所有直接将
的偏导数中的
替换为
,得到关于
的偏导数:

于是

的更新表达式也得到了。

不过

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

其中,

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

感谢原作者

http://www.hankcs.com/nlp/word2vec.html#respond​www.hankcs.com
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值