将Word2Vec的随机数生成从C移植到火炬

时间:2016-05-03 14:48:16

标签: c torch word2vec

我正在尝试将以下C代码(Word2Vec的一部分)移植到火炬,并且需要准确理解它的作用(我不是通过训练来计算机科学家,因此在某些方面挣扎)。我有一个答案的开头,但如果有人可以确认并完成我的解决方案,那就太好了。

代码如下。它在一个while循环中;变量 sample 是一个常量= 10 ^ -3,而 next_random 在调用代码的函数开头被初始化为某个线程号。

// The subsampling randomly discards frequent words while keeping the ranking same
    if (sample > 0) {
      real ran = (sqrt(vocab[word].cn / (sample * train_words)) + 1) * (sample * train_words) / vocab[word].cn;
      next_random = next_random * (unsigned long long)25214903917 + 11;
      if (ran < (next_random & 0xFFFF) / (real)65536) continue;
    }

我的理解如下。

  • ran 生成一些数字,它是处理文本中单词频率的函数, train_words 代币总数(以前用alpha术语进行平滑处理) ,但让我们忽略这一点。)
  • next_random 由一个看起来像线性的函数赋值 同余发生器。我从这里得到这些信息:official docs。如果我错了,请纠正。
  • next_random 被屏蔽,仅保持最低16位不变。所以我现在有一个二进制数,其最大值(十进制)值为65535.除以65536,这给出了一个介于0和1之间的数字,我可以将 ran 与之比较。

假设我的理解是正确的,我想我的主要问题是我是否会通过简单地使用火炬内置随机数生成器代替上述代码来做错事。即以下内容是否与原始版本尽可能相同?

if sample > 0 then
   ran = (torch.sqrt(counts[word] / (sample * train_words)) + 1) * (sample * train_words) / counts[word]
   if ran < torch.random()/(2^32) then
      continue
   end
end

谢谢!

0 个答案:

没有答案