前言
斯坦福CS224n第三讲,主要讲解了基于计数和直接预测的词向量训练方法,并介绍了结合了两者优点的GloVe方法,并对参数设置,训练效果对比进行了简单讲解。这篇笔记主要用于个人记录,以免遗忘。
文章目录
word2vec回顾
- 遍历词表中的每一个单词
- 利用下列公式预测中心词的上下文(skip-gram)
- 在每一个这样的窗口内做随机梯度下降(SGD)
存在的问题
- 在每一个窗口内做SGD时,由于窗口大小一般为5~10,而 j ( θ ) j(\theta) j(θ)中的 θ \theta θ是包含所有词向量的矩阵,所以梯度更新时的矩阵十分稀疏
- 每次梯度更新过程中需要计算全部词向量的累加,也就是公式 p ( o ∣ c ) p(o|c) p(o∣c)的分母,当词典很大时,庞大的运算量导致这个过程很难计算。
解决方法
- 只更新特定的列,或者通过哈希表来为每个单词构建到单词向量的哈希映射
- negative sampling
负采样的思想是对每一个正例(即中心词与窗口内的一个词语)采样几个负例(即中心词和词表中的其他词语),训练一个二分类器。
总体目标函数是 j ( θ ) = 1 T ∑ t = 1 T j t ( θ ) j(\theta)=\frac{1}{T}\sum_{t=1}^{T}j_{t}(\theta) j(θ)=T1∑t=1Tjt(θ)
j t ( θ ) = l o g σ ( u o T v c ) + ∑ i = 1 k E j p ( ω ) [ l o g σ ( − u j T v c ) ] j_t(\theta)=log\sigma(u_o^Tv_c)+\sum_{i=1}^{k}E_{j~p(\omega)}[log\sigma(-u_j^Tv_c)] jt(θ)=logσ(uoTvc)+∑i=1kEj p(ω)[logσ(−ujTvc)]
其中t代表需要遍历的每一个窗口,k是采样个数, p ( ω ) p(\omega) p(ω)是一个unigram分布,这使得频率低的单词被采样为负例的可能性更大。注: 1 − σ ( x ) = σ ( − x ) 1-\sigma(x)=\sigma(-x) 1−σ(x)=σ(−x)
这个目标函数第一部分是中心词与窗口内的词出现的概率,即正例,第二部分是中心词与词表的其他词出现的概率,这里的物理意义就是将第一部分的概率变大,第二部分概率变小。
优化的效果是word2vec将相似的词语放在一起,使得距离更近:
提到的一个trick
因为目标函数是非凸的,所以初始化很重要。随机初始化时,选择较小的随机数能够尽量避免局部最优。
基于共现矩阵的词嵌入模型
word2vec是基于窗口共现的基本思想,所以很容易联想到是否可以直接通过统计窗口共现的次数进行词向量表示。其实,在word2vec出现之前就有过这种方法,利用窗口构成共现矩阵。比如有如下三句话,设窗口大小为1:
- I like deep learning .
- I like NLP .
- I enjoy flying .
会得到如下共现矩阵
这个共现矩阵是通过统计窗口内单词出现次数构成的,比如单词I,在窗口大小为1的范围内,like在I的窗口内出现两次,enjoy出现1次,这样就构成了第一行,以此类推,构成共现矩阵。
基于共现矩阵的弊端
这样构成的共现矩阵很直观,但是也有很多弊端:
- 当出现新词时,整个共现矩阵都需要更新,甚至维度都需要改变,这样导致如果有下游机器学习模型接收这些向量的输入,需要改变参数设置
- 当单词数量过多时,向量的维度太大
- 向量稀疏
解决方法
共现矩阵最严重的问题就是维度过高,所以从维度入手进行解决,对向量进行降维,通常讲到25-1000维。课程中讲到的方法是奇异值分解SVD,SVD的基本原理可以参考:https://www.cnblogs.com/pinard/p/6251584.html
进一步改进
以上方法还存在的一个问题就是一些类似于is、the这样的词出现的频率太高,因为这些词并没有太多实际意义,所以会影响词向量的表达。改进方法如下:
- 限制高频词的最高频次
- 去除停用词
另外,还有其他的一些改进方法:
- 根据与中心词的距离进行权重衰减
- 使用皮尔逊系数代替词频
效果
对基于SVD的方法进行改进,虽然方法简单,但是也取得了不错的效果
SVD的问题
- 计算复杂度高:对n×m的矩阵是 O ( m n 2 ) O(mn^2) O(mn2)
- 不方便处理新词或新文档
- 与其他DL模型训练套路不同
基于计数(共现矩阵等)VS直接预测(skip-gram等)
基于计数(LSA,COALS)
优点:
- 在中小规模语料上训练速度快
- 充分利用统计信息
缺点:
- 不能很好捕捉词语相似性
- 无法拓展到大规模语料
直接预测(skip-gram、RNN)
优点:
- 很好捕捉词语相似度
- 在其他任务上有更好的表现
缺点:
- 缩放语料库尺寸(窗口共现)
- 无法利用全局统计信息
GloVe
目标函数
J
(
θ
)
=
1
2
∑
i
,
j
=
1
w
f
(
P
i
j
)
(
u
i
T
v
j
−
l
o
g
P
i
j
)
J(\theta)=\frac{1}{2}\sum_{i,j=1}^{w}f(P_{ij})(u_i^Tv_j-logP_{ij})
J(θ)=21∑i,j=1wf(Pij)(uiTvj−logPij)
其中
P
i
j
P_{ij}
Pij是共现次数,f是最大值函数,用来限制该频次的最大频次。
优点:
- 训练速度快
- 适用于大规模语料
- 在小规模预料上表现也很好
训练得到的两个向量u和v,实验证明,将两个向量相加得到的最终词向量是最好的,即:
X
f
i
n
a
l
=
u
+
v
X_{final}=u+v
Xfinal=u+v
评价方法
课程中讲到了两种评价方法,Intrinsic(内部的)和extrinsic(外部的)。所谓intrinsic就是通过人工标注一些语料,与模型结果进行比较,优点是虚度快,缺点是不知道知否对实际任务真正有影响。而extrinsic是根据在具体任务上的表现来评测词向量的好坏。
intrinsic
词向量类推法,也就是进行词语之间的相对比较,比如man相对woman等价于king相对queen。
这种方法的可视化可以发现,类比的词之间是相互平行的
另外,还可以做语法上的类推
其他有趣类推
其他的一些内部评价方法,比如人工定义词语之间的相似度,通过比较模型训练出来的词向量,判断效果。课程中提到的一个数据集WordSim353
课程接下来讲解了一些效果的对比,在此处仅记录一些结论性内容:
- 训练的词向量维度高不一定效果好,单词词库规模越大效果越好
- Glove训练的词向量参数:300维,窗口大小为8,。此时效果好
- 维基百科训练的效果比新闻语料训练的效果好
extrinsic
通过具体的下游任务来判断训练效果,比如命名实体识别,下一节会详细介绍。
简单的单词分类
简单介绍了基于softmax进行单词分类,无太多实质性内容。