Word2vec之skip-gram模型理解

一、Word2vec背景

传统的词向量一般使用one-hot表示,但会面临两个问题:
(1)高维稀疏的向量带来计算成本
(2)不同的词向量无法正交,无法衡量词之间的相似度。
word2vec是一个将词进行低维稠密向量化的工具,可以通过词向量的方式来表征词的语义信息,即通过一个嵌入空间使语义上相似的单词在该空间内距离很近。Embedding就是一个映射,将单词从原先所属的空间中映射到新的多维空间中。word2vec的训练过程可以看成是单隐层的网络结构:Word2vec之skip-gram模型理解_第1张图片
该网络结构输入层是一个one-hot向量,隐层是一个N维稠密向量,输出层是一个V维稠密向量,W是词典的向量化矩阵,也是从输入层到隐层、隐层到输出层的权重参数。输入层到隐层是对上下文词进行向量化;隐层到输出层是计算上下文词与词典的每个目标词进行点积计算(softmax过程)。
word2vec中最常见的模型有CBOW和Skip-gram,本文重点介绍skip-gram模型。

二、Skip-Gram模型

Word2vec之skip-gram模型理解_第2张图片
skip-gram是给定输入的单词来预测上下文,实际上分为两部分:建立模型和通过模型获取嵌入词向量。建模过程会先基于训练数据构建一个神经网络,当模型训练好后,我们不会用训练好的模型处理新任务,而是需要这个模型通过训练数据所学得的参数,如隐层的权重矩阵等。基于训练数据建模的过程,我们给它一个名字叫做“Fake Task”。

Fake Task

训练模型真正的目的是获得模型基于数据学得的隐层权重,为了得到这个权重,我们首先要构建完整的神经网络作为“Fake Task”。
假如我们有一个句子“The dog barked at the mailman”。
(1)首先选择句子中间的一个词作为输入词,比如选dog作为input word;
(2)再定义一个skip_window的参数,代表当前从input word的一侧选取的词的数量。如果设置skip_window=2,代表选择input word左右的各两个词进入窗口,最终我们获得的窗口中的词为[‘The’,‘dog’,‘barked’,‘at’],窗口大小span=2*2=4。另一个参数叫num_skips,代表我们从整个窗口中选取多少不同的词作为我们的output word,当skip_window=2,num_skips=2时,我们会得到两组(input word,output word)形式的训练数据,即(‘dog’,‘barked’),(‘dog’,‘the’)
(3)神经网络基于训练数据会输出一个概率分布,概率代表着我们词典中的每个词是output word的可能性。

模型细节

神经网络只能接受数值输入,我们可以基于训练文档来构建我们自己的词汇表,再对单词进行one-hot编码。以上文的句子为例,我们可以构建一个大小为5的词汇表,我们可以对单词编号为0-4,那么“dog”可以被表示为一个5维向量[0,1,0,0,0]。如果模型输入为一个10000维的向量,那么输出也是一个10000维度的向量,它包含了10000个概率,每个概率代表当前词是输入样本中output word的概率大小。但这样做,如果词汇表中单词的数量太多,得到的向量维度会太高。
隐层
如果我们想用300个特征来表示一个单词(即每个词可被表示为300维的向量),那么隐层的权重矩阵应该为10000行,300列(隐层有300个结点),我们的最终目标就是学习这个隐层的权重矩阵。
input word 和output word都会被我们进行one-hot编码,进行编码后大部分的维度都是0(只有一个位置为1),如果将一个110000和10000300的矩阵相乘,为了减少计算资源,它仅会选择矩阵中对应向量中维度为1的索引行。
Word2vec之skip-gram模型理解_第3张图片
输出层
经过隐层的计算,词会从一个110000的向量变成1300的向量,再被输入到输出层。输出层是一个softmax回归分类器,每个节点将会输出一个0-1之间的值(概率),这些输出层神经元结点的概率之和为1。
负采样
负采样可以用来提高训练速度,并改善得到词向量的质量。它每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。
假如我们使用训练样本(input word:“fox”,output word:“quick”)来训练,两个词都经过one-hot编码,假如我们的vocabulary大小为10000,在输出层,我们期待对应“quick”单词的神经元结点输出1,其余都输出0。这里输出0的结点对应的单词我们称为“negative word”。
使用负采样时,我们会随机选择一小部分的negative words 来更新对应的权重,也会对positive word进行权重更新。
我们的隐层-输出层拥有30010000的权重矩阵,如果使用负采样,我们仅更新positive word和其他5个negative words对应的权重,共输出6个神经元,相当于每次只更新3006=1800个权重,计算效率大幅提高。

你可能感兴趣的:(word2vec,深度学习,机器学习)