CS224n课堂笔记2-词的向量表示:word2vec
预感lecture2会学很久,不会的东西太多了,emmm………..
课程大纲
1. 词义
2. Word2vec介绍
3. Word2vec目标函数梯度
4. 优化复习
1. 词义
1.1 计算机如何处理词语的意思
过去几个世纪里一直用的是分类词典。计算语言学中常见的方式是WordNet那样的词库。比如NLTK中可以通过WordNet查询熊猫的hypernyms (is-a,上位词),得到“食肉动物”“动物”之类的上位词。也可以查询“good”的同义词——“just品格好”“ripe熟了”。
这种离散表示存在的问题
- 作为一种资源很好但缺少细微差别,例如,同义词:adept,expert,good,practiced, proficient, skillful?
- 缺少新词(不可能保持最新):wicked,badass,nifty,*****,ace,wizard, genius,ninja
- 主观
- 需要人工来创造和适应
- 难以计算准确的单词相似度
1.2 one-hot representation
绝大多数基于规则和统计的NLP工作都将单词视为原子符号:hotel,conference,walk
在向量空间术语中,这是一个带有1和大量零的向量[0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
维度:20K(语音)-50K(PTB)-500K(大词汇)-13M(谷歌1T)
我们称之为词的one-hot representation
词语在符号表示上体现不出意义的相似性,比如Dell notebook battery size和Dell laptop battery capacity。而one-hot向量是正交的,无法通过任何运算得到相似度。
one-hot representation相当于给每个词分配一个id,这就导致这种表示方式不能展示词与词之间的关系。另外,one-hot representation将会导致特征空间非常大,但也带来一个好处,就是在高维空间中,很多应用任务线性可分。
1.3 Distributed Representation
通过调整一个单词及其上下文单词的向量,使得根据两个向量可以推测两个词语的相似度;或根据向量可以预测词语的上下文。这种手法也是递归的,根据向量来调整向量,与词典中意项的定义相似。
word embedding指的是将词转化成一种分布式表示,又称词向量。分布
式表示将词表示成一个定长的连续的稠密向量。
分布式表示优点:
(1)词之间存在相似关系:
是词之间存在“距离”概念,这对很多自然语言处理的任务非常有帮助。
(2)包含更多信息:
词向量能够包含更多信息,并且每一维都有特定的含义。在采用one-hot特征时,可以对特征向量进行删减,词向量则不能。
学习神经网络词嵌入的基本思想
我们定义了一个模型,旨在根据单词向量预测中心单词w的上下文单词
p(context | w) =…
它有一个损失函数:J=1−p(w | w )
这里的w表示w的上下文(负号通常表示除了某某之外),如果完美预测,损失函数为零。然后在一个大型语料库中的不同位置得到训练实例,调整词向量,最小化损失函数。
2. word2vec的主要思路
通过单词和上下文彼此预测。
两个算法:
- Continuous Bag of Words (CBOW):给定上下文,来预测input word
- Skip-grams (SG):给定input word来预测上下文
两种稍微高效一些的训练方法:
- Hierarchical softmax
- Negative sampling
为了降低复杂度,Word2Vec使用了Hierarchical Softmax和Negative
Sampling两种求解策略。普遍认为Hierarchical Softmax对低频词效果较好;Negative
Sampling对高频词效果较好,向量维度较低时效果更好。
2.1 Continuous Bag of Words (CBOW)
2.1.1单个词的上下文
我们假设每个上下文只考虑一个单词,这意味着模型将在给定一个上下文单词的情况下预测一个目标单词,这就像一个二元模型。
下图显示了简化上下文定义下的网络模型。
在我们的设置中,词汇量大小为V,隐藏层大小为N。相邻层上的单元完全连接。 输入是one-hot编码向量,这意味着对于给定的输入上下文字,{x1,…,xV}只有一个为1,而所有其他为0。
输入层和输出层之间的权重可以由V×N矩阵W表示。W的每一行是输入层的相关字的N维矢量表示v。 形式上,W的第i行是v。 给定一个上下文(一个单词),假设x= 1而对任意k’k ,x = 0,我们有
W是NxV,x是Vx1,所以h是Nx1
这本质上是将W的第k行复制到h。v是输入字w的向量表示。 这意味着隐藏层的链接(**)函数是简单线性的(即直接将其加权的输入和传递到下一层)。
从隐藏层到输出层,存在不同的权重矩阵W‘ = {w’},它是N×V矩阵。 使用这些权重,我们可以计算词汇表中每个单词的分数u
其中v’是矩阵W’的第j列
v’是Nx1,v’是1xN,h是Nx1,所以u是1x1
然后我们可以使用对数线性分类模型softmax来获得单词的后验分布,这是一个多项分布。
其中y是输出层中第j个单元的输出.
把(1)和(2)带入3得:
注意,v和v’是单词w的两个表示。v来自矩阵W的行,即输入→隐藏权重矩阵,v’来自矩阵W’的列,即隐藏→输出矩阵。我们将v称为“输入向量”,并将v’称为单词w的“输出向量”。
更新隐藏→输出权重的等式
训练目标(对于一个训练样本)是在给定关于权重的输入上下文字w的情况下最大化(4),观察实际输出字w(在输出层中将其下标表示为j *)的条件概率。
这里E=-log p(w|w)是损失函数(我们想要最小化E).j *是输出层中实际输出字的索引。注意,该损失函数可以被理解为两个概率分布之间的交叉熵测量的特殊情况。
现在我们推导出隐藏层和输出层之间权重的更新方程。我们得到了关于第j个单位的净输入u的E的导数
其中t = 1(j = j *),即,当第j个单位是实际输出字时,t将仅为1,否则t = 0.注意,该导数仅仅是输出层的预测误差ej。
接下来,我们在w’上得到导数,以获得隐藏→输出权重的梯度。
因此,使用随机梯度下降,我们得到隐藏→输出权重的权重更新方程:
其中η> 0是学习率,e = y -t,h是隐藏层中的第i个单位; v’是w的输出向量。 注意,此更新等式意味着我们必须遍历词汇表中的每个可能的单词,检查其输出概率y,并将y与其预期输出t(0或1)进行比较。
- 如果y> t(“过高估计”),则我们从v’中减去隐藏向量h(即v)的一部分,从而使v’远离v
- 如果y< t(“低估”,仅当t = 1时才为真,即w = w),我们向v’添加一些h,从而使v’更接近v。
- 如果y非常接近t,那么根据更新方程,将对权重进行非常小的改变。
更新输入→隐藏权重的等式
获得W’的更新方程后,我们现在可以转到W.我们在隐藏层的输出上取E的导数,得
其中h是隐藏层的第i个单元的输出; u在(2)中定义,输出层中第j个单元的净输入; 并且e = y -t是输出层中第j个字的预测误差。 EH是一个N-dim向量,是词汇表中所有单词的输出向量的总和,由它们的预测误差加权。
接下来我们应该在W上取E的导数。首先,回想一下隐藏层对输入层的值进行线性计算。 扩展(1)中的向量符号我们得到
现在我们可以得到关于W的每个元素的E的导数:
这相当于x和EH的张量积,即
从中我们获得V×N矩阵。 由于x的仅一个分量是非零的,因此只有一行∂E/∂W是非零的,并且该行的值是EH,即N维向量。 我们得到W的更新方程为:
其中v是W的一行,是唯一上下文字的“输入向量”,并且是W的唯一行,其导数是非零的。 在此迭代之后,W的所有其他行将保持不变,因为它们的导数为零。
2.1.2 多字的上下文
下图显示了具有多字上下文设置的CBOW模型。
在计算隐藏层输出时,CBOW模型不是直接复制输入上下文字的输入向量,而是取输入上下文字的向量的平均值,并使用输入→隐藏权重矩阵和平均向量的乘积作为输出。
其中C是上下文中的单词数,w,…,w是上下文中的单词,v是单词w的输入向量。 损失函数是
这与单字上下文模型的目标相同,除了h是不同的,如(18)中的定义而不是(1)。
隐藏→输出权重的更新等式保持与单字上下文模型(11)的更新等式相同
注意,我们需要将此应用于每个训练实例的隐藏→输出权重矩阵的每个元素。
输入→隐藏权重的更新方程类似于(16),除了现在我们需要对上下文中的每个单词w应用以下等式:
2.2 Skip-gram prediction
skip-gram模型的输入是一个单词w,它的输出是w的上下文w,…,w,上下文的窗口大小为C。举个例子,这里有个句子“I drive my car to the store”。我们如果把”car”作为训练输入数据,单词组{“I”, “drive”, “my”, “to”, “the”, “store”}就是输出。所有这些单词,我们会进行one-hot编码。
skip-gram模型图如下所示:
我们仍然使用v来表示输入层上唯一字的输入向量,因此我们对隐藏层输出h的定义与(1)中的相同,这意味着h只是复制(和转置)一行输入→隐藏权重矩阵W,与输入字相关联。 我们复制以下h的定义:
在输出层,我们输出C多项分布,而不是输出一个多项分布。 每个输出使用相同的隐藏→输出矩阵计算:
其中w是输出层第c个面板上的第j个字; w是输出上下文单词中的实际第c个单词; 是w唯一的输入词; y是输出层第c面板上第j个单元的输出; u是输出层第c个面板上第j个单元的净输入。 因为输出层面板共享相同的权重,所以:
其中v’是词汇表中第j个单词的输出向量w,并且v’也是从隐藏→输出权重矩阵W’的列中获取的。
参数更新方程的推导与单词上下文模型的差异并不大。 损失函数更改为:
其中j*是词汇表中实际第c个输出上下文词的索引。
我们根据输出层u的每个面板上的每个单元的净输入获取E的导数:
这是单位的预测误差,与(8)中的相同。为了简化符号,我们将V维向量EI = {EI,…,EI}定义为所有上下文单词的预测误差之和:
接下来,我们对隐藏→输出矩阵W’取E的导数,得到
因此我们得到隐藏→输出矩阵W’的更新方程,
除了预测误差在输出层中的所有上下文字之间求和之外,对该更新等式的直观理解与(11)的直观理解相同。注意,我们需要为每个训练实例的隐藏→输出矩阵的每个元素应用此更新等式。
除了考虑到用EI代替预测误差e之外,输入→隐藏矩阵的更新方程的推导与(12)到(16)相同。 直接给出更新等式:
其中EH是N-dim向量,其每个分量定义为
对(35)的直观理解与(16)的直观理解相同。
CBOW和skip-gram模型都是原始形式,没有应用任何效率优化技巧。
对于所有这些模型,词汇表中的每个单词存在两个向量表示:输入向量v和输出向量v’。学习输入向量很便宜; 但学习输出向量非常昂贵。从更新方程(22)和(33),我们可以发现,为了更新v’,对于每个训练实例,我们必须遍历词汇表中的每个单词w,计算它们的净输入u,概率预测y( 或y表示skip-gram),它们的预测误差e(或skip-gram的EI),并最终使用它们的预测误差来更新它们的输出向量v’
对每个训练实例的所有单词进行这样的计算是非常昂贵的,因此扩展到大型词汇表或大型训练语料库是不切实际的。为了解决这个问题,直觉是限制每个训练实例必须更新的输出向量的数量。实现这一目标的一个优雅方法是Hierarchical softmax; 另一种方法是通过抽样。
这两种技巧仅优化输出向量的更新计算。在我们的推导中,我们关注三个值:(1)E,新的目标函数; (2)∂E/∂v’,输出向量的新更新方程; (3)∂E/∂h,为了更新输入向量而反向传播的预测误差的加权和。
2.3 Hierarchical softmax
Hierarchical softmax是计算softmax的一种有效方式(Morin和Bengio,2005; Mnih和Hinton,2009)。 该模型使用二叉树来表示词汇表中的所有单词。V字必须是树的叶子单位。可以证明存在V -1内部单元。对于每个叶子单元,存在从根到单元的唯一路径; 并且该路径用于估计由叶单元表示的单词的概率。
白色单位是词汇表中的单词,黑暗单位是内部单位。 突出显示从root到w的示例路径。 在所示的示例中,路径L(w)的长度= 4, n(w,j)表示从根到字w的路径上的第j个单元。
在分层softmax模型中,没有单词的输出向量表示。 相反,每个V -1内部单元具有输出向量v’ 。并且单词作为输出单词的概率被定义为
2.4 Negative sampling
参考:
[1] http://www.hankcs.com/nlp/word-vector-representations-word2vec.html
[2] https://blog.****.net/qwe11002698_ling/article/details/53888284
[3] https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html
[4] http://qiancy.com/2016/08/17/word2vec-hierarchical-softmax/
[5] https://blog.****.net/u010665216/article/details/78721354
[6] https://arxiv.org/pdf/1411.2738.pdf
[7] http://www.hankcs.com/nlp/word2vec.html