cs244n笔记(二)

复习skip-gram


如上图公式,给定中心词Vc(就是上图的into),分母是一个恒定的总和。现在的问题是如何得到v向量和u向量,已知一个非常大的矩阵,这个矩阵根据不同的词对应着不同的词向量。这个矩阵包含了所有的中心词向量,从语料库的第一个窗口开始取出第一个词向量,代入上图的式子,然后最大化这个概率式值,然后为了所有这些不同的词取词向量,下一步是计算中心词(into)和其他词的概率。一开始所有数字和向量的初始状态都是随机的,这些小随机数(两个较小的数字之间均匀采样得到的)。如何增加概率值的方法?求这些向量的导数,接着使用随机梯度下降法来求出每个窗口的梯度。因为所有的向量都不相同,那么得到的梯度更新会具有非常稀疏。由于目标函数是非凸的(就是会有局部最优解),如何避免陷入局部最优,有事实表明初始化非常重要,用小随机数初始化尤其对于词向量,使用SGD,当在语料库中移动窗口时,我们会在每个窗口更新损失函数实现梯度更新。这个向量的所有数字元素分布在0附近,大量的梯度更新很快会耗尽内存,所以相比于做稀疏矩阵的运算,只需要更新特定的列就可以了。或者你把它作为一个哈希(散列)来实现,通过键值对来更新,值就是这些向量而键则是字串。在每个窗口都需要遍历一次完整的语料库,对每个窗口都要进行相同的计算,同样需要求巨大的和,并且这个求和需要遍历整个词汇表。当你的词汇表很大的时候,需要做大量的内积运算。

所以我们要对skip-gram做一些小的技巧,我们只对可以配对的训练一些二元逻辑回归。因此我们保留了想要优化和最大化中心词和外围词的内积的想法。相对于遍历所有单词,实际上只取一些随机单词并指明,这些从语料库其余部分取出的随机是不同时出现的。这就是我们常用的软件包word2vec。我们这儿有两项,第一项是中心词和外围词同时出现概率的对数,sigmoid函数仅仅是把任意实数值压缩到0到1之间,我们也称为概率。我们将从语料库中随机抽取n个单词,对每一个单词我们会尽量较少它们同时出现的概率。我们对语料库中抽取随机单词的方法是重采样,而不是遍历所有不同的单词。我们仅取出5个、10个或者其他数目的随机词,然后最小化它们的概率。目标函数的第二部分需要评估重要性的参数。为每个窗口取k个负样本,然后最小化这些随机词出现在中心词附近的概率,接着从简单的均匀分布或一元模型分布中采样获取观测这些词大致出现的频率,然后基于频率去采样。但是我们也取其指数为3/4的值,这是一种简单的方法,使用过一段时间模型后,需要采样一些稀有的词,不然经常采样the和A以及其他的停用词。


每经过一个窗口,更新一次梯度,先走过5个窗口收集好的梯度更新,然后再对SGD的小批量数据进行进一步的操作。在模型中$\theta$通常作为一个用于所有变量的参数,在skipgram中基本就是所有的u向量和v向量。当我们调用$\theta$,J是我们的损失函数,T是在遍历语料库的第T个时间步或者叫第T个窗口,我们优化的整体目标函数实际上这些目标函数的总和。我们要做的是最大化真实发生的事件的概率,最小化随机发生的事件的概率和最小化我们的损失函数。

我们想通过中心词周围的词来预测中心词,这个处理其实比较简单,对外围词的词向量加起来得到这些向量的和,然后于内部向量得到内积。词向量会发生某类神奇的事情,它们实际上开始聚类,我们可以观察到单词出现在相似的语境中通常含有不同的意思。在我们获得了足够数量的集合后,训练这个模型后,可以得到相似的向量。word2vec会遍历语料库中的每个单词,观察窗口中周围的词,预测周围的词,我们会对词的共同点,这个词和其他词共同词共同出现的频率是多少,每出现一次进行一次计数,看到一组词汇同时出现就对两个向量梯度更新,然后再次浏览语料库,再次更新梯度。我们能捕获的是整个计数而不是一个样本,word2vec的方法是在每个单词周围使用了一个窗口,这基本上相当于遍历了整个语料库,我们不对任何部分进行梯度更新,不使用SGD。首先对计数结果进行采集,一旦获得了计数结果就对矩阵进行操作,窗口的长度可能会是2个词的句法信息。我们将要抓取的不仅是语义,还有每个词的句法信息,即哪一种词性标签。另一方面,观测共同出现的计数,结果不仅在窗口周围,而是整个文档的。这样会捕捉到更多的话题,这通常被称为潜在语义分析,忽略掉词性和句法信息,基本上都是话题。


上图是一个小的语料库,我们会收集这些窗口,然后从这些窗口中计算出词向量,评估词于词之间的距离(通常是欧式距离而不是余弦距离)。上图的矩阵我们有个名称叫共现矩阵,假设我们有个小语料库,有个对称的窗口,设置了窗口为1,并且不在意在中心词的左边还是右边,用这个窗口观察完整个语料库后,遍历语料库中的所有单词并且计算所有单词的次数就形成了上图这个矩阵。

你可能感兴趣的:(cs244n笔记(二))