word2vec

word2vec是一种基于推理的文本向量化技术
它的原理基于分布式假设,即某个单词的含义由文本中在它周围的单词形成

例如“drink”周围总是有“juice”, “beer”等饮料出现,而”guzzle”也是如此
因此可以推测“drink”和”guzzle”是近义词

同时word2vec是基于神经网络学习文本向量表达的技术
相较于基于计数的文本向量化方法,它可以通过mini-batch轻松的处理大语料库

CBOW

CBOW原理

CBOW全称为continuous bag-of-word,是word2vec论文中给出的模型之一

CBOW是一个通过上下文预测目标词的模型
例如,设语料库为“you drink tea and I drink coffee”
以上下文输入量各为1为例,对网络输入[“you”, “tea”],我们希望它输出”drink”

为了完成这一任务,我们先对语料库建立索引,并对单词one-hot编码
如图所示,对网络输入为上下文单词的one-hot编码,输出为对预料库每个词的预测概率(softmax激活),也即转化为了分类学习任务
网络中两个$W_{in}$​是相同的全连接权重矩阵,中间层是各输入的平均

CBOW

模型训练完之后,权重矩阵 $W{in}$ 的每一行就是一个学得的单词向量
同理,也可以选择$W
{out}$的每一列作为学到的向量

显然,每个获得的单词向量维度与中间层维度相同

CBOW_W

引入Embedding层

上述的CBOW模型仍然存在一个问题,即对于大规模语料库计算时间无法承受
如果语料库有100万个单词,那么one-hot编码也会有100万维,全连接层和softmax都会出现计算瓶颈

首先考虑$Win$​与输入相乘的部分
注意到因为输入时one-hot编码,所以这里矩阵乘法本质上就是根据单词id选取 $W
{in}$​ 某的一行

所以只需要实现一种层,输入一个整数,根据该整数取出矩阵对应的一行即可
我们把这种层称为Embedding层

CBOW_embedding

引入Negative Sampling

解决$W_{out}$​和softmax计算瓶颈的思想是用二分类替代多分类

例如对于输入[“you”, “tea”],若我们只输出对于单词”drink”的预测概率
那么$W{out}$处的矩阵乘法本质上就是提取 $W{out}$​ 某一列与中间层输出做点积

CBOW_negsample

根据这个原理,我们需要提取 $W_{out}$​​ ​正例的列和若干个负例的列
若干次二分类并计算平均交叉熵损失,由此就解决了多分类的计算瓶颈

这种方法称为Negative Sampling
一般负例的采样对语料库中出现频率高的单词有更高的采样概率

skip-gram

skip-gram是word2vec论文中出现的另一个模型

skip-gram就是将CBOW模型反过来,用目标单词预测上下文,单词向量也从权重矩阵$W$中获得
相同的embedding层、Negative Sampling优化也可用于skip-gram

实际中skip-gram往往比CBOW表现更好(感性上理解是因为预测上下文的任务更难?)

skip-gram