绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
fastText 的negative sample 的理论与实践
2019-08-11 10:56:51
为什么word2vec需要negative sampling?
因为在训练word2vec的时候采用了浅层神经网络方法,对所有的vocabulary 进行 one-hot 编码,这样输出层就是一层softmax layer。而计算softmax layer,必须要将该数据与其他的vocabulary的embedding进行重算,这样非常的耗时。(因为one-hot 的维度有可能是上百万的,计算量太大)
所以采用negative sampling 的方法解决这个问题。negative sampling 也就是近似softmax的形式解决这个问题。
例如 I love Beijing.
2gram 来遍历,正常来讲,训练数据:应该是 (I, love), (love, Beijing)
但是用了NCE来近似softmax 的结果,就是采用选择true+k个negative sample的方式来训练model。
(I, love, 1), (I, the, 0), (I, of, 0)......
(love, Beijing, 1), (love, of, 0) ...... 
例如计算(I, love)的binary logistic 1. (I, the) target 0。
cost function 则选择使用cross-entropy。
代码如下:
这里hidden_ vector 就是input word的embedding。

点击(此处)折叠或打开

  1. real Model::negativeSampling(int32_t target, real lr) {
  2.   real loss = 0.0;
  3.   grad_.zero();
  4.   for (int32_t n = 0; n <= args_->neg; n++) {
  5.     if (n == 0) {
  6.       loss += binaryLogistic(target, true, lr);
  7.     } else {
  8.       loss += binaryLogistic(getNegative(target), false, lr);
  9.     }
  10.   }
  11.   return loss;
  12. }

 binaryLogistic 就是cost的计算过程,如果label 是false的话, cost = (1-0)*LOG(1-score)

点击(此处)折叠或打开

  1. real Model::binaryLogistic(int32_t target, bool label, real lr) {
  2.   real score = sigmoid(wo_->dotRow(hidden_, target));
  3.   real alpha = lr * (real(label) - score);
  4.   grad_.addRow(*wo_, target, alpha);
  5.   wo_->addRow(hidden_, target, alpha);
  6.   if (label) {
  7.     return -log(score);
  8.   } else {
  9.     return -log(1.0 - score);
  10.   }
  11. }


分享好友

分享这个小栈给你的朋友们,一起进步吧。

数据分析与数据挖掘
创建时间:2020-06-17 15:23:29
数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,将它们加以汇总和理解并消化,以求大化地开发数据的功能,发挥数据的作用。 数据挖掘是指从大量的数据中通过算法搜索隐藏于其中信息的过程。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 栈栈
    专家
戳我,来吐槽~