word2vec分析

看过word2vec 中的数学原理详解之后,做一个记录

word2vec中的基本知识就不多做记录了,比如cbow模型和skip-gram模型分别是预测中间词和周围词的。这里解释一下word2vec用到的两种计算方式,哈弗曼树编码hierarchical softmax,以及负采样。

首先要知道的是不是没有这两种计算方式就没办法计算word2vec了,之所以要用这个是因为我们模型输出的结果是预测的词,这就意味着输出是词表大小的向量空间,不但空间过于稀疏,而且每一次预测都需要做softmax,效率非常低下。同样的还有做翻译以及摘要抽取的时候,预测的空间大小都是词表大小,几万到几十万维。

哈弗曼编码

哈夫曼编码是信息传输中将信息编码成二进制的一种方式,如下图

word2vec分析_第1张图片

用词表频率来构建哈弗曼树,这里不多做解释,总之就是和信息论中构建哈弗曼树一样,也是频率越高的词离根越近。所有叶节点都是词。比如足球这个词,对应的编码就是1001。那这样一棵树是怎么成为网络的输出的。在实际中,其实就是在预测编码的值,这样预测的复杂度就从O(n)降到了O(lgn)

负采样

负采样是训练的时候选取一个正样本,公式推导在很多博客中都有这里不再赘述,言而言之就是最大化正样本的似然估计。我们用一句话作为例子来讲讲具体实现的细节

喜欢 观看 巴西 足球 世界杯

我们将word2vec训练看成一个用上一个词预测下一个词的简单模型,正样本就是(巴西,足球),在原始模型中我们输入巴西这个词,经过隐藏层后输出的是一个词表大小的向量,其中足球这个词是1,其他都是0。这样计算softmax的时候非常耗时

但是现在我就让输出是一个点,做个二分类,相当于逻辑回归。负采样的词是按训练语料中词的频率来采样的,高频词越容易采样到,一般采样5-20个。正样本是(巴西,足球),负样本就是(巴西,我),(巴西,云朵)等,现在问题来了,我输出就是一个二分类,那么我输入的是什么。

这里很多文章没有讲到,其实此时输入的就不是巴西了,而是词对,(巴西,足球)是1,其他负采样的词对是0.也就是说,我把网络看成是一个预测词对正确性的任务了。

资料

https://www.cnblogs.com/linhao-0204/articles/9126037.html

https://stats.stackexchange.com/questions/244616/how-does-negative-sampling-work-in-word2vec

https://github.com/Adoni/word2vec_pytorch

 

你可能感兴趣的:(机器学习,机器学习基础)