Word2Vec

Word2Vec

在自然语言发展的早期阶段,词的表示经历了不断地发展和改进,直到后来有一种word vector的思想被提出以及后续的实现,才极大地促进了NLP的发展。

word vector的核心思想:

为每个单词构建一个密集向量,选择后的向量与出现在类似上下文中的单词向量相似。

注:word vectors 也叫 word embeddings 或者 (neural) word representations,它们是分布式表示的。

这样的思想确实很好,可是如何实现是一个难点,实际上在2003年,Neural Probabilistic Language Model就实现了符合这种需求的词向量,不过它的本意是训练一个语言模型,词向量的生成只不过是一个附属物,并且鉴于此模型中只使用了有限的前文信息,并且计算量过大,在2013年 Mikolov等人提出一个改进模型,用于学习词向量的表示。该模型的核心技术包括以下几点 。

Skip-gram

实际上skip-gram源于n-gram的思想,n-gram是一种基于统计语言模型的算法,将给定的文本进行分片处理,具体几个词分为一片取决于n,比如常见的有2-gram、3-gram, 该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。

skip-gram是通过中心词来推断上下文一定窗口内的单词。

图中中心词为t位置的词,滑动窗口大小为5。

Skip-gram模型的训练目标是找到有助于预测句子或文档中周围单词的单词表示。其损失函数(目标函数)是由极大似然函数改写而来,首先简单了解下极大似然估计的原理。

极大似然估计

它是建立在极大似然原理的基础上的一个统计方法, 极大似然原理的直观想法是,一个随机试验如有若干个可能的结果A,B,C,… ,若在一次试验中,结果A出现了,那么可以认为实验条件对A的出现有利,也即出现的概率P(A)较大。

极大似然原理的直观想法我们用下面例子说明。设甲箱中有99个白球,1个黑球;乙箱中有1个白球.99个黑球。现随机取出一箱,再从抽取的一箱中随机取出一球,结果是黑球,这一黑球从乙箱抽取的概率比从甲箱抽取的概率大得多,这时我们自然更多地相信这个黑球是取自乙箱的。

一般说来,事件A发生的概率与某一未知参数θ有关,θ取值不同,则事件A发生的概率P(A|θ)也不同,当我们在一次试验中事件A发生了,则认为此时的θ值应该是t的一切可能取值中使P(A|θ)达到最大的一个,极大似然估计法就是要选取这样的t值作为参数的估计值,使所选取的样本在被选的总体中出现的可能性最大。

极大似然函数的公式(离散型)

目标函数

Skip-gram的目标是,给定一个中心单词wt,最大化它周边的单词出现的概率,对每一个位置t=1、2、…、T,m为中心词往前或往后要预测的单词个数,概率通过极大似然函数来表示为:

这里θ是需要通过训练来进行优化的值,通过优化θ使得概率值最大,但是在深度学习训练任务中一般训练目标是不断优化以减小损失函数,所以这里通过取负值和加log改写了极大似然函数,生成了目标函数:

通过这样的转化,最小化目标函数就等价于最大化预测概率。

现在的问题是如何计算P(Wt+j|Wt; θ)?

这里是使用的softmax函数的公式,每个单词有两个向量,一个是当他是中心词时,另一个时当他是上下文单词时。V表示所有的单词(词表)。

CBOW

与Skip-gram相对应,CBOW是通过周边词预测中心词。

CBOW的任务比较简单,训练所需时间较短,skip-gram任务更难,训练所需时间更长。

CBOW可以学习到更好的语法关系,但是skip-gram可以学习到更好的语义关系

Hierarchical Softmax (分层softmax

因为上面的计算最后是一个词表大小的softmax,计算量非常大,原论文中在这里进行了优化。

其主要优点是,不需要评估神经网络中的W个输出节点以获得概率分布,只需要评估大约log2(W)(log以2为底,W的对数)个节点。

分层softmax使用二叉树表示输出层,W个words作为其叶子,并且对于每个节点,显式表示其子节点的相对概率。这些定义了一个随机游走,为单词分配概率。

Negative Sampling

简单理解就是引入一些错误数据(负样本)来作为干扰项,来提高模型的抗干扰能力。

Subsampling of Frequent Words (下采样)

在非常大的语料库中,最频繁的单词很容易出现数亿次(例如,“In”、“the”和“a”)。这些词通常比稀有词提供的信息价值要小。例如,虽然Skip-gram模型从观察“France”和“Paris”的共现中获益,但从观察“France”和“the”的频繁共现中获益要少得多,因为几乎每个单词在一个句子中都与“the”频繁共现。这个想法也可以反方向应用;在数百万个例子上进行训练后,频繁词的向量表示没有显著变化。

为了克服罕见词和频繁词之间的不平衡,我们使用了一种简单的子抽样方法:训练集中的某个词wi被丢弃的概率由公式计算:

其中f(wi)是单词wi的频率,t是选择的阈值,通常在10的-5次方左右。我们之所以选择这个下采样公式,是因为它积极地对频率大于t的单词进行子抽样,同时保留频率的排名。虽然这个二次抽样公式是试探性地选择的,但我们发现它在实践中运行良好。它加速了学习,甚至显著提高了稀有词学习向量的准确性。

超参数

最后,关于超参数的选取,很明显window size的大小对最终的效果应该有比较大的影响。经过实验表明,当窗口大小比较小时(2~15),两个相似度比较高的embedding所表示的单词之间是可以互相替换的,当窗口大小比较大时(15~50),两个相似度比较高的embedding所表示的单词可能是无关的,gensim默认是5。

另外还有一个Negative samples的值(超参),gensim默认是5。