来源:Coursera吴恩达深度学习课程
上篇文章学习词嵌入中我们已经见到了如何学习一个神经语言模型来得到更好的词嵌入,在这篇文章将会见到 Word2Vec算法,这是一种简单而且计算时更加高效的方式来学习这种类型的嵌入,让我们来看看。
本视频中的大多数的想法来源于幻灯片下方的这篇论文:Efficient Estimation of Word Representations in Vector Space。
如上图,假设在训练集中给定了一个这样的句子:“I want a glass of orange juice to go along with my cereal.”,在Skip-Gram模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题。上下文不一定总是目标单词之前离得最近的四个单词,或最近的n个单词。我们要的做的是随机选一个词作为上下文词(context),比如选orange,然后随机在一定词距内选另一个词,比如在上下文词前后5个词内或者10个词内,我们就在这个范围内选择目标词。可能你正好选到了juice作为目标词,正好是下一个词(表示orange的下一个词),也有可能你选到了前面第二个词,所以另一种配对目标词可以是glass,还可能正好选到了单词my作为目标词。
于是我们将构造一个监督学习问题,它给定上下文词,要求你预测在这个词正负10个词距或者正负5个词距内随机选择的某个目标词。显然,这不是个非常简单的学习问题,因为在单词orange的正负10个词距之间,可能会有很多不同的单词。但是构造这个监督学习问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型。
接下来说说模型的细节(details)。
假设使用一个10,000词的词汇表,我们要解决的基本的监督学习问题是学习一种映射关系,从上下文c,比如单词orange,到某个目标词t,可能是单词juice或者单词glass或者单词my。在我们的词汇表中,orange是第6257个单词,juice是10,000个单词中的第4834个,这就是我们想要的映射到输出y的输入x。
回忆之前的表示方式,对上下文词而言,将嵌入矩阵E乘以one-hot向量O_c,得到嵌入向量e_c,表达式为:
在这个神经网络中,把向量e_c喂给一个softmax单元,Andrew通常把softmax单元画成神经网络中的一个节点(node),softmax单元要做的就是输出y帽。这是softmax模型,预测不同目标词的概率:
这是常用的softmax损失函数,y是one-hot向量,如果目标词是juice,那么第4834个元素就是1,其余是0。类似的y帽是一个从softmax单元输出的10,000维的向量,这个向量是所有可能目标词的概率(probabilities)。
总结一下(上图绿色标记),这大体上就是一个可以找到词嵌入的简化模型和神经网络,其实就是个softmax单元。矩阵E将会有很多参数,所以矩阵E有对应所有嵌入向量e_c的参数,softmax单元也有θ_t的参数。如果优化这个关于所有这些参数的损失函数,会得到一个较好的嵌入向量集,这个就叫做Skip-Gram模型。它把一个像orange这样的词作为输入,并预测这个输入词,从左数或从右数的某个词,预测上下文词的前面一些或者后面一些是什么词。
实际上使用这个算法会遇到一些问题,首要的问题就是计算速度(computational speed)。
如上图所示,尤其是在softmax模型中,每次你想要计算这个概率,你需要对你词汇表中的所有10,000个词做求和计算,可能10,000个词的情况还不算太差。如果你用了一个大小为100,000或1,000,000的词汇表,那么这个分母的求和操作是相当慢的,实际上10,000已经是相当慢的了,所以扩大词汇表就更加困难了。
这里有一些解决方案,在一些文献中你会看到如分级(hierarchical)的softmax分类器和负采样(Negative Sampling)。
接着思考怎么对上下文c进行采样(sample),一旦你对上下文c进行采样,那么目标词t就会在上下文c的正负10个词距内进行采样。但是你要如何选择上下文c?一种选择是你可以就对语料库均匀且随机地采样,如果你那么做,你会发现有一些词,像the、of、a、and、to诸如此类是出现得相当频繁的,于是你那么做的话,你会发现你的上下文到目标词的映射会相当频繁地得到这些种类的词,但是其他词,像orange、apple或durian就不会那么频繁地出现了。你可能不会想要你的训练集都是这些出现得很频繁的词,因为这会导致你花大部分的力气来更新这些频繁出现的单词的e_c,但你想要的是花时间来更新像durian这些更少出现的词的嵌入,即e_durian。实际上词p(c)的分布并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的分级来平衡更常见的词和不那么常见的词。
这就是Word2Vec的Skip-Gram模型,如果你读过我之前提到的论文原文,你会发现那篇论文实际上有两个不同版本的Word2Vec模型,Skip-Gram只是其中的一个,另一个叫做CBOW,即连续词袋模型(Continuous Bag-Of-Words Model)。
总结下:CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。而刚才讲的Skip-Gram模型,关键问题在于softmax这个步骤的计算成本非常昂贵,因为它需要在分母里对词汇表中所有词求和。通常情况下,Skip-Gram模型用到更多点。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。