系列文章
Lecture 1: Introduction and Word
Lecture 2: Word Vectors and Word Senses
目录
1. The course
自然语言处理( NLP )是信息时代最重要的技术之一,也是人工智能的重要组成部分。学习的课程为CS224n,课程主页
2. Human language and word meaning
Wordnet:
包含同义词集和上义词的同义词词典
Wordnet的问题:
- 缺乏细微之处:同义词只在某些情况下正确
- 词缺乏新含义
- 偏主观
- 需要人力去更新修改
- 不能计算word的相似度
用离散的符号代替
在传统NLP中,用one-hot向量表示,这种向量完全正交,即one-hot词向量无法表示不同词之间的相似度。
一个单词的含义通常由在它附近经常出现的单词给出的,即分布式语义
- 当单词w出现在文本中时,其上下文是出现在附近(在固定大小的窗口中)的一组单词。
- 使用w的多个上下文建立w的表示
3. Word2vec introduction
Word vectors
我们将为每个单词构建一个密集的向量,这样它与出现在相似上下文中的单词向量相似
注:Word vectors有时称为word embeddings或word representations表示。它们是分布式表示。
Word2vec(Mikolov et al. 2013) 是一种学习词向量的框架
- 有大量的文本
- 固定词汇表中的每个单词都由一个向量表示
- 浏览文本中的每个位置t,其中有一个中心词c和上下文(“外部”)词o
- 使用c和o的词向量的相似性来计算o给定c的概率(反之亦然)
- 不断的调整词向量,最大化概率
目标函数:
l
i
k
e
l
i
h
o
o
d
=
L
(
θ
)
=
∏
t
=
1
T
∏
−
m
≤
j
≤
m
j
≠
0
p
(
w
t
+
j
∣
w
t
;
θ
)
likelihood=L(\theta)=\prod_{t=1}^{T}\prod_{-m \le j \le m\\ \ \ \ \ j\ne0}^{}p(w_{t+j}|w_t;\theta)
likelihood=L(θ)=t=1∏T−m≤j≤m j=0∏p(wt+j∣wt;θ)
注: θ \theta θ 是需要优化的参数
J ( θ ) = − 1 T l o g L ( θ ) = − 1 T ∑ t = 1 T ∑ − m ≤ j ≤ m j ≠ 0 l o g P ( w t + j ∣ w t ; θ ) J(\theta)=-\frac 1TlogL(\theta)=-\frac1T\sum_{t=1}^T\sum_{-m\le j\le m \\ \ \ \ \ j\ne 0}logP(w_{t+j}|w_t;\theta) J(θ)=−T1logL(θ)=−T1t=1∑T−m≤j≤m j=0∑logP(wt+j∣wt;θ)
注:
- J ( θ ) J(\theta) J(θ)为损失函数(这里是平均负对数似然);
- 负号将极大化损失函数转化为极小化损失函数;
- log函数方便将乘法转化为求和(优化处理)
如何计算?
-
问:如何计算 P ( w t + j ∣ w t ; θ ) P(w_{t+j}|w_t;\theta) P(wt+j∣wt;θ)?
-
答:对于每个单词 w 我们使用两个向量 v w v_w vw 和 u w u_w uw
v w v_w vw :当 w 是中心词时
u w u_w uw :当 w 是上下文单词时
-
对于中心词 c 和上下文单词 o,有:
P ( o ∣ c ) = e x p ( u o T v c ) ∑ w ϵ V e x p ( u w T v c ) P(o|c)=\frac {exp(u_o^Tv_c)}{\sum_{w\epsilon V}exp(u_w^Tv_c)} P(o∣c)=∑wϵVexp(uwTvc)exp(uoTvc)
注:
- 分母是对整个词汇表进行规范化以给出概率分布
- 分子越大,相似度越高
softmax:
- softmax函数将任意值xi映射到概率分布p
4. Word2vec objective function gradients
整个模型里只有一个参数 θ \theta θ ,所以我们只用优化这一个参数就行。
例如:模型在一个 d 维,词典大小为 V :
θ
=
[
v
a
a
r
d
v
a
r
k
v
a
⋮
v
z
e
b
r
a
u
a
a
r
d
v
a
r
k
u
a
⋮
u
z
e
b
r
a
]
ϵ
R
2
d
V
\theta=\begin{bmatrix}v_{aardvark}\\v_a\\\vdots\\v_{zebra}\\u_{aardvark}\\u_a\\\vdots\\u_{zebra} \end{bmatrix}\epsilon\ \Bbb R^{2dV}
θ=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡vaardvarkva⋮vzebrauaardvarkua⋮uzebra⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤ϵ R2dV
- 2:每个单词有两个向量
- 通过梯度(导数)下降的方式优化参数
- 梯度下降会用到链式法则
- 迭代计算每个中心词向量和上下文词向量随着滑动窗口移动的梯度
- 依次迭代更新窗口中所有的参数
5. Optimization basics
Optimization:Gradient Descent(梯度下降)
-
我们的损失函数 J ( θ ) J(\theta) J(θ) 需要最小化
-
使用的方法为:梯度下降
-
对于当前 θ \theta θ ,计算 J ( θ ) J(\theta) J(θ) 的梯度
-
然后小步重复朝着负梯度方向更新方程里的参数 α = ( s t e p s i z e ) o r ( l e a r n i n g r a t e ) \alpha=(step\ size)\ or\ (learning\ rate) α=(step size) or (learning rate)
θ n e w = θ o l d − α ∇ θ J ( θ ) \theta^{new}=\theta^{old}-\alpha \nabla_\theta J(\theta) θnew=θold−α∇θJ(θ) -
更新唯一的参数 θ \theta θ:
θ j n e w = θ j o l d − α α α θ j o l d J ( θ ) \theta_j^{new}=\theta_j^{old}-\alpha \frac \alpha{\alpha\ \theta_j^{old}}J(\theta) θjnew=θjold−αα θjoldαJ(θ)
while True:
theta_grad = evaluate_gradient(J,corpus,theta)
theta = theta - alpha * theta_grad
SGD:Stochastic Gradient Descent
-
由于 J ( θ ) J(\theta) J(θ) 是在语料文本中所有窗口的方程
-
当语料很大的时候,计算梯度会消耗巨大
-
解决办法:SGD
-
不断sample窗口,不断更新
while True:
window = sample_window(corpus)
theta_grad = evaluate_gradient(J,window,theta)
theta = tehta - alpha * theta_grad
对于梯度下降,随机梯度下降,它们的区别可以参考:https://www.cnblogs.com/lliuye/p/9451903.html
ps:
对于Word2vec的几点:
- 为什么是二维向量,更容易优化!
- 两个模型:1.跳字模型Skip-grams——SG(预测上下文)2.连续词袋模型Continuous Bag of Words——CBOW(预测中心词)
- 提高训练效率:1.负采样 2.层序softmax
6. Skip-gram详解
model
The Hidden Layer
注:该模型的隐藏层实际上只是用作查找表,隐藏层的输出即输入单词的词向量。
The Output Layer
输出层是Softmax回归分类器
注:该模型中有300个特征和10,000个单词的词汇,隐藏层和输出层的权重为3M!在大型数据集上进行训练是禁止的,因此word2vec的作者进行了许多调整以使训练可行。之后继续学习。
本小节参考:http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/