放牧代码和思想
专注自然语言处理、机器学习算法
    This thing called love. Know I would've. Thrown it all away. Wouldn't hesitate.

CS224n笔记2 词的向量表示:word2vec

目录

如何表示一个词语的意思

先来看看如何定义“意思”的意思,英文中meaning代表人或文字想要表达的idea。这是个递归的定义,估计查询idea词典会用meaning去解释它。2017-06-07_15-24-56.png

中文中“意思”的意思更加有意思:

他说:“她这个人真有意思(funny)。”她说:“他这个人怪有意思的(funny)。”于是人们以为他们有了意思(wish),并让他向她意思意思(express)。他火了:“我根本没有那个意思(thought)!”她也生气了:“你们这么说是什么意思(intention)?”事后有人说:“真有意思(funny)。”也有人说:“真没意思(nonsense)”。(原文见《生活报》1994.11.13.第六版)[吴尉天,1999]

——《统计自然语言处理》

语言学中“meaning”近似于“指代、所指、符号”。

计算机如何处理词语的意思

过去几个世纪里一直用的是分类词典。计算语言学中常见的方式是WordNet那样的词库。比如NLTK中可以通过WordNet查询熊猫的hypernyms (is-a,上位词),得到“食肉动物”“动物”之类的上位词。也可以查询“good”的同义词——“just品格好”“ripe熟了”。

discrete representation的问题

  • 这种discrete representation虽然是种语言学资源,但丢失了韵味。比如这些同义词的意思实际上还是有微妙的差别:adept, expert, good, practiced, proficient, skillful

  • 缺少新词

  • 主观化

  • 需要耗费大量人力去整理

  • 无法计算准确的词语相似度

无论是规则学派,还是统计学派,绝大多数NLP学家都将词语作为最小单位。事实上,词语只是词表长度的one-hot向量,这是一种localist representation(大概是借用localist“局部”的意项)。

在不同的语料中,词表大小不同。Google的1TB语料词汇量是1300万,这个向量的确太长了。

从symbolic representations到distributed representations

词语在符号表示上体现不出意义的相似性,比如Dell notebook battery size和Dell laptop battery capacity。而one-hot向量是正交的,无法通过任何运算得到相似度。

hankcs.com 2017-06-07 上午10.58.24.png

需要找到一种用向量直接编码含义的方法。

Distributional similarity based representations

语言学家J. R. Firth提出,通过一个单词的上下文可以得到它的意思。J. R. Firth甚至建议,如果你能把单词放到正确的上下文中去,才说明你掌握了它的意义。

这是现代统计自然语言处理最成功的思想之一:

hankcs.com 2017-06-07 上午11.04.07.png

通过向量定义词语的含义

通过调整一个单词及其上下文单词的向量,使得根据两个向量可以推测两个词语的相似度;或根据向量可以预测词语的上下文。这种手法也是递归的,根据向量来调整向量,与词典中意项的定义相似。

另外,distributed representations与symbolic representations(localist representation、one-hot representation)相对;discrete representation则与后者及denotation的意思相似。切不可搞混distributed和discrete这两个单词。

学习神经网络word embeddings的基本思路

定义一个以预测某个单词的上下文的模型:

$$p(context|w_t) = …$$

损失函数定义如下:

$$J = 1 − p(w_{−t} |w_t)$$

这里的$w_{−t}$表示$w_t$的上下文(负号通常表示除了某某之外),如果完美预测,损失函数为零。

然后在一个大型语料库中的不同位置得到训练实例,调整词向量,最小化损失函数。

直接学习低维词向量

这其实并不是多么新潮的主意,很早就有一些研究了:

• Learning representations by back-propagating errors (Rumelhart et al., 1986)

A neural probabilistic language model (Bengio et al., 2003)

• NLP (almost) from Scratch (Collobert & Weston, 2008)

• A recent, even simpler and faster model: word2vec (Mikolov et al. 2013) 

只不过以前一直没有引起重视,直到Bengio展示了它的用处之大。后来研究才开始火热起来,并逐渐出现了更快更工业化的模型。

word2vec的主要思路

通过单词和上下文彼此预测,老生常谈了。

两个算法:

  • Skip-grams (SG):预测上下文

  • Continuous Bag of Words (CBOW):预测目标单词

两种稍微高效一些的训练方法:

  • Hierarchical softmax

  • Negative sampling

但在这门课里,只会讲Naïve softmax。好在我早就把两种算法和两种训练方法的四种组合过了一遍:http://www.hankcs.com/nlp/word2vec.html

Skip-gram预测

hankcs.com 2017-06-07 下午2.47.31.png

注意这里虽然有四条线,但模型中只有一个条件分布(因为这只是个词袋模型而已,与位置无关)。学习就是要最大化这些概率。

word2vec细节

目标函数定义为所有位置的预测结果的乘积:

hankcs.com 2017-06-07 下午2.55.51.png

要最大化目标函数。对其取个负对数,得到损失函数——对数似然的相反数:

