NLP[3] - [Word Embedding系列] : Word2vec的Skip-gram模型

 
本《Word Embedding系列》文章包括:

(1)One-hot编码
(2)Word Embedding
(3)LSA(Latent Semantic Analysis)
(4)Word2vec的CBOW模型
(5)Word2vec的Skip-gram模型
(6)GloVe模型
(7)相关编程实现
 

本文介绍Word2vec的Skip-gram模型


 

一、Word2vec的Skip-gram模型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我这里仍然附上一篇 CS224n-2019 笔记列表 整理的博客。

 
 

二、Word2vec的训练trick

在了解Word2vec的一些训练技巧时,不妨看看知乎中关于Word2vec的一些看法:
word2vec 相比之前的 Word Embedding 方法好在什么地方?

其中有一点讲了Word2vec之所以流行的原因有:

1、极快的训练速度。以前的语言模型优化的目标是MLE(极大似然估计),只能说词向量是其副产品。Mikolov应该是第一个提出抛弃MLE(和困惑度)指标,就是要学习一个好的词嵌入。如果不追求MLE,模型就可以大幅简化,去除隐藏层。再利用HSoftmax以及负采样的加速方法,可以使得训练在小时级别完成。而原来的语言模型可能需要几周时间。
 
2、一个很酷炫的man-woman=king-queen的示例。这个示例使得人们发现词嵌入还可以这么玩,并促使词嵌入学习成为了一个研究方向,而不再仅仅是神经网络中的一些参数。
 
3、word2vec里有大量的tricks,比如噪声分布如何选?如何采样?如何负采样?等等。这些tricks虽然摆不上台面,但是对于得到一个好的词向量至关重要。
 
举一个生活中的例子,语言模型和word2vec的关系可以类比于单反相机和美颜手机,它们的受众不一样。就照片质量(MLE)而言,单反肯定好。但如果更关心美颜(词嵌入)和便携性(训练速度),美颜手机就更受欢迎。


为什么要用训练技巧呢? 如我们刚提到的,Word2vec 本质上是一个语言模型,它的输出节点数是 V 个,对应了 V 个词语,本质上是一个多分类问题,但实际当中,词语的个数非常非常多,会给计算造成很大困难,所以需要用技巧来加速训练。

这里我总结了一下这两个 trick 的本质,有助于大家更好地理解:

Hierarchical softmax
本质是把 N 分类问题变成 log(N)次二分类
 
Negative sampling
本质是预测总体类别的一个子集

 
 

2.1 Hierarchical softmax

在一些文献中你会看到hierarchical softmax classider。什么意思呢?也就是在sofmax层不一次到位求出每个词的概率,而是通过分类的方式,第一个分类器告诉你这个词是在词汇表的5000前还是后,第二个分类器告诉你是在2500前还是后,以此类推,直到找到那个准确的词。像我们平时玩的猜数字游戏,一个人先在纸上写好一个数字,然后开始让大家猜,然后一步一步逼近真实数字,直到猜中的人接受真心话大冒险

画出来的形状是树状的,每个节点是一个分类器:

在这里插入图片描述

参考这篇博客:【序列模型】第二课–自然语言处理与词嵌入


 
 
同样,我们附上另外CS224n的课堂notes,在笔记中详细讲解了使用一个二叉树来表示词表中的所有词。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

 
 

2.2 Negative sampling

前面讲述了用分级softmax 分类器去降低softmax层的计算复杂度,这一节讲述一个更好的方法,叫做负采样,来一起看看吧~
 
 

(1)准备样本
在这里插入图片描述
和上一节一样,随机采出一个词作为context词,再在给定的词距下随机获取该词的target词,形成一组样本:orange–>juice。这组样本是一个正样本。

有了正样本,就肯定需要负样本,负样本是这样得到的:context词不变,然后随机从词典中采样出k个词,这些词可以是句子中没有的词,也允许是句子中有的词,总之随缘就好,不强求,于是context词就与这些随机从词典中采样的词形成了几对负样本:
在这里插入图片描述
关于k的数目,如果你的数据集很小,那么k在5-20之间,如果你有大数据集,那么k在2-5之间
 
 
(2)训练模型
有了样本之后,就可以训练一个监督模型了。
模型的输入x是词对,也就是我们上面准备好的正样本与负样本;模型的输出y是一个二分类,若正样本则为1,负样本则为0。显而易见,这个模型对目的是去学习两个词是否是临近词,临近词为正样本,非临近词为负样本。

这样的二分类我们选择用逻辑回归模型去构造:
在这里插入图片描述
公式里有两个参数,一个是目标词的参数向量θ(t),一个是上下文词e©,即每个contxt word的词嵌入向量。利用上面公示预测处t,c共现时y=1时的概率

纵观整个神经网络模型,前面的套路不变:
(1)输入context word的one-hot向量
(2)乘以嵌入矩阵E
(3)得到context word的词嵌入
(4)进入神经网络,输出10000维向量(10000是词典长度)

要注意的是第(4)步,这个输出并不是之前的softmax的10000个概率,而是10000个逻辑回归二分类器,表示词典中每个索引上的词是否与context临近。
但!并不是每次训练都要训练全部10000个逻辑回归,我们只训练其中5个,分别是,那个正样本的target词所在位置的逻辑回归模型,和另外四个采样的负样本所在位置的模型(假设我们设置了k=4)。

如此以来,原来复杂的要计算10000次的softmax层变成了计算相对简单的10000个逻辑回归二分类模型,且每次训练只需要训练k+1个logistic unit,是不是大大减小了计算量呢~

 
 
(3)如何选取负样本
那么如何进行更优的负采样呢?
论文的作者Mikoolov等人根据经验认为根据一下经验值采样会更好:
在这里插入图片描述
w i w_i wi 表示第 i 个词, f ( w i ) f(w_i) f(wi)表示第i个词在所有语料中的词频。


 
 
同样,我们附上另外CS224n的课堂notes,在笔记中详细讲解了负采样的公式推导过程,以及使用了负采样后引入了sigmoid激活函数实现二分类,改变了原本的目标函数J(θ)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

个人对新的目标函数的理解是:
在重新进行SVD更新参数时,只考虑了k个词向量。也就是说每次训练只是需要训练k个词向量,大大减小了计算量。但值得注意的是,原本的softmax激活函数改成了sigmoid二分类的激活函数也可以提高运算效率。

 
 


参考博客:
【1】Word2Vec:https://www.tensorflow.org/tutorials/text/word2vec
【2】word2vec详解:https://nocater.github.io/2018/12/29/word2vec%E8%AF%A6%E8%A7%A3/
【3】Word2Vec Tutorial - The Skip-Gram Model:http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
【4】Embedding从入门到专家必读的十篇论文:https://zhuanlan.zhihu.com/p/58805184
【5】[NLP] 秒懂词向量Word2vec的本质:https://zhuanlan.zhihu.com/p/26306795
【6】理解 Word2Vec 之 Skip-Gram 模型:https://zhuanlan.zhihu.com/p/27234078
【7】Word2Vec介绍:直观理解skip-gram模型:https://zhuanlan.zhihu.com/p/29305464

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值