词向量工具---word2vec简介、使用教程及源码分析

word2vec 是 Google 于 2013 年开源推出的一个用于获取词向量的工具包,它简单、高效,因此引起了很多人的关注。word2vec 的作者 Tomas Mikolov 在以下两篇论文介绍了相应的理论基础:

Efficient Estimation of Word Representations in Vector Space

Distributed Representations of Words and Phrases and their Compositionality

原始论文没有谈及太多算法细节,解释得不够清晰,因而在一定程度上增加了这个工具包的神秘感并没有中文。想了解一下 word2vec 的数学原理,推荐 peghoty 大神的系列博客《word2vec 中的数学原理详解》 ,博主也是通过阅读该系列博客学习 word2vec 中的数学原理和实现细节,在此推荐给大家。

word2vec 就是“两个训练方案+两个提速手段”,两两组合,因此也就有了四个备选的模型。

两个训练方案

CBOW (Continuous Bag-of-Words Model) 和 Skip-gram(Continuous Skip-gram Model)。
结构如图所示:
word2vec的CBOW和Skip-gram结构图

两个模型都是只有三层,即输入层、映射层和输出层。
CBOW 可以理解为”将周围词叠加来预测当前次”,用上下文的词向量作为输入,映射层在所有的词间共享,输出层为一个分类器,目标是使当前词的概率最大。
Skip-gram 可以理解为”根据当前词分别预测周围词”,输入层为当前词向量,输出层是使得上下文的预测概率最大。训练采用SGD。
按理论来说,skip gram比cbow需要花window ~ 2 * window倍的时间。cbow是把2window个词作为输入,一个词作为输出,这样构成训练样本。而skip gram相当于将这2 \ window个词拆成了2 * window个样本。

两个提速手段

Hierarchical Softmax 和 Negative Sampling。
Hierarchical Softmax 是对softmax的简化,精度会比原生的softmax略差,但是预测概率的效率从O(|V|)降到O(log2|V|),是word2vec中用于提高性能的一项关键技术。
Negative Sampling 是 NCE(Noise Contrastive Estimation) 的一个简化版本,目的是用来提高训练速度并改善所得词向量的质量。与Hierarchical Softmax不同,Negative Sampling 不再使用复杂的Huffman树,而是利用相对简单的随机负采样,达到大幅度提高性能。

word2vec 将词的上下文关系嵌入到低维空间。更具体而言,word2vec 将词的上下文关系转换为分类关系,并以此同时训练词嵌入向量和 logistic regression 分类器。
逻辑回归logistic regression 是经典的线性分类模型。广义上而言,线性模型由三个部分组成, 1. 输入向量 2. 线性系数 3. 偏移(bias),而 bias 可以进一步表示成线性系数。所以,二分类的线性分类问题可以表示为输入 $x$ 和系数 $w$ 的内积结果 $w^Tx$,结果的正负决定了数据的类别。分类器参数通过最小化损失函数 $l(y, w^Tx)$来完成,不同的损失函数定义了不同的分类模型。
logistic regression 也广泛地应用在多分类问题中,通过 softmax 函数计算数据属于每个类别的概率完成分类。因为分类神经网络的输出层通常也设定为 softmax 函数,所以多分类 lr 也可以表示为浅层神经网络。

cbow 用上下文词向量的加和结果来预测其中心词汇。
skip-gram我们将词的上下文定义为以词 $w_i$ 为中心,窗口为 $k$ 前后范围内的词 $Ci = {w{i-k}, w{i-k+1}, …, w{i-1}, w{i+1}, … w{i+k}}$。
skip-gram 将词之间的关系变成了 $|V|$ 多分类问题,其中 $|V|$ 是词库大小。每个词有两个变量 $x_i, w_i$,前者为词嵌入向量,后者是线性分类器的系数,在相关文章中又称为上下文向量。
skip-gram 用中心词汇来预测其上下文
针对多分类的计算优化word2vec 将上下文关系转化为多分类任务,进而训练逻辑回归模型,这里的类别数量是 $|V|$ 词库大小。通常的文本数据中,词库少则数万,多则百万,在训练中直接训练多分类逻辑回归并不现实。
word2vec [5] 中提供了两种针对大规模多分类问题的优化手段, negative sampling 和 hierarchical softmax。以 skip-gram 为例,中心词对上下文的词类是正面例子,对所有其它的词则是负面例子。在优化中,negative sampling 只更新少量负面类,从而减轻了计算量。hierarchical softmax 将词库表示成前缀树,从树根到叶子的路径可以表示为一系列二分类器,一次多分类计算的复杂度从 $|V|$ 降低到了树的高度。
嵌入技术将词的上下文关系嵌入到低维空间。word2vec 将词的局部上下文转化为了多分类任务,从而训练逻辑回归模型,并将逻辑回归模型中的输入部分作为词嵌入输出。
首先简单说一下word2vec的使用方式。word2vec的官方下载地址是 https://code.google.com/archive/p/word2vec/ 。到source里面找到download下载就可以。word2vec可以直接在linux上和macos上面运行,但是不能直接在windows上面运行,原因是windows没有pthread库。把pthread依赖去掉可以单线程跑,但是实在是太慢了。也可以安装这个库,但是比较麻烦,这里就不深入探讨了。

测试数据集

question-words.txt和question-phrases.txt是用来衡量词向量/短语向量质量的词类比(analogy)数据集。
question-words.txt每一行是四个单词,我们需要根据前三个单词推断出第四个单词是什么。每一行像这样:Berlin Germany London England。
question-phrases.txt数据集中是包含了短语的analogy问题,像这样:Jeff_Bezos Amazon Tim_Cook Apple

代码

makefile文件对几个c语言文件进行编译生成可执行文件。
word2vec.c
这个工具包中最重要的文件就是word2vec.c。它读入语料然后训练得到词向量。其他的c文件实现了一些边角辅助功能。
word2phrase.c
会过滤一遍要训练的语料,识别出语料中哪些是短语(比如把Tim Cook识别成一个短语Tim_Cook),把短语当做一个新词,输出出去。
distance.c
的功能是输入一个单词,返回最接近的单词(比如给beijing返回shanghai,heilongjiang)以及它们的词向量和输入单词的词向量的Cosine夹角。
word-analogy.c
的功能是输入三个单词(比如wife king queen),返回第四个单词(比如husband)。
compute-accuracy.c的功能是定量的给出词向量在analogy数据集上面的准确率。

1、word2vec
word2vec:与一般的共现计数不同,word2vec主要来预测单词周边的单词,在嵌入空间里相似度的维度可以用向量的减法来进行类别测试。

弊端:

1、对每个local context window单独训练,没有利用包含在global co-corrence矩阵中的统计信息
2、多义词处理乏力,因为使用了唯一词向量

-------------本文结束感谢您的阅读-------------
坚持整理学习笔记,您的支持将鼓励我继续整理下去!