1.回顾one-hot 表示的词向量
主要参考句子的向量表示,可以看下面这张图,就是用 One-hot 表示的单词或句子向量
这样表示有什么缺点??
- 这是一种稀疏表示(通常词库很大,0 的个数也特别多)
- 无法表示单词之间的相似性,用余弦相似度计算结果都为0
- 表达容量差
怎么理解表达容量差呢?
我们先假设词向量的维度只有8维,如果用One-hot表示,那我们最多只能表示 8 种不同的单词,因为 1 的位置只有8种,但如果用分布式向量表示,每个位置可以是任意实数,所以8维的向量可以表示任意的单词。
分布式表示形式类似于下图:
它是一种稠密表达,并且单词之间具有一定的意思
2.学习skip-gram
2.1 skip-gram学习依据
学习的核心依据是:在一篇文章中离得越近的单词,相似度也越大(要记住了)
我们先看看skip-gram(SG)的意思
根据核心假设,我们知道离得近的单词,它们非常相似,既然是相似的,那么我们能不能用周围的词去表达中间的词呢!很明显这是成立的,我们也可以根据中间词预测周围词。
这里我们说的是skip-gram,也就是根据中间词预测周围词,它的效果要比CBOW好一些,CBOW就是根据周围词去预测中心词,很明显根据中间词预测周围词的难度大些,所以SG效果更好
看上面那张图,假设已经知道了中间词如 “working”,我们要预测它的上下文词(we, are, on, NLP),这里设置的window size= 2,即中心词的左边2个,右边两个,当然也可以设置为其他值
我们怎么把这个过程用数学描述呢??其实就是条件概率 P(we| working) 我们希望这个概率越大越好,也就越逼近真实的"we"。然后我们把上面所有条件概率连乘可以得到
具体的算法过程还要包含 We, are, is, interesting 作为中心词时的概率,这里没有写上去。注意:连乘是要包含所有单词作为中心词的概率。 上图中只写了“working”,“on”,NLP“,”project“,”it“作为中心词时的概率。
上面就是我们目标函数的框架,我们现在的问题是如何用参数θ来表示每一个条件概率如P(we| working) ,如果能表示出来,我们就可以用梯度下降法解出这个θ
2.2 SG的目标函数
在训练SG时,不管有多少个文本,我们都会把它们拼接成一个很长很长的句子,这里就叫他 Text 吧,我们只要把 Text 放到模型中去训练就行了
我们把上图中的连乘用一个公式表示:
Text:就是我们说的很长很长的句子
w:是Text中的每一个单词
c :是 w 的上下文单词,如 w = “working”, c = (we, are, on, NLP)
θ :是模型的参数
里面的 ∏ 表示对于每一个单词w,以它作为中心词,以 c 中每一个元素作为上下文词的条件概率 的连乘,如 w = “working”, c = (we, are, on, NLP),则里面的连乘就是 p(we|working) x p(are|working) x p(on|working) x p(NLP|working)
外面的 ∏ 表示对于Text中的每个单词都要做连乘
2.3 θ 长什么样?
这里的参数θ,包含了两个矩阵 U,V,即 θ = [U , V]
U:表示每个单词作为上下文词的词向量
V:表示每个单词作为中心词的词向量
U,V 的维度是一模一样的,两个都是词向量矩阵,只是一个代表单词w 的上下文词向量,一个代表单词 w 的中心词词向量,通常我们会选择V,而不要 U
2.4 例子
1.我们的语料库(分完词之后):
文章1:今天 天气 很好
文章2:今天 上 NLP 课程
文章3:NLP 是 目前 最火的 方向
2. 组成Text:
Text = [今天, 天气, 很好, 今天,上,NLP ,课程,NLP ,是,目前,最火的,方向]
3. 令 window size = 1
4. 目标函数
p(天气 |今天)x p(今天 |天气)x p(很好 |天气)x p(天气 |很好)x p(今天 |很好)x p(很好 |今天)x p(上 |今天)x p(今天 |上)x p(NLP |上)x p(上 |NLP)x p(课程 |NLP)x p(NLP |课程)x p(NLP |课程)x p(课程 |NLP) x p(是 |NLP)x p(NLP |是)x p(目前 |是)x p(是 |目前)x p(最火的 |目前)x p(目前 |最火的) x p(方向 |最火的) x p(最火的 |方向)
5. 写成公式
6. 取对数形式
从目标函数可以看出来每个词既作为中心词,也作为上下文词出现了,这就是为什么参数θ,包含了两个矩阵 U,V,即 θ = [U , V]。
3.条件概率长什么样?
我们使用 softmax 来表示条件概率 p(c | w; θ)
具体公式如下
•:表示内积
u_c, v_w 是两个向量,两个向量的内积可以表示它们之间的相似度,我们希望 p(c|w:θ) 越大越好,放到公式中就是内积越大越大越好,所以单词也就越相似。
c’ :是词库中的每一个单词
w:是中心词
c:给定中心词下的上下文单词
这个公式有什么缺点呢?
我们可以看到:每计算一个单词w和它上下文词c时,我们都要遍历词库中所有的单词c’,因为分母有个求和项。通常词库中的单词个数是数以万计的
算法复杂度 o(Text) • o(window size)• o(V)
我们有两种方法去优化这个公式
- 负采样
- 层次softmax
4. SG目标函数
代入 p(c|w;θ)之后,可得
5. 负采样
5.1 定义D 和 D~
5.2 条件概率整容了??
在原来的SG模型中,我们希望 p(c|w ;θ) 值越大越好。而在负采样模型中,我们是希望 p(D = 1| wi, wj; θ) 的值越大越好。
p(D = 1| wi,wj ; θ) 表示给定两个单词wi,wj, 如果它们出现在正样本对中,那我们就最大化这个概率,如果出现在负样本对中,那我们就最小化这个概率p(D =1| wi,wj ; θ) ,相当于最大化 p(D = 0| wi,wj ; θ)
D= 1表示在正样本中; D = 0 表示在负样本中
5.3 怎么判断wi,wj是在正样本还是负样本中呢
用逻辑回归来判断(wi,wj )是在正样本还是负样本中,因为逻辑回归很擅长做二分类
- *:是内积的意思
- u_wi * v_wj 越大, P值也越大, wi 和 wj 也越相似
5.4 负采样的目标函数
- (w,c) ∈ D:表示正样本中的每对词; w是 中心词, c 是 w 的上下文单词,我们希望出现在正样本中的单词对概率越大越好
- (w,c) ∈ D~:表示负样本中的每对词。w是 中心词, c 是 w 的非上下文单词,我们希望这对单词出现在正样本中(D=1) 的概率越小越好,反过来说就是这对单词出现在负样本中(D = 0)概率越大越好
- p(D=0 | w,c;θ) = 1 - p(D= 1 | w,c;θ)
- σ(u_c, v_w) = 1/ (1+ exp(-u_c, v_w))
我们再来看这个公式有什么问题??
- D~中的词对(w,c) 非常多,求和的话仍然没有起到多大简化作用
- 方法:只在负样本中采样若干个词对,一般可以取10个
简化后的目标函数
N:表示取 N 个负样本
c’ :表示以 w 为中心词,采 N 个 w 的非上下文词对
中括号左边一项是正样本的概率,右边一项是 N 个负样本的概率
举个栗子便于理解
s = I like NLP, but it is hard
vocab = [ I, like, NLP, but, it , is hard]
window size = 1
我们随便找一个词 it 为中心词
(1) 正样本(w = it,c = but), 负样本我们可以在词库中找除了 but 和 is 外的所有单词,如(it, like), (it, hard)
(2) 正样本(w = it,c = is), 负样本我们可以在词库中找除了 but 和 is 外的所有单词,如(it, NLP), (it, hard)
6. 梯度下降法求 θ
注意:简化后的目标函数虽然没看到 θ 的影子,但其实 u, v 就是 θ
1)求u_c的梯度
求导公式 : σ’ = σ • (1-σ)
2)求 u_c’的梯度
求导公式 : σ’ = σ • (1-σ)
3)求 v_w 的梯度
4)梯度下降
7.评估词向量好坏
1)通过降维来可视化学习到的词向量是否有聚类关系,如下图形式
2)从训练好的词向量中选择一些词对计算相似度(如余弦相似度),与人工标记的相似度进行比较。缺点是需要人工标记
3)词向量是否具有类比关系,如
woman::man
北 京::上海
那么 girl ::?, 东京::?
一个好的词向量是能捕获到类比关系的,
如girl ::boy
东京::日本
那算法要怎么找到boy呢?
我们先要计算 woman - man (向量的差),然后 girl 和词库中每个训练完的单词做差值,找出与woman - man 最相近的那个就行了