CS224n笔记——Word Vectors and Word Senses(二)


系列文章

Lecture 1: Introduction and Word
Lecture 2: Word Vectors and Word Senses


1. 复习word2vec

  • 遍历整个语料库中的每个单词
  • 用词向量预测上下文

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(oc)=wϵVexp(uwTvc)exp(uoTvc)

word2vec中参数的计算

  1. 其中, U U U V V V分别为上下文单词和中心词,U中有6个单词,V中也有6个单词,每个单词都是5维的
  2. U和 v 4 T v_4^T v4T点乘
  3. softmax,得到上下文单词的概率分布

Word2vec通过在空间中放置相似的词来最大化目标函数

2. 优化

梯度下降(GD)

  • 更新方程 (以矩阵形式表示)
    θ n e w = θ o l d − α ∇ θ J ( θ ) \theta^{new}=\theta^{old}-\alpha \nabla_\theta J(\theta) θnew=θoldαθJ(θ)

  • 更新方程 (对于单个参数)
    θ 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(θ)

问题: J ( θ ) J(\theta) J(θ)是语料库中所有窗口的函数(可能是数十亿!),所以 ∇ θ J ( θ ) \nabla_\theta J(\theta) θJ(θ)的计算代价十分昂贵,而且你可能等很久才有一次更新

解决方法:****随机梯度下降(SGD),在每一次的sample窗口内更新一次

  • 迭代地在每个这样的窗口为SGD取梯度,但是在每个窗口中,我们最多只有2m + 1个单词,所以 ∇ θ J ( θ ) \nabla_\theta J(\theta) θJ(θ)非常稀疏(会有很多的0元素),我们只能更新出样本中出现的向量,如图:

负采样skip-gram模型

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(oc)=wϵVexp(uwTvc)exp(uoTvc)

对于这个公式,我们可以看出来,归一化时分母需要对整个语料进行计算,这是非常昂贵的。

负采样算法将问题变成了二分类问题:即给定两个词,预测这两个词是否应该在一起

Distributed Representations of Words and Phrases and their Compositionality” (Mikolov et al. 2013),该论文中给出的目标函数为:

其中这里的 σ \sigma σ是sigmiod函数,即

σ ( x ) = 1 1 + e − x \sigma(x)=\frac {1}{1+e^{-x}} σ(x)=1+ex1

这里优化目标函数,是使其最大化

改进后的目标函数为:

  • 取k个负样本
  • 使真实的上下文单词出现的概率最大化
  • 使用unigram分布来选负样本词,其中,分母Z是用于归一化,以使所有的词被选取的概率和等于一,通过这种方式,减少你采样中非常常见的单词,使频率较低的单词(稀有词)被更频繁地采样,unigram分布:

P ( w ) = U ( w ) 3 / 4 / Z P(w)=U(w)^{3/4}/Z P(w)=U(w)3/4/Z

实质:每次让一个训练样本只更新部分权重,其他权重全部固定,减少计算量

对于负采样的详细介绍,可以参考下面这几篇文章:
https://blog.csdn.net/ningyanggege/article/details/87869393
https://www.cnblogs.com/cloud-ken/p/9556278.html
https://www.imooc.com/article/29453
https://blog.csdn.net/itplus/article/details/37998797

3. 基于统计的词向量

词向量目的:希望通过低维稠密向量来表示词的含义

课程中举了一个例子:三个句子,比如对于like这个词,在三个句子中,其左右共出现2次I,1次deep和1次NLP,所以like对应的词向量中,I、deep和NLP维的值分别为2,1,1。

不足点

但这些预训练模型也存在不足:

  • 词梳理很多时,矩阵很大,维度很高,需要的存储空间也很大
  • 当词的数目是在不断增长,则词向量的维度也在不断增长
  • 矩阵很稀疏,即词向量很稀疏,会遇到稀疏计算的问题

https://pdfs.semanticscholar.org/73e6/351a8fb61afc810a8bb3feaa44c41e5c5d7b.pdf

上述链接中的文章对例子中简单的计数方法进行了改进,包括去掉停用词、使用倾斜窗口、使用皮尔逊相关系数等,提出了COALS模型,该模型得到的词向量效果也不错,具有句法特征和语义特征。

4. GloVe

GloVe的全称是GloVe: bal Vectors for Word Representation

是这门课的老师Christopher D. Manning的研究成果

GloVe目标是综合基于统计和基于预测的两种方法的优点。

模型目标:词进行向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息

流程:输入语料库–> 统计共现矩阵–> 训练词向量–>输出词向量

构建统计共现矩阵X

X i j 代 表 单 词 X_{ij}代表单词 Xij

i表示上下文单词

j表示在特定大小的上下文窗口(context window)内共同出现的次数。这个次数的最小单位是1,但是GloVe不这么认为:它根据两个单词在上下文窗口的距离dd.

提出了一个衰减函数(decreasing weighting):用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小。

构建词向量和共现矩阵之间的关系

w i T w ~ j + b i + b ~ j = log ⁡ ( X i j ) w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde{b}_{j}=\log \left(X_{i j}\right) wiTw~j+bi+b~j=log(Xij)

其中, w i T w_{i}^{T} wiT w ~ j \tilde{w}_{j} w~j是我们最终要求解的词向量; b i b_{i} bi b ~ j \tilde{b}_{j} b~j分别是两个词向量的bias term
那它到底是怎么来的,为什么要使用这个公式?为什么要构造两个词向量 w i T w_{i}^{T} wiT w ~ j \tilde{w}_{j} w~j

有了上述公式之后,我们可以构建Loss function:
J = ∑ i , j = 1 V f ( X i j ) ( w i T w ~ j + b i + b ~ j − log ⁡ ( X i j ) ) 2 J=\sum_{i, j=1}^{V} f\left(X_{i j}\right)\left(w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde{b}_{j}-\log \left(X_{i j}\right)\right)^{2} J=i,j=1Vf(Xij)(wiTw~j+bi+b~jlog(Xij))2
loss function的基本形式就是最简单的mean square loss,只不过在此基础上加了一个权重函数 f ( X i j ) f\left(X_{i j}\right) f(Xij),那么这个函数起了什么作用,为什么要添加这个函数呢?我们知道在一个语料库中,肯定存在很多单词他们在一起出现的次数是很多的(frequent co-occurrences),那么我们希望:

  • 这些单词的权重要大于那些很少在一起出现的单词,因此这个函数要是非递减函数(non-decreasing);
  • 但这个权重也不能过大,当到达一定程度之后当不再增加;
  • 如果两个单词没有在一起出现,也就是 X i j X_{ij} Xij,那么他们应该不参与到loss function的计算当中去,也就是f(x)要满足f(x)=0

为此,作者提出了以下权重函数:
f ( x ) = { ( x / x max ⁡ ) α  if  x < x max  1  otherwise  f(x)=\left\{\begin{array}{cc} \left(x / x_{\max }\right)^{\alpha} & \text { if } x<x_{\text {max }} \\ 1 & \text { otherwise } \end{array}\right. f(x)={(x/xmax)α1 if x<xmax  otherwise 
实验中作者设定 x max ⁡ = 100 x_{\max }=100 xmax=100,并且发现 α = 3 / 4 \alpha=3 / 4 α=3/4时效果比较好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值