2.8 GloVe词向量-深度学习第五课《序列模型》-Stanford吴恩达教授
Glove 词向量 (GloVe Word Vectors)
你已经了解了几个计算词嵌入的算法,另一个在NLP社区有着一定势头的算法是GloVe算法,这个算法并不如Word2Vec或是Skip-Gram模型用的多,但是也有人热衷于它,我认为可能是因为它简便吧,我们来看看这个算法。
Glove算法是由Jeffrey Pennington,Richard Socher和Chris Manning发明的。
(Pennington J, Socher R, Manning C. Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014:1532-1543.)
GloVe代表用词表示的全局变量(global vectors for word representation)。在此之前,我们曾通过挑选语料库中位置相近的两个词,列举出词对,即上下文和目标词,GloVe算法做的就是使其关系开始明确化。假定 是单词 在单词 上下文中出现的次数,那么这里 和 就和 和 的功能一样,所以你可以认为 等同于 。你也可以遍历你的训练集,然后数出单词 在不同单词 上下文中出现的个数,单词 在不同单词 的上下文中共出现多少次。根据上下文和目标词的定义,你大概会得出 等于 这个结论。事实上,如果你将上下文和目标词的范围定义为出现于左右各10词以内的话,那么就会有一种对称关系。如果你对上下文的选择是,上下文总是目标词前一个单词的话,那么 和 就不会像这样对称了。不过对于GloVe算法,我们可以定义上下文和目标词为任意两个位置相近的单词,假设是左右各10词的距离,那么 就是一个能够获取单词 和单词 出现位置相近时或是彼此接近的频率的计数器。
GloVe模型做的就是进行优化,我们将他们之间的差距进行最小化处理:
其中 ,想一下 和 与 和 的功能一样,因此这就和你之前看的有些类似了,即 。同时对于这个( ,下图编号1所示)来说,你想要知道的是告诉你这两个单词之间有多少联系, 和 之间有多紧密, 和 之间联系程度如何,换句话说就是他们同时出现的频率是多少,这是由这个 影响的。然后,我们要做的是解决参数 和 的问题,然后准备用梯度下降来最小化上面的公式,你只想要学习一些向量,这样他们的输出能够对这两个单词同时出现的频率进行良好的预测。
现在一些附加的细节是如果 是等于0的话,那么 就是未定义的,是负无穷大的,所以我们想要对 为0时进行求和,因此要做的就是添加一个额外的加权项 (上图编号2所示)。如果 等于0的话,同时我们会用一个约定,即 ,这个的意思是如果 ,先不要进行求和,所以这个 项就是不相关项。上面的求和公式表明,这个和仅是一个上下文和目标词关系里连续出现至少一次的词对的和。 的另一个作用是,有些词在英语里出现十分频繁,比如说this,is,of,a等等,有些情况,这叫做停止词,但是在频繁词和不常用词之间也会有一个连续统(continuum)。不过也有一些不常用的词,比如durion,你还是想将其考虑在内,但又不像那些常用词这样频繁。因此,这个加权因子 就可以是一个函数,即使是像durion这样不常用的词,它也能给予大量有意义的运算,同时也能够给像this,is,of,a这样在英语里出现更频繁的词更大但不至于过分的权重。因此有一些对加权函数f的选择有着启发性的原则,就是既不给这些词(this,is,of,a)过分的权重,也不给这些不常用词(durion)太小的权值。如果你想要知道 是怎么能够启发性地完成这个功能的话,你可以看一下我之前的幻灯片里引用的GloVe算法论文。
最后,一件有关这个算法有趣的事是 和 现在是完全对称的,所以那里的 和 就是对称的。如果你只看数学式的话,他们( 和 )的功能其实很相近,你可以将它们颠倒或者将它们进行排序,实际上他们都输出了最佳结果。因此一种训练算法的方法是一致地初始化 和 ,然后使用梯度下降来最小化输出,当每个词都处理完之后取平均值,所以,给定一个词 ,你就会有 。因为 和 在这个特定的公式里是对称的,而不像之前视频里我们了解的模型, 和 功能不一样,因此也不能像那样取平均。
这就是GloVe算法的内容,我认为这个算法的一个疑惑之处是如果你看着这个等式,它实在是太简单了,对吧?仅仅是最小化,像这样的一个二次代价函数(上图编号3所示)是怎么能够让你学习有意义的词嵌入的呢?但是结果证明它确实有效,发明者们发明这个算法的过程是他们以历史上更为复杂的算法,像是newer language模型,以及之后的Word2Vec、Skip-Gram模型等等为基础,同时希望能够简化所有之前的算法才发明的。
在我们总结词嵌入学习算法之前,有一件更优先的事,我们会简单讨论一下。就是说,我们以这个特制的表格作为例子来开始学习词向量,我们说,第一行的嵌入向量是来表示Gender的,第二行是来表示Royal的,然后是是Age,在之后是Food等等。但是当你在使用我们了解过的算法的一种来学习一个词嵌入时,例如我们之前的幻灯片里提到的GloVe算法,会发生一件事就是你不能保证嵌入向量的独立组成部分是能够理解的,为什么呢?
假设说有个空间,里面的第一个轴(上图编号1所示)是Gender,第二个轴(上图编号2所示)是Royal,你能够保证的是第一个嵌入向量对应的轴(上图编号3所示)是和这个轴(上面提到的第一和第二基轴,编号1,2所示)有联系的,它的意思可能是Gender、Royal、Age和Food。具体而言,这个学习算法会选择这个(上图编号3所示)作为第一维的轴,所以给定一些上下文词,第一维可能是这个轴(上图编号3所示),第二维也许是这个(上图编号4所示),或者它可能不是正交的,它也可能是第二个非正交轴(上图编号5所示),它可以是你学习到的词嵌入中的第二部分。当我们看到这个(上图编号6所示)的时候,如果有某个可逆矩阵 ,那么这项(上图编号6所示)就可以简单地替换成 ,因为我们将其展开:
不必担心,如果你没有学过线性代数的话会,和这个算法一样有一个简单证明过程。你不能保证这些用来表示特征的轴能够等同于人类可能简单理解的轴,具体而言,第一个特征可能是个Gender、Roya、Age、Food Cost和Size的组合,它也许是名词或是一个行为动词和其他所有特征的组合,所以很难看出独立组成部分,即这个嵌入矩阵的单行部分,然后解释出它的意思。尽管有这种类型的线性变换,这个平行四边形映射也说明了我们解决了这个问题,当你在类比其他问题时,这个方法也是行得通的。因此尽管存在特征量潜在的任意线性变换,你最终还是能学习出解决类似问题的平行四边形映射。
这就是词嵌入学习的内容,你现在已经了解了一些学习词嵌入的算法了,你可以在本周的编程练习里更多地运用它们。下节课讲解怎样使用这些算法来解决情感分类问题。