我正在尝试将以下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;
}
我的理解如下。
假设我的理解是正确的,我想我的主要问题是我是否会通过简单地使用火炬内置随机数生成器代替上述代码来做错事。即以下内容是否与原始版本尽可能相同?
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
谢谢!