CS224n-Lecture2-Word Vectors 2 and Word Senses
写在前面
就是自己的课程笔记而已。我看的其实是2020版的ppt和2019的视频,因为实在是啃不动全英文的视频。另外复制图片太麻烦了,于是用的富文本编辑器。
文档作业相关内容推荐:https://github.com/xixiaoyao/CS224n-winter-together
综述
Lecture 2: Word Vectors and Word Senses
1. Finish looking at word vectors and word2vec (10 mins) 完成词向量和word2vec学习
2. Optimization basics (8 mins) 优化器基础
3. Can we capture this essence more effectively by counting? (12m) 通过计数更有效的抓住本质?
4. The GloVe model of word vectors (10 min) GloVe模型
5. Evaluating word vectors (12 mins) 评估词向量
6. Word senses (6 mins) 词义
7. Review of classification and how neural nets differ (10 mins) 复习分类和神经网络差异
8. Course advice (2 mins) 课堂建议
目标:课堂结束就会读word embedding相关论文了。
正文
第一部分 再复习下word2vec
对一个中心词,与窗口内的context词出现的概率:
通过极大似然方法最大化整个文本出现的概率:
损失函数:
假设vocabulary包含m个词,每个词向量长度为n, 对于每一个词,作为中心词(center)和非中心词(outside)时分别使用v和u两个向量表示。在计算完成后将两个向量平均作为最终词向量表示。
对每一个词作为中心词时,计算概率分布。这里假定第4个词作为中心词时,有
其中,d为与m个outside词的点积,由于两个向量的点乘可以表示其相似度,进一步可用于表示其出现的概率大小,从而得到概率表示:
这里原理就很明显了,我们接下来需要做的,就是通过优化问题来更新矩阵U和V,从而使词向量模型需对出现在同一个context中的词赋予较大的概率。
第二部分 再再复习一下梯度下降
SGD(Stochastic Gradient Descent 随机梯度下降)
和梯度下降很相似,只是损失只和窗口内容对应的参数有关,大大减少了计算量,比如我原本每次都次都要更新整个词汇表的每个词的向量,现在只和窗口内有关的词向量进行更新即可。
第三部分 共现矩阵表示词向量
两种形式:windows vs. full document
以window大小为1(只考虑前后一次的共现),且不区分上下文关系为例:
缺点很明显:维度过大,向量稀疏。
于是衍生出如何将共现矩阵降维从而使其可用性高一些。
奇异值分解,用于降低维度,使用U
对计数进行额外处理,用于提高词向量特征的有效性
1.忽略频繁词或者设置最大频数
2.倾斜窗口(个人理解是上下文不同位置不同权重)
3.只计算有关词汇,无关词汇不统计
第四部分 基于计数和直接预测对比 GloVe介绍
统计的方式 |
预测的方式 |
更快的训练 |
受限于词汇表大小,指训练过程 |
高效利用统计数据 |
统计数据使用率低 |
主要用于捕获单词相似度 |
其他任务上表现较好 |
频繁词影响较大 |
可以捕获单词相似度以外的复杂模式 |
glove核心思想
在单词向量空间中捕获共现概率的比率作为线性含义成分可以使如下式子成立,第一个式子为前提,后一个式子为推导,所以我们要做的就是使一式尽可能有效。
于是得到如下的损失函数(两个b是额外添加的仅仅是为了提高泛化能力,比如两个相同概率的词真的要得到完全一致的向量么?):
第五部分 如何验证词向量的有效性
内在评价
对特定/中间子任务评估,并且计算快速,能够帮助理解语言系统。
但是除非与实际任务关联其实很难知晓是否真的有帮助。
方法:
词类比(向量加减,但是不是线性的会存在问题)
词相似度:
外在评价
在真实任务上评估,可能需要比较长的时间才能得到结果。
不清楚子系统是问题所在还是关键所在,如果替换了一个子系统能够提高准确率说明是有效的。
方法:所有的后续任务,比如命名实体识别等(下节课主要讲词向量的应用。)
第六部分 歧义词
上文所述我们真的可以用一个向量表示一个词的所有含义么。
两篇相关的研究(我准备放弃看这部分,因为确实不是重点内容,仅仅是提及了下)
每个单词都会根据周围词分配到多个集群中。
词向量通过多个含义对应的词向量和权重进行计算得来。(不还是一个向量么?)
第七部分 分类的复习(review)和注解
简单的介绍了分类模型的核心思想,由X、Y组成,X为输入,Y为标签。
介绍了下softmax如何做分类的,计算然后取最大值。并且使用softmax做分类的话,使用交叉熵作为损失函数。
第八部分 The course A note on your experience (类似课程建议)
建议放弃,老师是无法关心到非官方的学生的。
扩展部分一 Hierarchical Softmax或Negative Sampling
参考资料:https://www.hankcs.com/nlp/word2vec.html
Word2vec模型其实就是简单化的神经网络。但是这个神经网络的学习不是为了准确的预估正确的中心词/周围词,而是为了得到 word——>vector 这个映射关系。其具体分解如下:
构建数据:用原始数据构建单词对,单词形式如下 [input word, out word],即[data x, label y]。
输入层: 将所有词语进行one-hot编码作为输入,输入的是n维向量(n是词表单词个数)
隐藏层:中间是只有一个隐藏层 (没有**函数,只是线性的单元)。隐藏层实际上存储了词汇表中所有单词的word vectors。这是一个尺寸为 [vocabulary size x embedding size] 的矩阵。矩阵的每一行对应了某一个单词的word vector。
输出层:输出的也是独热向量。Output Layer维度跟Input Layer的维度一样,各维的值相加为1。用的是Softmax回归。softmax保证输出的向量是一个概率分布。一旦转换为概率之后,我们就可以用到最大似然估计(交叉熵)的方式来求得最大似然或者最小交叉熵。
定义loss损失函数:用来预测正确输出/优化模型。我们的 label y 值是一个概率分布,输出层经过softmax处理后,也是一个概率分布,这样就可以用交叉熵来衡量神经网络的输出与我们的 label y 的差异大小,也就可以定义出loss了。
迭代训练: 采用梯度下降算法,每次迭代比较 prediction 和 label y 之间的loss,然后相应优化,最终确保类似的单词有类似的向量。
最终矩阵:丢去output层,只用隐藏层的输出单元(就是Input Layer和Hidden Layer之间的权重),构成了Look up table。
这两个矩阵W都含有V个词向量,也就是说同一个词有两个词向量,我们使用两种策略将其组合形成一个词向量,加起或者拼接,但是为了保证维度,所以一般都是使用加的策略或者直接使用W矩阵。当然直接使用W也是可行的。
那么原始的计算复杂度为(N为输入大小,D暂时可以理解成one-hot大小即V大小,取决于投影方式,H为隐藏层大小,V是词汇表大小):
但是后来,因为hidden layer计算不够快,即N*D*H太慢了,于是直接被砍没了。模型被优化成下图的形式,此时输入已经是D的随机词向量,没错,你没有听错。我们原本输入是个one-hot,投影矩阵W是v*n大小,得到的结果是1*n的向量这些部分全部合在了一起,随机产生一个D维大小的词向量,然后直接进行简单计算,误差就像更新权重矩阵一样直接更新对应的词向量即可。鬼才啊。
Hierarchical Softmax
核心思想是将softmax多分类改成多个二分类任务,形成二叉树。
当然图中展示的都是平衡二叉树,实际上上述优化更普遍的是使用哈夫曼树来构建每个单词的编码。
哈夫曼树
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
于是对应编码为
CBOW优化后:
Skip-gram优化后:C是单词的最大距离,因为他是预测多个词的嘛
我用CBOW为例只是因为好讲一些。
Negative Sampling
将输出层的V个样本分为正例(Positive Sample)也就是目标词对应的项,以及剩余V−1个负例(Negative Samples)。举个例子有个样本zhang zhi,这样wI=zhang,wO=zhi, 正例就是zhi这个词,负例就是不太可能与zhang共同出现的词。
负采样的思想是每次训练只随机取一小部分的负例使他们的概率最小,以及对应的正例概率最大。随机采样需要假定一个概率分布,word2vec中直接使用词频作为词的分布,不同的是频数上乘上0.75,相比于直接使用频次作为权重,取0.75幂的好处可以减弱不同频次差异过大带来的影响,使得小频次的单词被采样的概率变大。
扩展部分二 GloVe
参考资料:http://www.fanyeong.com/2018/02/19/glove-in-detail/
简介
GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具,它可以把一个单词表达成一个由实数组成的向量,这些向量捕捉到了单词之间一些语义特性,比如相似性(similarity)、类比性(analogy)等。我们通过对向量的运算,比如欧几里得距离或者cosine相似度,可以计算出两个单词之间的语义相似性。
原理
考虑以下示例
我们可以使用它观察出两个单词i和j相对于单词k哪个更相关(relevant)。
如果只看前两行,比如,ice和solid较为相关,而stream和solid不相关,ice和gas不相关,而stream和gas较相关,ice、steam与water都比较相关,但是与fashion都比较不相关
此时再看第三行,比值如果远大于1,这意味k与ice相关性高,比值远小于1,意味着k与steam相关性更高,但是如果比值为1,我们很难确定k与所选词是否有相关性。因此,以上推断可以说明通过概率的比例而不是概率本身去学习词向量可能是一个更恰当的方法。(排除均相关或均不相关的噪声干扰,只考虑能够区分词特征的相关词)
实现
- 根据语料库(corpus)构建一个共现矩阵(Co-ocurrence Matrix)X(,矩阵中的每一个元素Xij代表单词i和上下文单词j在特定大小的上下文窗口(context window)内共同出现的次数。一般而言,这个次数的最小单位是1,但是GloVe不这么认为:它根据两个单词在上下文窗口的距离d,提出了一个衰减函数(decreasing weighting):decay=1/d用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小。
- 构建词向量(Word Vector)和共现矩阵(Co-ocurrence Matrix)之间的近似关系,论文的作者提出以下的公式可以近似地表达两者之间的关系:
其中,wi和~wj是我们最终要求解的词向量;bi和~bj分别是两个词向量的bias term。
- 有了上式之后我们就可以构造它的loss function了:
这个loss function的基本形式就是最简单的mean square loss(均方误差),只不过在此基础上加了一个权重函数f(Xij),我们知道在一个语料库中,肯定存在很多单词他们在一起出现的次数是很多的(frequent co-occurrences),所以希望权重函数满足以下条件:
- 1.这些单词的权重要大于那些很少在一起出现的单词(rare co-occurrences),所以这个函数要是非递减函数(non-decreasing);
- 2.但我们也不希望这个权重过大(overweighted),当到达一定程度之后应该不再增加;
- 3.如果两个单词没有在一起出现,也就是Xij=0,那么他们应该不参与到loss function的计算当中去,也就是f(x)要满足f(0)=0
满足以上两个条件的函数有很多,作者采用了如下形式的分段函数,实验中α的取值都是0.75,而Xmax取值都是100:
这个函数图像如下所示:
虽然很多人声称GloVe是一种无监督(unsupervised learing)的学习方式(因为它确实不需要人工标注label),但其实它还是有label的,这个label就是公式2中的log(Xij),而公式2中的向量w和~w就是要不断更新/学习的参数,所以本质上它的训练方式跟监督学习的训练方法没什么不一样,都是基于梯度下降的。具体地,这篇论文里的实验是这么做的:采用了AdaGrad的梯度下降算法,对矩阵X中的所有非零元素进行随机采样,学习曲率(learning rate)设为0.05,在vector size小于300的情况下迭代了50次,其他大小的vectors上迭代了100次,直至收敛。最终学习得到的是两个vector是w和~w,因为X是对称的(symmetric),所以从原理上讲w和~w是也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,我们最终会选择两者之和w+~w作为最终的vector(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。
模型复杂度
这个不重要,而是式子还多就不讲了。
补充
对称性,即保证i=k,k=i时等式仍然成立。
扩展部分三 交叉熵
公式在此,如何求导再说吧,反向传播过程不负责哦,先声明啊。
扩展部分四 扩展阅读文献
这个不讲了,讲了人就没了。