CS224n 斯坦福深度自然语言处理课 笔记 Lecture02
- 前言
- 关于词义探讨
-
- 什么是WordNet?
-
WordNet的主要缺陷
-
存在的问题
-
解决方案:基于分布的相似性
-
Word2vec
-
- 词嵌入模型
- 主要内容
- 基础算法之一:Skip-grams(SG)
-
- 什么是WordNet?
前言
本课程将由Christopher Manning和Richard Socher担任主讲教师
Stanford课程主页:http://web.stanford.edu/class/cs224n/
中英双语字幕网课链接:http://www.mooc.ai/course/494
从词义说起
用分类资源(taxonomic resources),例如WordNet来处理词义。
什么是WordNet?
WordNet是普林斯顿大学认知科学实验室与计算机系联合构建的一个英语词汇数据库,在其收录的庞大数量的英语词汇中包含了超过10万个实词。在WordNet系统中,具有相似意义的单词以"Synset"的形式构成一个同义词集合,并通过上位与下位关系、上位与反义关系、整体与部分关系以及包含于关系等多种语义关联方式与其他同义词集合相互连接起来。这些语义关联共同形成了一个网状的知识架构
from nltk.corpus import wordnet as wn
panda = wn.synset('panda.n.01')
hyper = lambda s : s.hypernyms()
list(panda.closure(hyper))
_P.S. 此代码若无法正常运行,则需重新安装nltk库:<>
[Synset('procyonid.n.01'), Synset('carnivore.n.01'), Synset('placental.n.01'),
Synset('mammal.n.01'), Synset('vertebrate.n.01'), Synset('chordate.n.01'),
Synset('animal.n.01'), Synset('organism.n.01'), Synset('living_thing.n.01'),
Synset('whole.n.02'), Synset('object.n.01'), Synset('physical_entity.n.01'),
Synset('entity.n.01')]
更为详尽地介绍wordnet的具体使用方法可参考:
WordNet的缺点
- 可能会忽视其中细微的差异(例如"good"和"expert"虽然是同义词但存在细微差别)
- 未能引入新的词汇
- 具有主观性质
- 依赖于人工维护
- 计算相关词汇之间的相似度难度较大
存在的问题
涵盖的范围
传统NLP主要涵盖所有语言学领域(除现代深度学习及1980年代初期的神经网络)
现象
以原子符号(atomic symbols)为基本单位来表示词语,并采用独热编码(one-hot encoding)的方式进行编码表示。这种表示方法属于局部ist编码模式。

问题
- 维度数量将显著增加;
- 传统机器学习算法缺乏对词汇间内在联系的表征能力。

解决方法:分布相似性
构建反映单词意义的向量空间,则两个单词向量之间的点积即为其相似度值。
分布相似性(distributional similarity)的概念依据语义学原理,其本质在于通过词语周围的上下文环境来推断词语的意义。
例如,在自然语言处理领域中,“banking”这一词缀常与"governments", "debt problems", "regulations", "Europe"等词组搭配出现,则可据此建立相应的关联网络以表征词义。

基于每个单词生成一个高维向量表示, 从而能够推断该单词在特定语境中的使用情况
Word2vec
词嵌入模型
词向量模型(word embedding model) : 通过中心词预测其周围的词语, 或估计某单词周围可能出现的其他单词的概率。

损失函数J可以用来计算出预测的准确率, 其中W_t表示中心词汇t,W_{-t}表示围绕在t中心词周围的其他词汇。训练模型的目标就是要最小化损失函数。
词汇的向量表示的概念在1986年被第一次提出,但没有被重视。
相关论文:
• 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)
主要内容
Word2vec是由Alphabet于2013年推出的自然语言处理技术核心工具Skip-Gram模型的主要功能在于通过分析上下文来生成每个词的意义向量(即每个词与周围词语之间的关系模型)。

基础算法之一:Skip-grams(SG)
该概念涉及从每个估算步骤中选择一个中心词,并试图预测该中心词在其周围窗口内可能出现的上下文词语。该模型构建了一个概率分布函数——基于该中心词及其周围上下文的具体位置上出现的概率;而训练过程则是通过优化这些向量表示来最大化给定位置的概率值。对于任何一个特定的词汇而言,在其特定位置上出现的概率即为此处所指的概率分布函数的最大化目标。
目标函数 :
J'(\theta) = \prod_{t=1}^{T}\prod_{-m\le j \le m,j \ne 0}P(W_{t+j} \mid W_t)
为了简化运算,在需要时可直接使用乘法性质来进行转换操作;即通过该函数取对数后进行计算即可得到负对数似然值;其中该式子对应的是模型对应的负对数似然分布:
J(\theta) = -\frac{1}{T} \sum^T_{t=1} \sum_{-m\le j \le m,j \ne 0}\log {p(W_{t+j} \mid W_t)}
其中\theta代表词汇向量表示这一概念;此处使用的归一化处理是为了使概率值易于计算;而减号的作用是为了将最大化问题转化为最小化问题(当然如果你偏好最大化的思路,则可以选择不这么做)。
Softmax概率分布函数:
p(o \mid c) = \frac{exp({u_o}^T v_c)}{\sum_{w=1}^{v} exp({u_w}^Tv_c)}
其中c和o分别代表中心词和上下文词在整个词汇表中的索引位置。
因为向量点积运算满足交换律,则有:\sum_{i=1}^n u_iv_i = \sum_{j=1}^n u_jv_j

我们对整个参数集合θ进行了定义:它包含所有单词的两套不同的向量表示。

随后
具体地

终于来到了优化,这里用的是梯度下降法 :
首先full-batch的:

所以写成代码,也就是:
while True:
theta_grad = evaluate_gradient(J,corpus,theta)
theta = theta - alpha * theta_grad
这里注意 alpha 的取值,太大容易错过最小值
为了缩短训练所需的时间,在开始计算梯度前通常会采用随机梯度下降(SGD)算法,在进行采样后能够初步确定梯度方向。这样计算速度可提升几个数量级。
while True:
window = sample_window(corpus)
theta_grad = evaluate_gradient(J,window,theta)
theta = theta - alpha * theta_grad
后续还有关于CBOW的讲解,在Lecture 03.
