Skip to content

Latest commit

 

History

History
133 lines (34 loc) · 4.95 KB

聊一下Word2vec-模型篇.md

File metadata and controls

133 lines (34 loc) · 4.95 KB

本文大概需要阅读 5.25 分钟

大概用三篇文章好好谈一下Word2vec,这篇主要是关于 Word2vec 的两种模型。

先问大家个问题:一个词通过Word2vec训练之后,可以得到几个词向量?

如果您有点懵,说明我写对了,您慢慢看下去,码字不易,请多多点赞,让更多人看到,谢谢。

词向量一般被认为是一个词的特征向量,也就是说可以代表一个词的含义。一个中文词,比如"中国"这个词,是很难被神经网络直接作为输入,我们需要将词向量化(或者说数字化),才能更好的喂进神经网络。

这个过程很类似于计算机在处理我们输入的文字的时候,会转化为二进制进行处理。

只不过这个二进制表达规则我们会自己人为规定,而词向量这个向量表达根据不同的方式会有着不同的结果。想一下,两者是不是很类似

谈到向量表达单词,一般首先想到的都是One-Hot编码。但是它是有缺点的。我这里谈两个缺点。

首先是维度灾难:如果我们有1万个单词,那么你的One-hot去表示每个单词的的时候,会转变为一个1万维度的向量。

那么在计算的时候会带来巨大的不便,而且向量矩阵极其稀疏,占据了太多不必要的内存。当然对于维度灾难,我们一般可以使用PCA等降维手段来缓解。

其次是语义表达不足。这一点很简单,”娱乐“与”八卦“两个词,通过One-hot编码得到的向量,计算Consine得到相似度为0。

这显然是不合适的。One-Hot编码表示出来的词向量是两两正交的,从余弦相似度的角度来看,是互不相关的,所以 One-Hot 不能很好的表达词语的相似性。

这个时候,我们再来看 Word2vec。首先,要明确一点,Word2vec 不是一个模型,而是一个工具。这个点虽然无伤大雅,但是每每看到有的文章说它是个模型,就有点...

Word2vec 从整体上理解,就是包含两个模型(CBOW and Skip-gram)和两个高效的优化训练方式(负采样和层序softmax)

这个文章主要谈一下两种模型。

先假定我们的窗口大小为2,也就是说中心词前面有两个词,后面有两个词,比如"我/永远/爱/中国/共产党",抽象出来就是:

W_{t-2},W_{t-1},W_{t},W_{t+1},W_{t+2}

对于Skip-gram,中文我们叫跳字模型,使用中心词预测背景词。也就是用"爱"去预测其他的四个词。

对于CBOW,中文我们叫连续词袋模型,使用背景词预测中心词,也就是用"我","永远","中国","共产党" 去预测"爱"。

CBOW的模型架构,从整体上,我们可以分为三层:输入层,投影层,和输出层。

对于输入层,对应的是窗口中的单词,也就是例子中"我","永远","中国","共产党" 四个词的词向量,在投影层,将四个词的词向量进行相加求平均,输出层在没有优化的前提下,维度为词表大小,随后做 Softmax即可。

Skip-gram模型架构很类似,只不过可以省去投影层,因为输入为中心词,是一个单词的词向量,无从谈起求和与平均了。

接下来,我们来详细谈一下Skip-gram。

对于一个神经网络模型,我们需要确定我们的优化目标或者说目标函数是什么?

对于Skip-gram,其实很容易理解,就是我要最大化在给出中心词的条件下背景词出现的概率,公式如下

\prod_{t=1}^T \ \prod_{-m\leq j \leq m,j\neq 0} P(w^{t+j}|w^{t})

这个公式对应着两个连乘,第一个连乘是对应 T 个输入样本,也就是说我们文本中的每个单词都要做中心词。第二个连乘代表着给定一个中心词的情况下,窗口中的单词出现的概率,内含相互独立的假设

在这里,有一个细节点想要提醒大家在词汇表中的每个单词,都是对应两个词向量的一个是在作为中心词的时候的中心词向量,一个是在作为背景词时候的背景词向量

优化目标函数的时候,为了减少复杂度(也就是忽略 T),我们可以使用随机梯度下降,针对每一个样本我们都更新一次参数。

通过公式推导(略),我们能够观察到一个特点,就是每次更新参数,都会涉及到词典中的全部词汇,这是因为我们在做 Softmax 的时候,是分母是针对所有词汇的操作。

这样的操作的复杂度是 O(|V|),其中|V|就是我们词汇表的大小。CBOW 其实是很类似的情况,每次更新都会涉及到我们的全部词汇。

于是,我们就需要对此进行优化,使用了两种近似的训练方式来高效的训练Word2vec,降低训练的复杂度。

下一个文章谈一下优化方式。

如果觉得写的还行,帮忙点个赞或者在看,让更多人关注到我吧,感谢。