目录
word2vector,顾名思义,就是将语料库中的词转化成向量,以便后续在词向量的基础上进行各种计算。why?机器学习任务需要把任何输入量化成数值表示,然后通过充分利用计算机的计算能力,计算得出最终想要的结果。在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder。
one-hot
一种最简单的词向量方式是 one-hot representation,就是用一个很长的向量来表示一个词,向量的长度为词典的大小,向量的分量只有一个 1,其他全为 0, 1 的位置对应该词在词典中的位置。例如:
“杯子”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]
“水杯”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]
缺点:
- 高维稀疏矩阵,容易受维数灾难的困扰,尤其是将其用于 Deep Learning 的一些算法时;
- 不能很好地刻画词与词之间的相似性。即:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,比如上面的例子中的“杯子”和“水杯”。这种现象叫做“词语鸿沟”。
why word embedding?
首先使用one-hot的时候,可能会导致维度爆炸,其次,使用one-hot的时候,所有的词之间的距离相同,而实际上,相似的词更有可能出现在相同的上下文中。如使用one-hot表示时,人和猫、狗之间的距离相等,这个在实际上是不符合要求的,那么word embedding可以解释上面的问题,那么什么是word embedding呢?其中可以理解的就是采用更加紧凑的方式来避免维度爆炸,如下面一张图:
经过这样的表示后,我们的dog就可以表示为dog=[w1,w2,w3…]
word embedding的优点:
(1)相对于one-hot,能够产生稠密的向量,避免维度爆炸;
(2)词之间的距离可以表示出来(词之间的相似度)
(3)可以作为词的特征去帮助解决其他的问题,如文本分类,命名实体识别、语义分析等。
word embedding
的缺点:向量的可解释性不强,没有one-hot
那样明确的表示意义。
word2vec
word2vec
不是一个算法,它仅仅是一个工具包,将词转换为稠密的向量word2vec模型其实就是简单化的神经网络。
word2vec 包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW);
两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。
网络结构
输入层
假设所有训练数据所构成的词典大小为V 。现在输入数据为“今年夏天超级热”,分词后将每个词表示为V 维的one hot向量,设某个词的输入向量/one hot向量表示为 。现假设根据上下文*“今年,超级,热”来预测中心词“夏天”*。然后网络初始化权重,该权重为一个矩阵表示为
,其中N为词向量的维度。该权重矩阵也称为投影矩阵,投影到词空间的矩阵。(多次迭代后的结果也就是我们要的词向量矩阵)。
隐藏层
分别将输入层的4个词的向量*投影矩阵,即 *
,将这4个结果相加后求平均,即得到隐藏层的结果
。
然后将乘以另一个投影矩阵
,将结果传播到输出层。
输出层
使用激活函数softmax,输出结果one hot 向量。将该one hot 向量与true label“夏天”的向量做比较,然后进行误差反向传播,不断迭代优化权重矩阵,最终即得到我们要的词向量矩阵(每行为一个词所对应的词向量,维度为N,V个词就有V行)。
输出层的神经元个数V,参数矩阵尺寸为[n,V]。词向量经过矩阵计算后再加上softmax归一化,重新变为V维的向量,每一维对应词库中的一个词与输入的词共同出现在上下文中的概率。
注意:这里有两个矩阵和
,一般使用前者作为我们的词向量矩阵,也可以使用后者,或两者相加求平均。
skip-gram和CBOW
- skip-gram: 核心思想是根据中心词来预测周围的词。假设中心词是cat,窗口长度为2,则根据cat预测左边两个词和右边两个词。这时,cat作为神经网络的input,预测的词作为label。下图为一个例子:
在这里窗口长度为2,中心词一个一个移动,遍历所有文本。每一次中心词的移动,最多会产生4对训练样本(input,label)。
-
CBOW(continuous-bag-of-words):如果理解了skip-gram,那CBOW模型其实就是倒过来,用周围的所有词来预测中心词。这时候,每一次中心词的移动,只能产生一个训练样本。如果还是用上面的例子,则CBOW模型会产生下列4个训练样本:
这时候,input很可能是4个词,label只是一个词,怎么办呢?其实很简单,只要求平均就行了。经过隐藏层后,输入的4个词被映射成了4个300维的向量,对这4个向量求平均,然后就可以作为下一层的输入了。
- ([quick, brown], the)
- ([the, brown, fox], quick)
- ([the, quick, fox, jumps], brown)
- ([quick, brown, jumps, over], fox)
两个模型相比,skip-gram模型能产生更多训练样本,抓住更多词与词之间语义上的细节,在语料足够多足够好的理想条件下,skip-gram模型是优于CBOW模型的。在语料较少的情况下,难以抓住足够多词与词之间的细节,CBOW模型求平均的特性,反而效果可能更好。
CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。CBOW模型
:Continuous Bag-of-Words Model,连续词袋模型,如下左图;Skip-gram模型
:Continuous Skip-gram Model,跳字模型,如下右图。
- CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。
我们的上下文大小取值为4,特定的这个词是"Learning",也就是我们需要的输出词向量,上下文对应的词有8个,前后各4个,这8个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这8个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可。
这样我们这个CBOW的例子里,我们的输入是8个词向量,输出是所有词的softmax概率(训练的目标是期望训练样本特定词对应的softmax概率最大),对应的CBOW神经网络模型输入层有8个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过深度神经网络(DNN)的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某8个词对应的最可能的输出中心词时,我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。
- Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。还是上面的例子,我们的上下文大小取值为4, 特定的这个词"Learning"是我们的输入,而这8个上下文词是我们的输出。
Skip Gram
这样我们这个Skip-Gram的例子里,我们的输入是特定词, 输出是softmax概率排前8的8个词,对应的Skip-Gram神经网络模型输入层有1个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某1个词对应的最可能的8个上下文词时,我们可以通过一次DNN前向传播算法得到概率大小排前8的softmax概率对应的神经元所对应的词即可。
训练优化方法
注意到,实际中词汇表一般很大,那么Word2Vec模型是一个超级大的神经网络(权重矩阵规模非常大)。
两种方法优化训练过程:负采样(negative sampling)和层序softmax(hierarchical softmax)
(1)负采样
负采样核心思想:不考虑出现概率低的词,保证频次越高的样本越容易被采样出来
(softmax分出来的类别数目是整个词汇表的大小,那么是否可以减小?)详见word2vec的负采样
(2)hierarchical softmax
hierarchical softmax的核心内容是将词汇表中的每个词使用哈夫曼树(Huffman Tree)进行编码,出现概率越高的符号使用较短的编码(层次越浅),出现概率低的符号则使用较长的编码(层次越深)。这样做,可以使得最终是在做一层层的二分类。详见基于hierarchical softmax的word2vec