cs224n-Lecture-2 词向量表示:word2vec

文章目录
  1. 1. Word2Vec
  2. 2. Skip-gram模型
  3. 3. Word2Vec的各类细节
  4. 4. 模型训练
  5. 5. 课后作业
    1. 5.1. Softmax
    2. 5.2. 神经网络基础

笔记主要为个人学习记录,资料来源于斯坦福CS224N课程。

Word2Vec

Word2Vec一共存在两种形式,Skip-gram模型和CBOW模型。
Skip-gram:主要用于预测上下文;
CBOW:主要用于预测单词。

Skip-gram模型

在每一个估算步都取一个词作为中心词汇,通过这个模型来预测一个单词的上下文。

Skip-gram模型的完整计算过程如下图所示:

我们拥有一个中心词汇,这里是一个 one-hot 编码,然后有一个所有中心词汇的表示组成的矩阵。 如果我们将这个矩阵和向量相乘(其中选出的列是中心词汇的表示),然后构造第二个矩阵用于存储上下文词汇的表示,这里只列举了三个词汇(因为足够复杂)。把这个向量和这个矩阵(上下文词汇表示)相乘, 然后挑出中心词汇和上下文表示的点积,对于每个位置来说都是一个矩阵,我们只有一个上下文词汇矩阵,然后就得到这些点积,再利用Softmax方法将它们转换成概率分布。

上述过程可以描述为,给定一个中心词汇,作为一个生成模型,它可以预测在上下文中出现词汇的概率。

Word2Vec的各类细节

预测每个单词的半径为m的窗口中的单词:

t 和 t+j 表示的是单词在文本中的位置。
根据由单词向量构造而成的中心词汇来得出其上下文单词的概率分布。
c,o分布代表单词在词汇表空间中的索引,以及它的类型,这是词汇的排序,在单词表中的索引是763,在文本中的位置是766。但是词汇表中的o(输出单词)和c(中心单词),这里已经知道了单词类型,所以得到73号词在47号中心词条件下的出现概率p。
每种单词类型都有一个对应的向量,Uo 是索引为 o 的单词所对应的向量(上下文词汇的向量),Vc 是中心词汇对应的向量,那如何才能确定相应的概率分布呢?

那就需要使用一种名为Softmax的模型,选取两个向量的点积,将它们转换成Softmax形式,非常慢地过一遍这个步骤。


补充,求向量的点积公式如下:


所以,针对下面这个公式,分母部分就是先求点积的值,再求和。


这种求积类似于一种粗糙衡量相似性的方法,两个向量的相似性越大,那么这个点积就越大。所以说这是一种通过点积衡量相似性的方法。
当我们得到两个向量的点积,我们就把他们转换成Softmax形式,因此,Softmax就是一种将数值转换成概率的标准方法。
当计算点积的时候,得到的结果是一个整数,我们不能直接把它转换成概率分布,所以,最简单的方法就是将它们转换成指数,其结果落在一个正区间,结果就一定为正。
这就为求解概率分布提供了一个很好的基础。

eg.假如有大量数据都为正,并且需要把它们等比例转换成概率分布,做法如下:
对这些数字求和,然后用将各项依次除以总和,然后就能得到它们的概率分布。接下来,就是要对这个概率进行归一化处理。这就是如上公式中所展示的概率估计。
注:这种方法完全基于单词的向量表示。

通俗来说,Softmax 就是使用词汇 c 来获取 词汇o 的概率。

模型训练

把所有的参数写进向量θ,对 d 维的词向量和大小为 V 的词汇表来讲,有:

对于每个单词,都有一个 d 维的小向量,不管它是中心词汇还是上下文词汇,这样就拥有一个代表上下文中 aardvark 的向量。在上述矩阵中,v是上下文词的向量,u是中心词的向量,这个向量的总长度是2dV。
因为有两个向量(中心词和上下文词),所以是2dV。

在上述的θ公式中,我们得到了目标函数,想要最小化它的负对数似然,上面的概率分布中包含了中心词汇和上下文词汇,思路是要调整参数,也就是这些向量,以便让负的对数似然项最小化,从而使预测的概率最大化。

课后作业

Softmax

(1) 证明SoftMax对于输入中的恒定偏移是不变的,也就是说,对于任何输入向量x和任何常数c,都存在如下:
Softmax(x)=Softmax(x+c)

其中,x+c意味着将常数c添加到x的每个维度:

Softmax的直观理解如下:

假如给定一张图片需要进行分类,通过wx+b得到的分类的结果是cat,car,还有frog,其中,分类为cat的结果是3.2,是car的结果是5.1,是frog的结果是-1.7。再通过指数化得到24.5,164,0.18三个值,最后通过归一化得到最后的结果。

推导过程如下:

(2) 编程实现Softmax
给定N行和D列的输入矩阵,利用部分优化计算每一行的Softmax预测,将实现写入q1_softmax.py,通过执行 q1_softmax.py 来进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
#coding:utf-8
import numpy as np

def softmax(x):
orig_shape = x.shape
if len(x.shape) > 1:
# 假如输入的x是一个矩阵,则len(x.shape)>1
# Matrix
x-=np.max(x,axis=1,keepdims=True)
# axis=1 表示从行里查找值,axis=0表示从竖直方向查找
# keepdims 保持维度不变
# 相减的部分利用了常数不变性质
x=np.exp(x)/np.sum(np.exp(x),axis=1,keepdims=True)
else:
# Vector
x-=np.max(x,axis=0,keepdims=True)
# 这里只有单个向量,因此是从列中寻找最大值
x=np.exp(x)/np.sum(np.exp(x),axis=0)
assert x.shape == orig_shape
return x

if __name__=="__main__":
x1=np.array([[1,2,3],[2,5,6]])
result1=softmax(x1)
print(result1)
x2=np.array([1,2,3])
result2=softmax(x2)
print(result2)

运行结果如下:

(3) Softmax小结
1.指数变换去负数,突出特征;
2.归一化变为概率的近似;
3.利用常数不变防止溢出;
4.弄清每个维度代表的含义;
5.axis=0 表示竖轴,axis=1 表示横轴。

神经网络基础

(1) 导出Sigmoid函数的梯度,并表明它可以重写为函数值的函数(在某些表达式中,只有σ(X)而不是x存在)。假设输入x是这个问题的标量。回想一下,sigmoid函数是:

推导过程如下:

(2)利用交叉熵损失求取softmax函数输入的梯度,即求出相对于softmaxn输入向量θ的梯度。函数由yˆ=Softmax(θ)生成。记住交叉熵函数是:

其中y是one-hot标号向量,y_hat是所有类的预测概率向量。