本系列争取将现有语言模型的实现原理全部过一遍,力求明了。
本篇文章讲述word2vec的实现原理,目前只讲解skip-gram + negative sampling的方法,已分别使用spark和pytorch实现。【当然可以说是搬运。。。】
Word2vec
关于基础请参考word2vec,讲的相当详细了。
skip-gram
如下图所示,cbow和skip-gram的语料是这样生成的:
negative sampling
构建table如下所示:
#负采样tabel初始化
def init_sample_table(self):
self.sample_table = []
sample_table_size = 1e8 # M
pow_frequency = numpy.array(list(self.word_frequency.values()))**0.75 #对频次取0.75的幂次,弱化频次对采样的影响
words_pow = sum(pow_frequency)
ratio = pow_frequency / words_pow #每个词对应的占比
por=0
k=0
for i in range(int(sample_table_size)):
if ((i+1)*1.0)/(sample_table_size*1.0)>por:
por+=ratio[k]
k+=1
self.sample_table.append(k-1)
self.sample_table = numpy.array(self.sample_table)
参考LINE,line的论文以及源码对word2vec的理解都有很大的帮助。
暂无评论