word2vec中文词向量训练

1、genism库

gensim库中提供了word2vec的cbow模型和skipgram模型的实现,可直接调用

image

完整版参考代码


2、tensorflow实现skipgram模型

skipgram模型使用中心词预测上下文,网上介绍很多了也可直接去看论文
本模型实验采用的数据时wiki百科中文数据,有原版和分词后版本,数据量大下载请移步
实现详细直接看代码,代码中关键处都有注释,这里提一下word2vec中常用的nce loss损失函数,nce loss函数个参数定义如下

image

解释一下参数sampled_values,从tensorflow的nce_loss源代码中可以看到当sampled_ values=None时采样方式,word2vec中负采样过程其实就是优选采样词频高的词作负样本

image

在上图中展现了nce_loss在实际使用过程中参数列表以及各个参数的含义,下面我们看一下tensorflow源码中对于nce_loss函数的实现逻辑:

image

Tensorflow实现skipgram模型完整细节参考代码,训练测试效果可参见下图:

image

image

word2vec细节简介

1、word2vec种语言模型

word2vec属于预测式词向量模型,两种Skipgram和CBOW

(1) skipgram通过中间词预测周围词构建网络模型

image

(2) cbow通过周围词预测中间词构建网络模型

image

2、word2vec中Tricks:

(1) Hierarchical softmax

分层softmax最主要的改进既是:不需要对网络W个单词的输出计算概率分布,只需要评估个节点即可

(2) Negative sampling

详细介绍一下负采样,word2vec中训练技巧:负采样

通过模型的一次训练来解释负采样的过程,以skip_gram模型训练为例进行讲解

训练样本输入词是:love,输出词是me,如果词典中有10000个词,设定训练出的词向量大小为300,则开始love和me都是通过one-hot编码的,在输出位置上me对应的是1,其他位置都是0,我们认为这些0位置对应的词即是负样本,1位置对应的是正样本,在不采用负采样情况下隐层到输出层的参数为30010000,负采样的意思即是我们只在9999个负样本中选择很少一部分对应的参数进行更新(包括正样本的也更新),其他没有挑中的负样本参数保持不变,例如我们选择5个negative words进行参数更新,加上一个正样本总共是6个,因此参数是3006,大大提高每次训练的计算效率,论文中指出对于小规模数据集我们选择5-20个negative words较好,在数据集情况下选择2-5个负样本较好

(3) Subsampling of Frequent words

频繁词的二次采样,根据论文描述在大的语料库中,频繁词如容易出现很多次的the\in\a提供的信息量远没有罕见词提供的信息量多,因此在后续的训练中频繁词无法提供更多的信息甚至会将网络带偏,因此提出了频繁词二次采样方式:即在每次训练时按照如下公式对训练集的单词wi进行丢弃:

image

CBOW模型的优化函数(skipgram模型类似):

image

(4) word2vec是静态词向量预训练模型,词向量是固定的,不能解决多义词问题,无法考虑预料全局信息