word2vec理解及pytorch实现


word2vec是Google研究团队的成果之一,它作为一种主流的获取分布式词向量的工具,在自然语言处理、数据挖掘等领域有着广泛的应用。本文首先会介绍一些预备知识,比如softmax、ngram、subsampling、neg-sampling等,之后来讲解word2vec的原理,并着手使用pytorch搭建word2vec模型。

word2vec优点

word2vec词向量与传统的one-hot词向量相比,主要有以下两个优势

1.低维稠密

一般来说分布式词向量的维度设置成100-500就足够使用,而one-hot类型的词向量维度与词表的大小成正比,是一种高维稀疏的表示方法,这种表示方法导致其在计算上效率比较低。

2.蕴含语义信息

one-hot这种表示方式使得每一个词映射到高维空间中都是互相正交的,也就是说one-hot向量空间中词与词之间没有任何关联关系,这显然与实际情况不符合,因为实际中词与词之间有近义、反义等多种关系。Word2vec虽然学习不到反义这种高层次语义信息,但它巧妙的运用了一种思想:“具有相同上下文的词语包含相似的语义”,使得语义相近的词在映射到欧式空间后中具有较高的余弦相似度。
s i m ( a p p l e , b a n a n a ) = v e c a p p l e ⋅ v e c b a n a n a ∣ v e c a p p l e ∣ ⋅ ∣ v e c b a n a n a ∣ sim(apple, banana) =\frac{vec_{apple}·vec_{banana}}{|vec_{apple}|·|vec_{banana}|} sim(apple,banana)=vecapplevecbananavecapplevecbanana

图1

Skip-gram模型

1.训练样本

怎么把“具有相同上下文的词语包含相似的语义”这种思想融入模型是很关键的一步,在模型中,两个词是否出现在一起是通过判断这两个词在上下文中是否出现在一个窗口内。例如,原始样本“The quick brown fox jumps over the lazy dog.”在送入模型前会经过图2所示处理(这里为了绘图简单假设窗口为2,一般窗口是设置成5)。

如图所示,skip-gram模型的输入是当前词,输出是当前词的上下文,虽然我们训练模型的时候喂的是一个个分词好的句子,但内部其实是使用一个个word pair来训练。同样是之前的case“The quick brown fox jumps over the lazy dog.”,假如窗口改为5,则(The,quick)这个word pair会成为一个训练样本。

假如两个词具有相同的输出,则可反推出作为输入的两个词之间具有较高相似性,接下来就是如何使用模型来实现上述目标。

图2

2.skip-gram

skip-gram模型与自编码器(Autoencoder)类似,唯一的区别在于自编码器的输出等于输入,而skip-gram模型的输出是输入的上下文。那么,作为训练样本的word pair应该以什么样的方式输入给模型? 答案是one-hot向量,为了得到one-hot向量,必须首先知道训练语料中包含了多少词。因此,在训练之前会首先对语料进行统计,得到词表。假设词表长度为10000,词向量为300维,则skip-gram模型可表示为图3。

图3

如图3所示,假设输入的word pair为(ants, able),则模型拟合的目标是 M a x   P ( a b l e ∣ a n t s ) Max \ P(able|ants) Max P(ableants),同时也需要满足 M i n   P ( o t h e r   w o r d s ∣ a n t s ) Min \ P(other \ words|ants) Min P(other wordsants),这里利用的是对数似然函数作为目标函数。上述表述中可表示为 P ( a b l e ∣ a n t s ) P(able|ants) P(ableants)
P ( a b l e ∣ a n t s ) = s o f t m a x ( X a n t s   1 × 10000 ⋅ W 10000 × 300 ) P(able|ants)=softmax(X_{ants \ 1 \times 10000} · W_{10000 \times 300}) P(ableants)=softmax(Xants 1×10000W10000×300)
s o f t m a x ( X ) = e x p ( X 1 × 300 ⋅ W 300 × 1 ) ∑ i = 1 10000 e x p ( X 1 × 300 i ⋅ W 300 × 1 ) softmax(X) = \frac {exp(X_{1 \times 300}·W_{300 \times 1})}{\sum_{i=1}^{10000}exp(X_{1 \times 300}^i·W_{300 \times 1})} softmax(X)=i=110000exp(X1×300iW300×1)exp(X1×300W300×1)
根据 P ( a b l e ∣ a n t s ) P(able|ants) P(ableants) P ( o t h e r   w o r d s ∣ a n t s ) P(other \ words|ants) P(other wordsants),可构建似然函数:
L ( W ) = P ( a b l e ∣ a n t s ) y = a b l e ⋅ P ( o t h e r   w o r d s ∣ a n t s ) y = o t h e r   w o r d s L(W)=P(able|ants)^{y=able}·P(other \ words|ants)^{y=other \ words} L(W)=P(ableants)y=ableP(other wordsants)y=other words
则:
l o g   L ( W ) = { y = t a r g e t   w o r d } { l o g   P ( a b l e ∣ a n t s ) + l o g   P ( o t h e r   w o r d s ∣ a n t s ) } = ∑ i 10000 { y = t a r g e t   w o r d } l o g P ( w o r d i ∣ a n t s ) log \ L(W) = \{y=target \ word \} \{log \ P(able|ants) + log \ P(other \ words |ants) \} \\ = \sum_{i}^{10000} \{ y=target \ word \}logP(word_i|ants) log L(W)=

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值