hankcs.com 2017-06-07 下午2.57.28.png

目标函数细节

这些术语都是一样的:Loss function = cost function = objective function,不用担心用错了。对于softmax来讲,常用的损失函数为交叉熵。

Word2Vec细节

预测到的某个上下文条件概率$p(w_{t+j}|w_t)$可由softmax得到:

hankcs.com 2017-06-07 下午3.07.22.png

o是输出的上下文词语中的确切某一个,c是中间的词语。u是对应的上下文词向量,v是词向量。

点积

复习一下课程开头所说的baby math:

hankcs.com 2017-06-07 下午3.09.43.png

公式这种画风这种配色真的有点幼儿园的感觉。

点积也有点像衡量两个向量相似度的方法,两个向量越相似,其点积越大。

Softmax function:从实数空间到概率分布的标准映射方法

hankcs.com 2017-06-07 下午3.13.57.png

指数函数可以把实数映射成正数,然后归一化得到概率。

softmax之所叫softmax,是因为指数函数会导致较大的数变得更大,小数变得微不足道;这种选择作用类似于max函数。

Skipgram

2017-06-07_15-24-56.png

别看这张图有点乱,但其实条理很清晰,基本一图流地说明了问题。从左到右是one-hot向量,乘以center word的W于是找到词向量,乘以另一个context word的矩阵W'得到对每个词语的“相似度”,对相似度取softmax得到概率,与答案对比计算损失。真清晰。

官方笔记里有非手写版,一样的意思:

Skip-Gram.png

这两个矩阵都含有V个词向量,也就是说同一个词有两个词向量,哪个作为最终的、提供给其他应用使用的embeddings呢?有两种策略,要么加起来,要么拼接起来。在CS224n的编程练习中,采取的是拼接起来的策略:

# concatenate the input and output word vectors
wordVectors = np.concatenate(
    (wordVectors[:nWords,:], wordVectors[nWords:,:]),
    axis=0)
# wordVectors = wordVectors[:nWords,:] + wordVectors[nWords:,:]

他们管W中的向量叫input vector,W'中的向量叫output vector。

训练模型:计算参数向量的梯度

把所有参数写进向量$\theta$,对d维的词向量和大小V的词表来讲,有:

2017-06-07_15-34-33.png

由于上述两个矩阵的原因,所以$\theta$的维度中有个$2$。

模型的学习当然是梯度法了,Manning还耐心地推导了十几分钟:

hankcs.com 2017-06-07 下午5.18.54.png

hankcs.com 2017-06-07 下午5.19.15.png

hankcs.com 2017-06-07 下午5.20.24.png

hankcs.com 2017-06-07 下午5.20.42.png

更清晰的公式参考:http://www.hankcs.com/nlp/word2vec.html#h3-5 

损失/目标函数

梯度有了,参数减去梯度就能朝着最小值走了。

hankcs.com 2017-06-07 下午8.34.41.png

梯度下降、SGD

hankcs.com 2017-06-07 下午8.42.22.png

hankcs.com 2017-06-07 下午8.40.33.png

只有一句比较新鲜,神经网络喜欢嘈杂的算法,这可能是SGD成功的另一原因。

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » CS224n笔记2 词的向量表示:word2vec

评论 25

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #8

    请问目标函数是最大化context的概率,那跟实际的context的损失是怎么联系的呢,看公式好像没有计算损失的部分

    Linda_ak5年前 (2019-01-21)回复
    • 与实际的context的损失函数采用分类交叉熵计算的,跟优化最小化context概率的负对数一样

      dearchill5年前 (2019-06-18)回复
  2. #7

    请问一下,最终的词向量一定要是input vector与output vector的相加或拼接吗?我好像在哪里看到有直接用W里的input vector做词向量的

    Ida6年前 (2018-11-06)回复
  3. #6

    非常感谢楼主的笔记分享,希望能继续和您交流。

    小六郎6年前 (2018-03-04)回复
  4. #5

    文中提到, “w’是转置”, 但我的理解w’并不是w的转置,应该是另一个需要训练的matrix。

    atom6年前 (2018-01-04)回复
    • 你是对的,我跟后面的http://www.hankcs.com/nlp/cs224n-tackling-the-limits-of-dl-for-nlp.html/2#h2-0 搞混了。

      hankcs6年前 (2018-01-04)回复
  5. #4

    对不对?

    celebrate7年前 (2017-09-15)回复
  6. #3

    而不是因为上文和下文各有V

    celebrate7年前 (2017-09-15)回复
  7. #2

    计算参数向量梯度θ的大小是2dV是因为W和W’, 即U矩阵和V矩阵吧?

    celebrate7年前 (2017-09-15)回复
    • 神经网络要优化的就是权重向量,所以正如你所说的W和W’。作者的描述确实不理解

      庞和明7年前 (2017-10-06)回复
  8. #1

    flow7年前 (2017-06-19)回复

我的作品

HanLP自然语言处理包《自然语言处理入门》