词向量
在自然语言处理问题中,一般以词作为基本单元,词语组成句子,句子再组成段落、篇章、文档。所以NLP里面,最细粒度的是词语。
而NLP里的词语,是人类的抽象总结(比如中文、英文等),但是无法处理词,神经网络也无法对词进行处理,所以我们需要把这些词通过某些办法映射成词向量(也就是数学形式)。词向量是用来表示词的向量,也可被认为是词的特征向量。把词映射为实数域向量的技术也叫词嵌入(word embedding)。
当使用词嵌入时,所有单个词都表示为预定义向量空间中的实值向量。每个单词都映射到一个向量,向量值以类似于神经网络的方式学习。
下面介绍几种常见的词嵌入方法:
One-hot
最开始的词嵌入技术是采用one-hot编码,也就是离散表示。方法是将单词看作一个原子符号,把每个词表示为一个长向量,这个向量的维度是词表的大小,向量中只有一个维度的值为1,其余维度为0,而值为1的维度就代表了当前的词。
举个例子:
下面有两个句子:Have a good day 和 Have a great day ,它们之间的含义几乎是一样的。如果我们为句子构建一个词汇表V,那么V={Have , a , good , great , day }。
该词汇表的one-hot编码向量的长度等于V的大小(5),Have =[1,0,0,0,0]T;a=[0,1,0,0,0]T;good=[0,0,1,0,0]T;great=[0,0,0,1,0]T;day=[0,0,0,0,1]T
one-hot编码有两个致命的缺点:
1)维度灾难,也叫维度爆炸。比如现在有100万个词组成的词汇表,那么按照one-hot编码的方式:每个词一个维度的话,那么一个词对应的one-hot向量就是一个100万维的向量,非常占内存,也会导致难以计算。
2)语义鸿沟,也就是难以计算词之间的相似度,one-hot编码不捕获单词之间的任何关系。在NLP中,一般以两个词之间的余弦相似度来表示词之间的相似性。但是one-hot编码任何两个词的余弦相似度都是0.
Word2vec
词嵌入的目标是让具有相似上下文的单词占据接近的空间位置。如下图所示,在数学上,这些向量之间夹角的余弦值应该接近1,即接近0的夹角。
这里出现了分布式表示的想法,简单的说,我们引入了一个词对其他词的一些依赖。这个词的上下文中的词将获得更大的依赖,以便于在进行文本分析时获得更大的权重。但是在one-hot编码中,所有单词都是相互独立的,不能捕获到这种词之间的依赖。
为了解决one-hot编码带来的问题,2013年谷歌的一篇论文《Efficient Estimation of Word Representation in Vector Space》介绍了Word2vec,Word2vec是一种构建词嵌入的方法。它可以使用两种方法(浅层神经网络)获得:Comm Bag of Words(CBOW ,连续词袋模型) 和 Skip Gram(跳字模型)。
CBOW:通过根据上下文预测当前单词来学习嵌入
Skip-gram:通过预测给定当前单词的周围单词来学习嵌入
word2vec的输入是一个文本语料库,它的输出是一组称为特征向量的向量,代表该语料库中的单词。虽然word2vec不是深度神经网络,但它可以将文本转换为深度神经网络可以理解的数字形式。
CBOW
CBOW将每个单词的上下文作为输入,并尝试预测上下文对应的单词。
继续上面的例子:Have a great day
将great作为神经网络的输入,下面介绍使用单个上下文输入词great来预测目标词day。
如图所示,输入或上下文词是大小为V的one-hot编码向量;隐藏层包含N个神经元,输出也是大小为V的one-hot编码向量,元素为Softmax值。
W_{V*N}是将输入 x 映射到隐藏层层的权值矩阵
W'_{N*V}是将隐藏层输出映射到最终输出层的权重矩阵
隐藏层神经元只是将输入的加权和复制到下一层。没有像 sigmoid、tanh 或 ReLU 这样的激活。唯一的非线性是输出层中的 softmax 计算。
上诉模型使用单个上下文词来预测目标;因此使用多个上下文词来预测目标也是可行的。
上述模型采用 C 个上下文词。W_{V*N}用于计算隐藏层输入时,我们对所有这C 个上下文词输入取平均值。模型不会考虑句子中的所有单词,而只会考虑窗口中的某些单词。例如,对于等于 3 的窗口大小,我们只考虑句子中的三个单词。中间词将被预测,周围的两个词作为上下文输入神经网络。然后滑动窗口并再次重复该过程。
最后,在通过滑动上面显示的窗口 a 反复训练网络之后,我们得到了用于获取嵌入的权重。
Skip-gram
Skip-gram 模型架构通常试图实现与 CBOW 模型相反的效果。它尝试在给定目标词(中心词)的情况下预测源上下文词(周围词)。
Skip-gram通过输入一个目标中心词,得到权重矩阵后,得带词嵌入的步骤与CBOW一致。对于每个上下文位置,我们得到 V 个概率的 C 个概率分布,每个单词一个。
优化方法
为了提高速度,Word2vec经常采用以下两种加速方式:
-
Hierarchical Softmax
-
Negative Sample(负采样)
总结
优点:
-
由于 Word2vec 会考虑上下文,跟之前的 Embedding 方法相比,效果要更好(但不如 18 年之后的方法)
-
比之前的 Embedding方 法维度更少,所以速度更快
-
通用性很强,可以用在各种 NLP 任务中
缺点:
-
由于词和向量是一对一的关系,所以多义词的问题无法解决。
-
Word2vec 是一种静态的方式,虽然通用性强,但是无法针对特定任务做动态优化
Glove
虽然Word2vec在学习词与词之间的关系上比以前的方法有了很大的进步,但是也有一个很明显的缺点:只能通过窗口来利用一定量的上下文信息,即只能利用局部信息,没办法利用整个语料库的全局信息。因此,斯坦福的词嵌入模型Glove(global vector)诞生了,很明显的改进了word2vec,成功地利用了语料库的全局信息。
Glove基于单词上下文矩阵上的矩阵分解技术。构建了一个大型共现信息矩阵,通过计算每个“单词”(行),以及在大型语料库中的某些“上下文”(列)中看到这个单词的频率。通常,使用以下方式扫描语料库:对于每个术语,在由术语之前的窗口大小和术语之后的窗口大小定义的某个区域内查找上下文术语。此外,对更远的单词给予较少的权重。
对于Glove中的任意词,中心词向量和上下文词向量在数学上是等价的。