如何表示一个词语的意思
计算机如何处理词语的意思
过去几个世纪里一直用的是分类词典。计算语言学中常见的方式是WordNet那样的词库。比如NLTK中可以通过WordNet查询熊猫的hypernyms (上位词),得到“食肉动物”“动物”之类的上位词。(上义词是对事物的概括性、抽象性说明;下义词是事物的具体表现形式或更为具体的说明。可以理解为,上义词针对共性,而下义词针对个性。)也可以查询“good”的同义词。
![](https://img.haomeiwen.com/i16301095/87e6b29779ddb40e.png)
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向量是正交的,无法通过任何运算得到相似度。比如下图的motel(汽车旅馆),hotel(酒店)
![](https://img.haomeiwen.com/i16301095/dd49512bac943aca.png)
所以需要找到一种用向量直接编码含义的方法。
Distributional similarity based representations
语言学家J. R. Firth提出,通过一个单词的上下文可以得到它的意思。J. R. Firth甚至建议,如果你能把单词放到正确的上下文中去,才说明你掌握了它的意义。
这是现代统计自然语言处理最成功的思想之一:
![](https://img.haomeiwen.com/i16301095/ceeea3717aaa5577.png)
通过向量定义词语的含义
通过调整一个单词及其上下文单词的向量,使得根据两个向量可以推测两个词语的相似度;或根据向量可以预测词语的上下文。这种手法也是递归的,根据向量来调整向量,与词典中意项的定义相似。
![](https://img.haomeiwen.com/i16301095/a6b56b1370d8ee28.png)
学习神经网络word embeddings的基本思路
定义一个以预测某个单词的上下文的模型:
![](https://img.haomeiwen.com/i16301095/de6604d6d758bd82.png)
损失函数定义如下:
![](https://img.haomeiwen.com/i16301095/976513f42d0afed9.png)
这里的w−t表示wt的上下文(负号通常表示除了某某之外),如果完美预测,损失函数为零。
然后在一个大型语料库中的不同位置得到训练实例,调整词向量,最小化损失函数。
直接学习低维词向量
- 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)
word2vec的主要思路
通过单词和上下文彼此预测。
两个算法:
Skip-grams (SG):预测上下文
Continuous Bag of Words (CBOW):预测目标单词
两种稍微高效一些的训练方法:
Hierarchical softmax
Negative sampling
以上四种方法可见word2vec原理推导与代码分析
Skip-gram预测
![](https://img.haomeiwen.com/i16301095/d05992f96e998402.png)
给定一个中心词汇,某个单词在它上下文中出现的概率,我们会选取词向量以让概率分布值最大化。注意这里虽然有四条线,但模型中只有一个条件分布。
word2vec细节
目标函数定义为所有位置的预测结果的乘积:
![](https://img.haomeiwen.com/i16301095/6256a90f978b77f4.png)
要最大化目标函数。对其取个负对数,得到损失函数——对数似然的相反数:
![](https://img.haomeiwen.com/i16301095/fadb672ae29518ce.png)
目标函数细节
这些术语都是一样的:Loss function = cost function = objective function,不用担心用错了。对于softmax来讲,常用的损失函数为交叉熵。
这些术语都是一样的:Loss function = cost function = objective function,不用担心用错了。对于softmax来讲,常用的损失函数为交叉熵。
预测到的某个上下文条件概率p(wt+j|wt)可由softmax得到:
![](https://img.haomeiwen.com/i16301095/9915591160c6e5d5.png)
o是输出的上下文词语中的确切某一个,c是中间的词语。u是对应的上下文词向量,v是词向量。
点积
![](https://img.haomeiwen.com/i16301095/4a2e8fb2a9d89107.png)
点积也有点像衡量两个向量相似度的方法,两个向量越相似,其点积越大。
Softmax function
从实数空间到概率分布的标准映射方法
![](https://img.haomeiwen.com/i16301095/870b84278d8f2ae4.png)
指数函数可以把实数映射成正数,然后归一化得到概率。
softmax之所叫softmax,是因为指数函数会导致较大的数变得更大,小数变得微不足道;这种选择作用类似于max函数。
Skipgram
![](https://img.haomeiwen.com/i16301095/8e83e26c7b282c3d.png)
从左到右是one-hot向量,乘以center word的W于是找到词向量,乘以另一个context word的矩阵W'得到对每个词语的“相似度”,对相似度取softmax得到概率,与答案对比计算损失。
![](https://img.haomeiwen.com/i16301095/422929b863d19c1a.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。
训练模型:计算参数向量的梯度
把所有参数写进向量θ,对d维的词向量和大小V的词表来讲,有:
![](https://img.haomeiwen.com/i16301095/ff75035050760acf.png)
由于上述两个矩阵的原因,所以θ的维度中有个2。
模型的学习是梯度法
![](https://img.haomeiwen.com/i16301095/71ff9dfa8f85772c.png)
![](https://img.haomeiwen.com/i16301095/f96bc98a8e10ca88.png)
![](https://img.haomeiwen.com/i16301095/312b965ec1a23c6f.png)
![](https://img.haomeiwen.com/i16301095/a4343d2332a0fa17.png)
梯度下降、SGD
![](https://img.haomeiwen.com/i16301095/d79801d0efd21278.png)
![](https://img.haomeiwen.com/i16301095/12b3f370b8ba43ce.png)
网友评论