虽然word2vec常被当作无监督,但是其训练过程跟有监督基本差不多,原始的word2vec暂时不考虑负采样和huffman tree,其损失函数就是多元交叉熵:
![502e1041d017894c915658cb88ed15c3.png](https://i-blog.csdnimg.cn/blog_migrate/192462fcc9ff284a2caef2a5f48b3ce7.jpeg)
多元交叉熵的公式:
![d4c9c5b779758e0894ab4b7bc619016c.png](https://i-blog.csdnimg.cn/blog_migrate/203885b822fec9e3e226b99279e0cf31.png)
以传统机器学习来说,这里的Zj就是某个类别的预测概率,yj=0或者1,我们假设有3个类别,模型对样本A的预测结果为[0.2,0.5,0.3],A的实际标签为[0,1,0],则仅仅计算中间为1的那一项(其实就是样本对应的真实类别单独计算一下损失,每一个样本计算的过程中对于单输出问题都是计算一次就行)
则
以cbow为例,
![0fd9e47a304168debb3b85d9bcd349a7.png](https://i-blog.csdnimg.cn/blog_migrate/ffa0d49b999adf7cd9245c57fd75bcac.png)
简单理解就是求平均(也可以是求和,gensim里的设计是两种方式都进行了实现)之后的结果【0.23,0.03,0.62,0.12......】经过输出层映射为一个v维的一维矩阵(v是词的数量)要和真实的标签【0,0,0,1,0,0,0.。。】尽量接近;这里ui表示的是输出层,vc表示的是平均之后的向量,他们的乘积加上softmax函数就是word2vec的模型的最终预测结果;
因此可以认为是一个超级多分类模型,类别的数量就是词(去重)的数量;
app2vec的加权体现在这个地方,根据不同的不同的app的gap来对不同的样本进行加权,具体可见我写的app2vec的论文分析在自然语言处理的专栏里;
然后是采用了huffman tree对其进行优化(类别太多用原始的多元交叉熵算死)
huffman tree是一种非线性的数据结构,其建树流程如下:
![5cfd3969a61d9ad2ee1ca8003fa51340.png](https://i-blog.csdnimg.cn/blog_migrate/f0cae95a994544f8b9d9e9fe3289738e.jpeg)
具体的例子如下: