cs224n---lecture2: Word Vectors

首先,思考一下,一个单词的“意思”如何定义?


WordNet是一个工具包,可以使用它找出给定单词的同义词、上位词、下位词等。但是,有如下缺点:

  • 难以紧跟时代步伐进行更新,需要大量的人力去维护
  • 因为是人来维护的,因此具有主观性
  • 缺失词语之间的细微差别
  • 无法给出词语相似性的准确度量

词语的离散表示—独热编码(one-hot representation)
将所有的词汇的个数作为向量长度,向量里的每一个元素对应着一个单词。除了单词所在位置为1,其他位置均为0。
例如: “hotel”: [0 0 0 0 0 0 0 0 1 0 0 0 0 ….0]
缺点:

  • 向量维数和词汇表大小成正比,当词汇表单词个数上百万,上千万 的时候,向量的维数可想而知。
  • 向量十分稀疏,只有该单词所在位为1,其余为0。
  • 独热编码没有对单词之间的关系进行建模,任意两个单词编码的内积为0。

分布式表示(distributed representation)
可不可以把单词的向量表示固定一个维度?可不可以让向量表示不再稀疏,而是变得稠密呢?
再看一下,开始提到的问题。一个单词的“意思”如何定义?
答案如下:

You shall know a word by the company it keeps. (J.R. Firth 1957:11)

即,我们可以根据词语的上下文来得知它的意思。

进一步,介绍一下Word2vec工具包。
Word2vec的主要思想:predict between every word and its context words.
Word2vec有两种算法:Skip-grams(SG)和Continuous Bag of Words(CBOW)。
SG: predict context words given the target word
CBOW: predict the target word given context words
Word2vec使用了两种高效的训练方法:Hierarchical softmax 和 Negative sampling

首先,对SG进行介绍。给定中心词wt,预测出一定窗口大小m内的上下文单词wtm,wtm+1,...,wt1,wt+1,...,wt+m
目标函数: t=1...Tmim,i0P(wt+i|wt)
我们需要最大化上面的目标函数,以使得预测更加准确。
但是,概率连乘操作(多个小数相乘)可能会出现下溢,即输出0。因此采取取对数操作,并且添加负号,从而变成最小化问题。
J(θ)=1Tt=1...Tmim,i0logP(wt+i|wt)

P(wt+i|wt)用softmax来求。
p(o|c)=exp(uoTvc)w=1...Vexp(uwTvc), 其中 vc是中心词对应的词向量,uo是上下文单词对应的词向量, V是词汇表大小。公式并不复杂,分子是把数值变为正数,然后分母进行归一化操作。

贴上SG的“全景图”:

cs224n---lecture2: Word Vectors

我们对上图从左至右慢慢分析。前面我们提到,SG是根据中心词来预测固定窗口内的上下文单词。因此,在图中,最左侧的输入是一个向量,最右侧的输出是三个向量(三个只是示意一下)。

Word2vec是高效的,在于网络中的参数只有两个类型,W: 内部词向量,W’:外部词向量

中心词wc根据one-hot表示对应到W中的某一列,即该单词的内部词向量表示vc。然后和W中的每一行做内积计算出得分,得到向量V,然后进行softmax得到概率表示。注意:对每一个上下文单词进行的是同样的操作,即V和W’都是唯一的,因此图中右侧的三个向量是一模一样的,除了one-hot表示。

因此,对于一个单词来说,SG可以得到两个词向量,一个是来自W的内部词向量,一个是来自W’的外部词向量。下游任务具体使用哪一个词向量还是两者的加和,没有恒定的答案,try it all !

目前的重点就在于如何训练这些词向量—-梯度下降法。需要用反向传播算法来求得对应的梯度。(老师的白板推导十分详细)
cs224n---lecture2: Word Vectors
cs224n---lecture2: Word Vectors

现在,考虑一个窗口,一个上下文单词。
J(θ)=logexp(uoTvc)j=1...Vexp(ujTvc)
以求对vc的梯度为例:
J(θ)展开为logexp(uoTvc)+logj=1...Vexp(ujTvc)=uoTvc+logj=1...Vexp(ujTvc)
Jvc=uo+1j=1...Vexp(ujTvc)(j=1...Vexp(ujTvc)uj)=uo+i=1...Vexp(uiTvc)uij=1...Vexp(ujTvc)=uo+i=1...Vp(wi|wc)ui=(uoi=1...Vp(wi|wc)ui)

uo—> observed
i=1...Vp(wi|wc)ui—>expected

一般不使用全梯度下降,因为you would wait a very long time before making a single update.
cs224n---lecture2: Word Vectors

通常使用SGD(随机梯度下降),即每一个窗口后进行梯度更新:
cs224n---lecture2: Word Vectors