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

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

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

简介: 上一期介绍了word2vec的基本构思和skip-gram模型的创建,这一期将进行google的code review 也就是模型的具体迭代。 milkov2013的文章很难以理解,有以下论文对这篇论文进行了详细解读精读! http://www-personal.umich.edu/~r
+关注继续查看

上一期介绍了word2vec的基本构思和skip-gram模型的创建,这一期将进行google的code review 也就是模型的具体迭代。

上一期地址

milkov2013的文章很难以理解,有以下论文对这篇论文进行了详细解读精读!
http://www-personal.umich.edu/~ronxin/pdf/w2vexp.pdf

skip-gram的计算问题

1

再上一次图,通过上次解析可以知道,对于每一个例如 input w(t)和output w(t-1) 的组合
在forward的时候
input->projection层实际上就是取了一列(或者一行),实际计算量为 H, H为hidden层个数,也就是word的vec维度
projection->output层计算为\(hw2\),上期中提到过\(h\)是H维的向量,\(w2\)是HV维的矩阵,因此这个计算要花费H*V次。

在back-propagation的时候
projection->output层

$$ w2^{new}_{ij}=w2^{old}_{ij}-η*(输出层的错误_i)*h_j $$

其中η为学习速度。
因此\(w2\)矩阵的更新也需要H*V次。

考虑到V词汇量通常为30000以上,而H通常在200左右。H*V的计算量难以承受。

解决方法

NEGATIVE SAMPLING

再回顾一下我们的input和output,input是单词本身的one-hot,而output是单词周围词的one-hot。 对于input=w(t),我们期望模型的输出o接近如w(t-1)=(0,0,0.....1,0...0). 在普通更新时,我们计算output层的error为一个V维量,然后更新所有\(w2\)。另一个策略是,我们不更新所有维度(V维),只更新1所在的维,和随机N个0所在维。这个就称NEGATIVE SAMPLING

代码分析

         if (negative > 0) for (d = 0; d < negative + 1; d++) {
          if (d == 0) {
            target = word;
            label = 1;
          } else {
            next_random = next_random * (unsigned long long)25214903917 + 11;
            target = table[(next_random >> 16) % table_size];
            if (target == word) continue;
            label = 0;
          }

这一段代码中negative是指代negative sampling的数量。一般25足够。
for循环中,d=0的时候,是指代正样本的更新,word存储了output的one-hot表示中1所在列号(维)。
target就存储了这个列(维)号,label则存储了output的one-hot在这一列(维)的值。正样本时候就是1.
d不是0的时候,随机选择负样本列(维),next_random随机了一个数,然后mod table_size(就是mod V词汇量),如果target的数值是word(即正样本列号)就重新随机负样本列,label是0。

以上代码就决定了一个变量target,即要更新的one-hot列(维)。那么在forward的时候我们就只需要计算one-hot向量这一个列(维)的值。然后计算这一维的error,来更新\(w2\),和\(h\)变量。以下代码做了forward和back-propagation。

          l2 = target * layer1_size;
          f = 0;
          for (c = 0; c < layer1_size; c++) f += neu1[c] * syn1neg[c + l2];
          g=输出层error;
          for (c = 0; c < layer1_size; c++) neu1e[c] += g * syn1neg[c + l2];
          for (c = 0; c < layer1_size; c++) syn1neg[c + l2] += g * neu1[c];

公式推导:
forward :

$$ o=h*w2_{.target} $$

back,derivation for h:

$$ h^{new}=h^{old}-η*输出层的错误*w2_{.target} $$

back,derivation for w2 column "target":

$$ w2^{new}_{.target}=w2^{old}_{.target}-η*输出层的错误*h $$

其中\(w2_{.target}\)为w2的target那一列。

联系google的代码,neu1数组为即为h,hidden层,syn1neg数组即为w2,只是把二维数组写成了一维,

l2 = target * layer1_size;

计算了开始地址。

for (c = 0; c < layer1_size; c++) f += neu1[c] * syn1neg[c + l2];

对应上面的foward得到o。从o和label得到输出层error g。

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

对应上面derivation for h,可以看到是一致的。

for (c = 0; c < layer1_size; c++) syn1neg[c + l2] += g * neu1[c];

对应上面derivation for w2 column "target",可以看到也是一致的。

NEGATIVE SAMPLING速度分析

不用NEGATIVE SAMPLING每次更新w2需要VH次运算,而现在需要negativeH次运算,假如negative 取20,V 是3万,那么NEGATIVE SAMPLING至少也能快上1500倍。也就是说用了以后能单机跑,不用就要分布式了。

NEGATIVE SAMPLING为什么能得到好的效果

NEGATIVE SAMPLING看上去非常水,竟然随机取了几列更新,这能行?
答:有人使用了很多高大上的方法来采样,比如什么gibt采样啊,不能是周围的词啊,等等,最终速度比NEGATIVE SAMPLING慢,效果没有任何区别。

那为什么NEGATIVE SAMPLING可行?
可以用两种方法来回答
最直接的回答是 实践表明它可行。
然后就是个人的理解了。
我的理解是,word2vec的宗旨中w(t)是由w(t-2),w(t-1)...来表示的,因此在更新时,对于1那个点,也就是正样本是有道理,而对于负样本,那么些0的地方其实不是那么有道理。那么负样本的选取其实也就没有那么重要了,NEGATIVE SAMPLING也就可行了。

下一期介绍另一种更新方式,请期待!

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

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4558 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
8043 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
word2vec深入浅出,保证你一看就会(3)
上一期介绍了word2vec中的模型更新优化的比较“弱”的形式NEGATIVE SAMPLING。这一期将推出另一种优化方案,Hierarchical Softmax。 ##Hierarchical Softmax 我们的目标是加速project->output层的计算。下图描述了新的project->output层情况 ![2](http://img1.tbcdn.cn/L1/461/
2139 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
1152 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3457 0
6
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载