对于word2vec的softmax就不说了,重点是要弄明白cbow、skip-gram的两种优化方式,一种是层次softmax,另外一种是负采样。二者都是优化方式,那么首先明白为什么要优化?同时这两种方式为什么可以优化。首先回答第一个问题,优化的主要原因就是原始的softmax是在全词表上进行,结果就是全词都要进行梯度更新,计算慢,同时softmax在每个词上的概率值较小,这样就使得非主要词的归一化作用不大了,因此要优化。那么层次softmax是采用哈夫曼树进行对词进行重新构造,使得每一个词的表示相比较于softmax的序列得到了缩短,这就可以优化了。比如softmax需要做的词个数是1万,那么层次归一化的路径就是5,这就极大的缩短了,这就是一个优化措施。而负采样更加明显,就是直接对全词采样,那么数量肯定就少了呀,这就是为什么这两种方式可以优化。不懂原理的可以在查一查别的地方。
源码解读一:https://zhuanlan.zhihu.com/p/40557458
源码解读二:https://blog.csdn.net/google19890102/article/details/51887344
公式解读:https://blog.csdn.net/google19890102/article/details/51887344
github地址:https://github.com/Wsl-hfut-nwpu/word2vecSource 里面的word2vec.c是源代码
细节小track的讲解:https://www.leiphone.com/category/yanxishe/eV8j3Nu8SMqGBnQB.html
基于tensorflow实现的skip—gram:https://www.leiphone.com/category/yanxishe/eV8j3Nu8SMqGBnQB.html 重点明白损失函数,其底层实现就是优化了目标函数的实现,只不过名字还是叫负采样的交叉熵,这个源码包含在上述github链接内部,叫做tf_skip_gram。
内部还包括原始论文。
对照上述资源对skip_gram做出的理解,下面5张图片。层次哈夫曼也差不多,只不过是多了个哈夫曼的构造以及路径的累乘而已。