本文转自:http://www.hankcs.com/nlp/word-vector-representations-word2vec.html
如何表示一个词语的意思
先来看看如何定义“意思”的意思,英文中meaning代表人或文字想要表达的idea。这是个递归的定义,估计查询idea词典会用meaning去解释它。
中文中“意思”的意思更加有意思:
他说:“她这个人真有意思(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向量是正交的,无法通过任何运算得到相似度。
需要找到一种用向量直接编码含义的方法。
Distributional similarity based representations
语言学家J. R. Firth提出,通过一个单词的上下文可以得到它的意思。J. R. Firth甚至建议,如果你能把单词放到正确的上下文中去,才说明你掌握了它的意义。
这是现代统计自然语言处理最成功的思想之一:
通过向量定义词语的含义
通过调整一个单词及其上下文单词的向量,使得根据两个向量可以推测两个词语的相似度;或根据向量可以预测词语的上下文。这种手法也是递归的,根据向量来调整向量,与词典中意项的定义相似。
另外,distributed representations与symbolic representations(localist representation、one-hot representation)相对;discrete representation则与后者及denotation的意思相似。切不可搞混distributed和discrete这两个单词。
学习神经网络word embeddings的基本思路
定义一个以预测某个单词的上下文的模型:p(context|wt)=…
损失函数定义如下:J=1−p(w−t|wt)
这里的w−tw−t表示wtwt的上下文(负号通常表示除了某某之外),如果完美预测,损失函数为零。
然后在一个大型语料库中的不同位置得到训练实例,调整词向量,最小化损失函数。
直接学习低维词向量
这其实并不是多么新潮的主意,很早就有一些研究了:
• 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预测
注意这里虽然有四条线,但模型中只有一个条件分布(因为这只是个词袋模型而已,与位置无关)。学习就是要最大化这些概率。
word2vec细节
目标函数定义为所有位置的预测结果的乘积:
要最大化目标函数,最小化损失函数,需要对目标函数取个负对数,得到损失函数——对数似然的相反数:
目标函数和损失函数通常是相反的过程:
目标函数细节
这些术语都是一样的:Loss function = cost function = objective function,不用担心用错了。对于softmax来讲,常用的损失函数为交叉熵。
Word2Vec细节
预测到的某个上下文条件概率p(wt+j|wt)可由softmax得到:
o是输出的上下文词语中的确切某一个,c是中间的词语。u是对应的上下文词向量,v是词向量。
点积
复习一下课程开头所说的baby math:
公式这种画风这种配色真的有点幼儿园的感觉。
点积也有点像衡量两个向量相似度的方法,两个向量越相似,其点积越大。
Softmax function:从实数空间到概率分布的标准映射方法
指数函数可以把实数映射成正数,然后归一化得到概率。
softmax之所叫softmax,是因为指数函数会导致较大的数变得更大,小数变得微不足道;这种选择作用类似于max函数。
Skipgram
别看这张图有点乱,但其实条理很清晰,基本一图流地说明了问题。从左到右的过程依次是one-hot向量乘以W于是找到词向量,再乘以W的转置得到对每个词语的“相似度”,对相似度取softmax得到概率,与答案对比计算损失。真清晰。官方笔记里有非手写版,一样的意思:
训练模型:计算参数向量的梯度
把所有参数写进向量θθ,对d维的词向量和大小V的词表来讲,有:
模型的学习当然是梯度法了,Manning还耐心地推导了十几分钟:
更清晰的公式参考:http://www.hankcs.com/nlp/word2vec.html#h3-5
损失/目标函数
梯度有了,参数减去梯度就能朝着最小值走了。
梯度下降、SGD
只有一句比较新鲜,神经网络喜欢嘈杂的算法,这可能是SGD成功的另一原因。