word2vec深入浅出,保证你一看就会(3)-阿里云开发者社区

开发者社区> 沈昱哈哈哈> 正文

word2vec深入浅出,保证你一看就会(3)

简介: 上一期介绍了word2vec中的模型更新优化的比较“弱”的形式NEGATIVE SAMPLING。这一期将推出另一种优化方案,Hierarchical Softmax。 ##Hierarchical Softmax 我们的目标是加速project->output层的计算。下图描述了新的project->output层情况 ![2](http://img1.tbcdn.cn/L1/461/
+关注继续查看

上一期介绍了word2vec中的模型更新优化的比较“弱”的形式NEGATIVE SAMPLING。这一期将推出另一种优化方案,Hierarchical Softmax。

Hierarchical Softmax

我们的目标是加速project->output层的计算。下图描述了新的project->output层情况
2

回到我们的初衷,我们的目的是对于一个输入词,把周围词作为输出词,期待输出词的值是最大的。
假设我们期待的输出词(答案)是\(w_2\)(不是权值矩阵 \(w2\))。那么我们扔一个小球从root开始,有向左滚概率0.8,向右0.2,然后继续滚,最后总会滚到低,我们期望滚到\(w_2\)洞的概率最大。
图示的情况下,滚到\(w_2\)的概率为0.80.40.7,显然滚到所有洞的概率和为1。

明确每个部分的含义:
每个白色节点是一个球洞,代表了滚到这个词。
每个黑色节点是一个H维向量,替代了之前的权值矩阵 \(w2\)。给个新表示\(v_1,v_2,....\)).
再起个别名n(w, j) means the j-th unit on the path from root to the word w.

每条边为一个概率,表示球滚到父亲节点时,往这条边滚的概率。
往左边滚的概率是

$$ p(n, left) = σ(v_i^Th) $$

,往右是

$$ 1-σ(v_i^Th) $$

其中\(v_i\)是父亲节点的表示H维,h为hidden层的表示H维。σ为sigmoid函数。

再考虑下更新的逻辑
forward

$$ p=σ([*]n(w, 1)^Th)*σ([*]n(w, 2)^Th)....其中[*]表示向左走取+1,向右走取-1 $$

backward

$$ E=loss=-log p $$

可以发现这里的累乘其实是变量独立的,并不是recursive neural network那种,对p中各变量n(w, i)(写作\(v_i\))取导数后,

$$ \frac{\partial E}{\partial v_i^Th}=σ( v_i^Th)-t_j $$

其中

$$ [*]=+1时,t_j=1,[*]=-1时,t_j=0 $$

对权重变量求导

$$ \frac{\partial E}{\partial v_i}=(σ( v_i^Th)-t_j)*h $$

可以发现最终更新变量\(v_i\)时,只和它的output error有关,和其他权重变量无关。所以在实际计算时,我们可以像NEGATIVE SAMPLING一样,计算projection->output中的一列(就是只用一个\(v_i\)),然后求导更新。

代码分析

for (d = 0; d < vocab[word].codelen; d++) {
          f = 0;
          l2 = vocab[word].point[d] * layer1_size;
          // Propagate hidden -> output
          for (c = 0; c < layer1_size; c++) f += neu1e[c] * syn1[c + l2];
         g= 输出层错误 \partial E / \partial v_i^T*h
          // Learn weights hidden -> output
          for (c = 0; c < layer1_size; c++) syn1[c + l2] += g * neu1e[c];
        }

在for循环中 vocab[word].point[d] 记录了单词word在权重变量(projection->output)(上面的那棵树)中具体经过的子节点,即n(word, i)。
syn1 :在前一篇文章中也提到 是\(w2\)即现在上图中的黑色节点的集合,然后把两维拉成了一维。
l2 = vocab[word].point[d] * layer1_size 计算了这个词每个经过节点在syn1数组中的开始地址。

在上面分析中提到过,每个节点n(word, i)的更新和其他节点无关。再看次模型更新

$$ \frac{\partial E}{\partial v_i}=(σ( v_i^Th)-t_j)*h $$

我们只需要计算 \(v_i^Th\) 乘积,计算error,然后乘以h即可。这三部对应接下来的三行程序。

  for (c = 0; c < layer1_size; c++) f += neu1e[c] * syn1[c + l2];

计算 \(v_i^Th\) 乘积,neu1e即h。

g= 输出层错误 \partial E / \partial v_i^T*h

计算了输出层错误*学习速率。

 for (c = 0; c < layer1_size; c++) syn1[c + l2] += g*neu1e[c];

neu1e即h。符合上面公式的推导。

Hierarchical Softmax 速度分析

由于现在的\(w2\)变成了一个完全二叉树,更新的节点为树高,故为log(2,V).
如果V=30000,那现在只需要进行 大约15次。 比原来大约快2000倍。
也就是说用了以后能单机跑,不用就要分布式了。

Hierarchical Softmax 讨论

这个方法可以看成一种改进的softmax方法,原来每个节点的值都依赖于所有其他节点的值,而现在只依赖于一些节点的值。使得模型的计算变得非常高效。
但是它并不比NEGATIVE SAMPLING来得好,原因是,它对V的树状分层其实是随机的,这不像是决策树,最root的分叉是最有效的,因此这只是一种类似于人为缩减更新数量的方法,和NEGATIVE SAMPLING本质无异。只是听上去厉害好多啊!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
3213 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4558 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
8045 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9476 0
word2vec深入浅出,保证你一看就会(2)
上一期介绍了word2vec的基本构思和skip-gram模型的创建,这一期将进行google的code review 也就是模型的具体迭代。 milkov2013的文章很难以理解,有以下论文对这篇论文进行了详细解读精读! http://www-personal.umich.edu/~r
3738 0
word2vec深入浅出,保证你一看就会(5)【完结】
这一节将介绍Glove的实际代码编写和调优简化策略。考虑到时间较长,把上文的模型建立再复制黏贴了一次。 下图是官网的展示图,和frog青蛙最相近的词。 ![1](http://img4.tbcdn.cn/L1/461/1/2ee20e14c85c0980bfaa503135b30faca02480ac) 可以看到效果还是比较好的。 ##模型建立 有理由相信,对于三个词\\(i
3015 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
652 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
4051 0
6
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载