1、介绍
事实证明,在每一个NLP任务中,密集向量都比稀疏向量工作得更好。虽然我们不能完全理解其中的所有原因,但我们有一些直觉。首先,密集向量可以更成功地作为特征包含在机器学习系统中;例如,如果我们使用100维词嵌入作为特征,分类器只需要学习100个权重来表示一个词的含义函数;如果我们使用一个50,000维的向量,分类器将不得不为每个稀疏维学习数万个权重。第二,因为它们比显式计数的稀疏向量包含更少的参数,密集向量可以更好地泛化,并有助于避免过拟合。最后,密集向量可能比稀疏向量在捕获同义词方面做得更好。例如,car和automobile是同义词;但在典型的稀疏向量表示中,汽车维和汽车维是不同的维。因为这两个维度之间的关系没有建模,所以稀疏向量可能无法捕获以car为邻居的单词和以automobile为邻居的单词之间的相似性。
在本节中,我们将介绍一种处理非常密集的短向量的方法,即skip- gram with negative sampling,有时称为SGNS。skip-gram算法是一个名为word2vec的软件包中的两种算法之一,因此有时该算法被松散地称为word2vec 。word2vec方法快速、有效地训练,并且易于在线使用代码和预训练的嵌入。我们在本章的最后指出了其他嵌入方法,如同样流行的GloVe。
word2vec的可以认为是,我们不是计算每个单词w出现在杏子附近的频率,而是训练一个分类器进行二元预测任务:“单词w可能出现在杏子附近吗?”我们并不关心这个预测任务;相反,我们将使用学习到的分类器权重作为词嵌入,这一想法最初是在神经语言建模任务中提出的,Bengio等人(2003)和Collobert等人(2011)表明,神经语言模型(学习从先前的单词中预测下一个单词的神经网络)可以使用运行文本中的下一个单词作为其监督信号,并且可以用来学习每个单词的嵌入表示,作为完成该预测任务的一部分。
我们将在下一章看到如何做神经网络,但word2vec是一个比神经网络语言模型简单得多的模型,有两个方面。首先,word2vec简化了任务(使其成为二进制分类而不是单词预测)。其次,word2vec简化了架构(训练逻辑回归分类器,而不是需要更复杂训练算法的隐藏层的多层神经网络)。skip-gram的直观理解是:
1. 把目标词和邻近的上下文词作为正样本
2. 随机抽取词典中的其他单词,得到负样本
3.使用逻辑回归训练分类器来区分这两种情况
4. 使用回归权重作为词嵌入向量
2、分类器
让我们从考虑分类任务开始,然后转向如何训练。想象一下这样一个句子,目标词是apricot ,假设我们使用了±2个上下文词的窗口:
我们的目标是训练一个分类器,给定目标词t的元组(t,c)与候选上下文词c配对(例如(apricot,jam),或者 (apricot, aardvark)),它将返回c是真实上下文单词的概率(true for jam, fase for aardvark)。
分类器如何计算概率P?skip-gram模型的直觉是基于相似度的概率:如果一个词的嵌入与目标嵌入相似,那么它很可能出现在目标附近。我们如何计算嵌入之间的相似度?回想一下,如果两个向量有很高的点积,它们就是相似的(余弦,最流行的相似性度量,只是一个标准化的点积)。换句话说:
如上,前面的t*c得到的是俩向量相乘,他的取值范围是负无穷-正无穷,为了得到概率,仍旧需要sigmoid进行压缩。
Word2vec通过从一组初始嵌入向量开始学习嵌入,然后迭代地移动每个单词w的嵌入,使其更像文本中附近出现的单词的嵌入,而不像附近出现的单词的嵌入。
这个例子有一个目标词t(apricot),在L =±2窗口中有4个上下文词,产生4个积极的训练实例(如下图所示):
为了训练二值分类器,我们还需要负例。事实上,skip- gram使用的负样例比正样例更多(它们之间的比率由参数k设置)。因此,对于每一个(t,c)训练实例,我们将创建k个负样例,每个负样例由目标t加上一个“噪声词”组成。噪声词是来自词典的随机词,被约束为不是目标词t。右图显示了k = 2的设置,因此我们将在负训练集中有2个负样例-对于每个正样例t,c。