这里添加一个链接,很好的一篇word2vec的文章,叫做《word2vec中的数学原理详解》
本人上传了在知网看到的一篇 language model + RNN的文章,因为自己也是新手,所以上传,如果需要,可以到我的下载页看一下,名称叫 基于循环神经网络的汉语语言模型建模方法。
传统的统计语言模型n-gram发展到神经概率语言模型,主要的一个改进就是网络能够以当前词的上下文作为依据,预测下一个词出现的概率。另外,因为采用embedding matrix,解决了数据稀疏的问题,因此表现的更好一些。当然神经概率语言模型的缺点也很明显,就是计算速度慢。
即,每根据一段话的上下文来确定中间的一个字,就要运行N次,其中N是词典的大小,通常不会小于10k。
想要训练模型,必须要训练词向量和神经网络参数,参数总数会非常大。个人估计应该能达到1M吧,因为只是embedding matrix 就有N*M个参数,N表示词典大小,M表示词向量长度,即词向量包含的特征数。当然,使用神经概率语言模型还有一个好处就当你的语言模型出来以后,就不需要每次都要统计了,而是直接计算出来就可以了,相比之下,统计语言模型就有一种聚类的感觉,现学现用。
而word2vec算是对神经概率语言模型的一种改进,主要是为了实现更快地计算速度。当然主要产物就是语言模型,副产物是embedding matrix。
改进主要针对输出层进行。一种方式就是 分层模型hierarchical softmax,另一种是负采样。
hierarchical softmax的原理是基于二分法原理,在二叉树上不断延伸,当然因为概率本身并不是都相等,因此无法使用平衡二叉树,基于信息论只是,huffman树更合理一些。这样上面的就不要一直靠不停遍历然后累加实现了,因为这种做法是O(N)复杂度,而采用二叉树后,大约变成O(log(N))了,复杂度下降很多。
负采样的原理是分母上不一定要全部都遍历,只要遍历部分就可以了,这样还是使用这个公式,但是计算复杂度也降低了。
通常:小数据集负样本个数为5~20, 大数据集负样本个数为2~5.
在negative sampling 的 skip-gram模型中,优化目标函数作出修改:
原目标
但是这样会出现要找 w,就要找 u,要找 u,就要找 z,感觉要一直转下去。
而且个人认为这种找法一个问题是找到w的最好的 contex(w) 个上下文,但是那些上下文单词之间的上下文关系不一定就是最好的呀,比如,当前次为是 “个”,那么在查找上下文时可能会出现上下文单词变成 一、二、三、四、五、六、七,这样的字,合成一句话就是“一二三四五六七个”,这样就没有意义了。
反而不如
查找contex(w)个字,这些字从单独的skip-gram看可能不是最好的,但是它们的粘合度是最好的,就是这些字连起来时让人看起来更舒服一点。
在我看来, CBOW就是小朋友上学时的给一句话,然后扣掉几个字,让你填上去,这时你要利用上下文关系来确定。
skip-gram就是,高中生做语文,给你一句古诗,让你把古诗全文写下了,你想,一首古诗能被你记住,肯定不是因为你只是记住了其中一句吧,肯定是你先推出来某一句,然后在结合着几句再找的。
使用word2vec进行训练,一般需要大规模的语料(5GB以上),这些语料还需要精确的分词,最终才能体现出训练结果。
最后附上关于梯度下降法和梯度上升法的概念: