介绍词向量word2evc概念,及CBOW和Skip-gram的算法实现( 二 )


2.如何让向量具有语义信息
得到每个单词的向量表示后 , 我们需要思考下一个问题:比如在多数情况下 , “香蕉”和“橘子”更加相似 , 而“香蕉”和“句子”就没有那么相似;同时 , “香蕉”和“食物”、“水果”的相似程度可能介于“橘子”和“句子”之间 。 那么如何让存储的词向量具备这样的语义信息呢?
我们先学习自然语言处理领域的一个小技巧 。 在自然语言处理研究中 , 科研人员通常有一个共识:使用一个单词的上下文来了解这个单词的语义 , 比如:“苹果手机质量不错 , 就是价格有点贵 。 ”“这个苹果很好吃 , 非常脆 。 ”“菠萝质量也还行 , 但是不如苹果支持的APP多 。 ”在上面的句子中 , 我们通过上下文可以推断出第一个“苹果”指的是苹果手机 , 第二个“苹果”指的是水果苹果 , 而第三个“菠萝”指的应该也是一个手机 。 事实上 , 在自然语言处理领域 , 使用上下文描述一个词语或者元素的语义是一个常见且有效的做法 。 我们可以使用同样的方式训练词向量 , 让这些词向量具备表示语义信息的能力 。
2013年 , Mikolov提出的经典word2vec算法就是通过上下文来学习语义信息 。 word2vec包含两个经典模型:CBOW(ContinuousBag-of-Words)和Skip-gram , 如图4所示 。 CBOW:通过上下文的词向量推理中心词 。 Skip-gram:根据中心词推理上下文 。
介绍词向量word2evc概念,及CBOW和Skip-gram的算法实现
文章图片
假设有一个句子“Pineapplesarespikedandyellow” , 两个模型的推理方式如下:在CBOW中 , 先在句子中选定一个中心词 , 并把其它词作为这个中心词的上下文 。 如图4CBOW所示 , 把“spiked”作为中心词 , 把“Pineapples、are、and、yellow”作为中心词的上下文 。 在学习过程中 , 使用上下文的词向量推理中心词 , 这样中心词的语义就被传递到上下文的词向量中 , 如“spiked→pineapple” , 从而达到学习语义信息的目的 。 在Skip-gram中 , 同样先选定一个中心词 , 并把其他词作为这个中心词的上下文 。 如图4Skip-gram所示 , 把“spiked”作为中心词 , 把“Pineapples、are、and、yellow”作为中心词的上下文 。 不同的是 , 在学习过程中 , 使用中心词的词向量去推理上下文 , 这样上下文定义的语义被传入中心词的表示中 , 如“pineapple→spiked” , 从而达到学习语义信息的目的 。
说明:
一般来说 , CBOW比Skip-gram训练速度快 , 训练过程更加稳定 , 原因是CBOW使用上下文average的方式进行训练 , 每个训练step会见到更多样本 。 而在生僻字(出现频率低的字)处理上 , skip-gram比CBOW效果更好 , 原因是skip-gram不会刻意回避生僻字 。
2.1CBOW和Skip-gram的算法实现
我们以这句话:“Pineapplesarespikedandyellow”为例分别介绍CBOW和Skip-gram的算法实现 。
如图5所示 , CBOW是一个具有3层结构的神经网络 , 分别是:
介绍词向量word2evc概念,及CBOW和Skip-gram的算法实现
文章图片
输入层:一个形状为C×V的one-hot张量 , 其中C代表上线文中词的个数 , 通常是一个偶数 , 我们假设为4;V表示词表大小 , 我们假设为5000 , 该张量的每一行都是一个上下文词的one-hot向量表示 , 比如“Pineapples,are,and,yellow” 。 隐藏层:一个形状为V×N的参数张量W1 , 一般称为word-embedding , N表示每个词的词向量长度 , 我们假设为128 。 输入张量和wordembeddingW1进行矩阵乘法 , 就会得到一个形状为C×N的张量 。 综合考虑上下文中所有词的信息去推理中心词 , 因此将上下文中C个词相加得一个1×N的向量 , 是整个上下文的一个隐含表示 。 输出层:创建另一个形状为N×V的参数张量 , 将隐藏层得到的1×N的向量乘以该N×V的参数张量 , 得到了一个形状为1×V的向量 。 最终 , 1×V的向量代表了使用上下文去推理中心词 , 每个候选词的打分 , 再经过softmax函数的归一化 , 即得到了对中心词的推理概率: