word2vec原理

前言:word2vec,一个很简单的算法,被网上的一些博客说的天花乱坠、太复杂了…,很不利于初学者入门。基于此,写一个简单易懂的word2vec算法原理与大家分享。希望可以帮助到看到这篇博客的你。

目录:
1 模型输入与输出
2 传统的word2vec原理
3 改进的word2vec–引入哈夫曼树

1 模型输入与输出
通过投影层之后,最终的输入是一个向量。输出是要预测的第i个词的概率或概率分布,为了与真实标签(第i个词的概率或概率分布)求损失。
Word2vec训练是用一个大文本(文本中包含了很多句子),可以有多种训练模式,但不管什么模式最终都是要得到一个向量作为最终输入。比如,预测第i个词时用这个词前后k个词为依据(一般以第i个词前后这k个词的平均向量当输入),这种情况就是CBOW模式。当然也有其他方法,比如当预测第i个词以这个词之前的词的情况当依据(用这个词之前的词的平均向量作为最终输入)。或者预测第i个词以上一个词作依据(用上一个词的向量作最终输入)。以什么模式只是影响了最终输入的向量,对输入后的w2v算法框架是没有影响的,用什么模式不是算法推导的主要关注点。
所以,本文只以CBOW模式作为例子讲w2v的原理。

2 传统的word2vec原理
例:比如现在有训练文本为:i am a student i love study and …
word2vec原理_第1张图片

这样,每个样本都可以与真实的概率分布计算得到一个损失,模型的损失函数也就可以表达出来,损失函数中的参数是神经网络中的参数。

3 改进的word2vec–引入哈夫曼树
<1> 为什么要引入哈夫曼树?
传统的w2v算法在进行全连接操作时,参数太多、计算量太大,不利于训练。所以,引入哈夫曼树来提高训练速度。
<2> 构建哈夫曼树
暂时先抛开w2v原理,我们现在只关注如何构建一棵哈夫曼树。
例:现在有8个数,E:2,B:6,F:8,G:16,C:23,H:34,D:35,A:80,构建一棵树使数值越大的数越靠近树的根部。
如图,这就是哈夫曼树(当然,哈夫曼树的生成还有其他方式):
word2vec原理_第2张图片
这样做的好处:在搜索值较大的数所花费的次数就较少。
同理,我们对本领域的原始训练文本中词统计的出现次数,按如上的方式,出现次数越多的词越靠近根部。建成的这棵树叶节点的个数就是训练文本中词的个数。这样,为我们后续改进的算法减少了时间复杂度(如何减少时间复杂度等把改进算法讲完后再讲解),提高了模型的训练速度。
训练文本中的词建好哈夫曼树后如图:
word2vec原理_第3张图片
其中,节点中的数字表示该词在训练文本中出现的次数,黄色的fi表示每一个二分类器,定义往左为”1”,往右为”0”。

<3> 改进后的w2v原理
还是用上述例子:原始训练文本为i am a student i love study and …
预测第i个词的概率,以预测第四个单词”student”为例:
word2vec原理_第4张图片
同理,训练文本中其他的单词的概率也可以求出。然后用极大似然法求得模型的损失函数,得到的损失函数中含有各个分类器fi的参数(即模型参数)。然后优化损失函数,更新参数,求解模型。

注:对哈夫曼树减少模型训练的时间复杂度的解释
因为在训练文本中出现次数较多的词在靠近根部,这些词求概率的计算次数就比较少,计算次数较少的词占大多数,对于所有的词,求所有的词的概率的计算次数也就相对较少。

你可能感兴趣的:(算法总结)