Word2Vec学习笔记

Word2Vec学习笔记

Word2Vec是Google开源的一款用于计算词向量的工具,它可以对海量的词典和数据集上进行高效的训练,并得到稠密连续的词向量作为其他自然语言处理任务的基础。Word2Vec并不是一种算法,而是基于NLPM的高效实现,包含了CBoW和Skip-gram两个模型。本文将介绍统计语言模型中词向量的Discrete和Distributed Representation之间的区别,Word2Vec的模型一些细节。欢迎补充、指正并参与讨论。

统计语言模型(Statistical Language Model)

在自然语言处理中的一个基本的问题就是:如何计算一段文本序列$S$,在文本中出现的概率。这样,我们可以根据概率来选择更靠谱的翻译结果和AI回答。

首先要将句子$S$表示一连串特定顺序排列的文本原子单位,在一些场景中,可能按字符(character)或者短语(phrase)为单位进行处理。但最常见的还是以词为单位,将句子$S$用$w_1,w_2,…,w_T$词序列表示,即分词任务。假设,当前词的概率可以表示为基于它前面出现的词的条件概率,那么文本序列$S=w_1,w_2,…,w_T$的概率$P(S)$可以表示为:

$$P(S)=P(w_1,w_2,…,w_T)=\prod_{t=1}^T{p(w_t|w_1,w_2,…,w_{t-1})}$$

可以预见,这样没办法去估计一个词出现的概率,因为参数空间太大。在实际中,一般采用N-gram模型去近似地表示,即当前词只与前面$N-1$个词有关。

$$p(w_t|w_1,w_2,…,w_{t-1}) \approx p(w_t|w_{t-n+1},…,w_{t-1})$$

通常使用bi-gram ($N=2$)和tri-gram ($N=3$)。但是模型的预测精度有限,且存在零概率问题,即一段从未在训练集中出现过的Ngram片段会使得整个序列的概率为0。有一些N-gram模型的变体(例如,back-off trigram和interpolated trigram模型)针对性地解决这些问题,但有一个前序问题是:如何来表示这些词呢?对,是向量

Discrete Representation

在传统的模型中,每个词都被表示为离散的向量,常见的编码方式就是One-hot encoding。即以0-1向量来表示一个词,维度就是整个词典的数量,词向量在其对应的维度为1,其他均为零。如:

  • I: [ 1 0 0 0 0 ]
  • love: [ 0 1 0 0 0 ]
  • mom: [ 0 0 1 0 0 ]
  • and: [ 0 0 0 1 0 ]
  • dad: [ 0 0 0 0 1 ]

这种表示方法的缺陷显而易见:

  • 割裂了词与词之间的相似度的关系,如上文中mom和dad都是我的双亲,却无法在词向量上体现。
  • 造成了维度灾难问题(the curse of dimensionality),通常词典中的词都是百万数量级的,采用One-hot编码会造成超高维超稀疏的矩阵,给计算带来了很多麻烦的问题。

Distributed Representation

为了避免上述问题,我们倾向用低维稠密的向量来表示一个词,这样的表示方法被称为Distributed Representation。在信息检索(Information Retrieval)领域,这个概念又被称为向量空间模型(Vector Space Model)[1]。

为了获取这样的连续稠密的向量,可以分为distributed和distributional两类方法,但都是基于statistical semantics distributional hypothesis,核心思想就是词义隐含在上下文统计特征中。

Distributional包括BoW、LSI、LDA等模型,统计单词共现的频率和次数,往往限定于只存在于相同的上下文环境中。通过构造PMI/PPMI矩阵,再通过SVD进行降维等操作。

Distributed包括NPLM、LBL、Glove等模型。不仅仅是统计了单词出现的频率,而是通过学习使得单词具有一定出现的概率,不一定同时出现在相同的上下文环境中。有文章证明Distributed的方法通常表现更好。[2]

Neural Probabilistic Language Model

接下来,让我们回到对统计语言模型的讨论。鉴于Ngram等模型的不足,2003年,Bengio等人发表了一篇开创性的文章:A Neural Probabilistic Language Model[3]。在这篇文章里,他们总结出了一套用神经网络建立统计语言模型的框架,想利用深度学习的方法来解决自然语言处理问题。并首次提出了连续空间的word representation,也就是后来被称为word embedding的概念,从而奠定了包括word2vec在内后续研究word representation learning的基础。

NPLM模型的基本思想可以概括如下:

  • 假定词表中的每一个word都对应着一个连续的特征向量;
  • 假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;
  • 同时学习词向量的权重和概率模型里的参数。
Neural Probabilistic Language Model

我们可以将整个模型拆分成两部分加以理解:

  1. 首先是一个线性的embedding层。它将输入的$N−1$个one-hot词向量,通过一个共享的$D×V$的矩阵$C$,映射为$N−1$个分布式的词向量(distributed vector)。其中,$V$是词典的大小,$D$是embedding向量的维度(一个先验参数)。$C$矩阵里存储了要学习的word vector。
  2. 其次是一个简单的前向反馈神经网络$g$。它由一个tanh隐层和一个softmax输出层组成。通过将embedding层输出的$N−1$个词向量映射为一个长度为$V$的概率分布向量,从而对词典中的word在输入context下的条件概率做出预估:

$$p(w_i|w_1,w_2,…,w_{t−1}) \approx f(w_i,w_{t−1},…,w_{t−n+1})=g(w_i,C(w_{t−n+1}),…,C(w_{t−1}))$$

我们可以通过最小化一个cross-entropy的正则化损失函数来调整模型的参数$\theta$:

$$L(\theta)=\frac{1}{T}\sum_t\log{f(w_t,w_{t−1},…,w_{t−n+1})}+R(\theta)$$

其中,模型的参数$\theta$包括了embedding层矩阵$C$的元素,和前向反馈神经网络模型$g$里的权重。这是一个巨大的参数空间。不过,在用SGD学习更新模型的参数时,并不是所有的参数都需要调整(例如未在输入的context中出现的词对应的词向量)。

不过NPLM只能处理定长的序列,Mikolov等人在这篇文章基础之上,提出Recurrent Neural Net Language Model[4],即用循环神经网络代替原始模型中的前向反馈神经网络,并将embedding层和RNN中的隐藏层合并,从而解决了变长序列的问题。

Word2Vec

NPLM比较严重的问题是训练太慢了。在百万量级的数据集(AP News Corpus)上,使用了40个CPU进行训练,NPLM耗时三周只运行了5个epoch,得到了一个比较靠谱的解。显然,对于现在动辄上千万甚至上亿的真实语料库,训练一个NPLM模型几乎是一个不可能完成的任务。因此,为了简化NPLM模型,Mikolov提出了CBoW和Skip-gram两个模型,CBoW全称是Continuious Bag of Words目的是用Context预测当前词,Skip-gram则是用当前词预测周围的Context。[5,6]

Continuious Bag of Words

CBoW移除了前向反馈神经网络中非线性的hidden layer,直接将中间层的embedding layer与输出层的softmax layer连接。忽略上下文环境的序列信息:输入的所有词向量均汇总到同一个embedding layer,同时将future words纳入上下文环境。

Continuous Bags of Words

从数学上看,CBoW模型等价于一个词袋模型的向量乘以一个embedding矩阵,从而得到一个连续的embedding向量。这也是CBoW模型名称的由来。

但由于在模型中有一个对context words向量SUM的操作,所以会损失一部分信息,往往效果不如skip-gram模型。但对于一些小量级对精度要求不高的问题情景下,可以使用CBoW快速得到词向量。

Skip-gram Models

Skip-gram Model

Skip-gram模型的名称源于该模型在训练时会对上下文环境里的word进行采样,其前向计算过程如下:

$$p(w_O|w_I)=\frac{\exp u_{w_O}^T v_{w_I}}{\sum_{w \in W}\exp u_w^T v_{w_I}}$$

其中$v_I$是也被称为$w_I$的input vector。$u_I$是softmax层矩阵里的行向量,也被称为wj的output vector。

因此,Skip-gram模型的本质是计算输入word的input vector与目标word的output vector之间的余弦相似度,并进行softmax归一化。我们要学习的模型参数正是这两类词向量。

然而,直接对词典里的$W$个词计算相似度并归一化,显然是一件极其耗时的impossible mission。为此,Mikolov引入了两种优化算法:层次Softmax(Hierarchical Softmax)和负采样(Negative Sampling)。

Hierarchical Softmax

层次Softmax是对完全Softmax分类的计算效率上的优化,最主要的优势就是不用再去计算每个输出结点上面的值(假设总共有$W$个输出结点),而只需要计算$log_2(W)$个输出结点上的值就可以估计整个神经网络的概率分布。这个想法最早是Bengio等人提出的。[7]

将原有的$W$个输出结点作为一个二叉树的叶子结点,每个结点都是显示地表示其子结点的相对概率,通过随机游走得到这些word概率。在二叉树中每个word都对应着唯一一条从根结点到叶子结点的路径,$n(w,1)$到$n(w,l)$表示这条路径上的每个结点,共$L$层,所以$n(w,L)=w$。则:

$$p(w|w_I) = \prod_{l=1}^{L-1} \frac{1}{1+\exp (x)}$$

其中,$x = $[if n(w, l+1) = n(w, l).child then 1 else -1]$u_n^Tv_w$,就变为求这条唯一路径的概率问题,可以通过最大化这个似然函数来求解,降低了复杂度的量级。

与使用标准Softmax层的Skip-gram模型不同的是,标准版中得到了是关于一个词$w$的输出向量$u_w$和输入向量$v_w$,而在层次Softmax版本中,得到的是每个词的输入向量$v_w$和每个非叶结点的输出向量$u_n$。但是二叉树的构造为增加词与词之间的耦合度,即一个词概率的计算可能会间接影响另一些词的出现的概率。Mikolov等人在文章中构造一棵Huffman树,事实证明Huffman树可以满足大部分实际应用的需求。

Negative Sampling

另外一种加速计算的方法就是负采样(Negative Sampling)[8],主要目标是对于每一轮的迭代,不必计算每个正样本的值,而是加入一些负样本来近似地估计总体概率分布。思想类源于由Gutmann and Hyvarinen提出的Noise Contrast Estimation (NCE):一个好的模型能最大化地把正负样本分开。鉴于NCE可以近似估计Softmax的对数概率,在Skip-gram模型中对其进行了简化,只保留了高质量的向量表示,因为那才是本模型关注的重点,负采样(NEG)的目标函数为:

$$\log \sigma(u_{w_O}^T v_{w_I})+\sum_{i=1}^k \mathbb{E}_{w_i \sim P_n(W)}[\log \sigma(-u_{w_O}^T v_{w_I})])$$

其中,公式后半部分表示从人为构造的负样本的正态分布$P_n(W)$中随机选出$k$个词对(words pair)作为负样本估计总体的最大似然概率。

不是结尾的结尾

攒了好久终于把这篇学习笔记写出来了,有很多大神已经把Word2Vec讲的很透彻了,可以参见《Word2Vec的前世今生》《Deep Learning in NLP (一)词向量和语言模型》。我follow的是集智俱乐部组织的NLP & DL课程,软广一发,写的也基于自己的理解,若有不对之处欢迎讨论和指正。下一篇将介绍word2vec的实践。

参考文献

  1. Turney, P. D., & Pantel, P. (2010). From frequency to meaning: vector space models of semantics. Journal of Artificial Intelligence Research, 37(1).
  2. Baroni M, Dinu G, Kruszewski G. Don’t count, predict! A systematic comparison of context-counting vs. context-predicting semantic vectors[C]//ACL (1). 2014: 238-247.
  3. Bengio, Y., Ducharme, R., Vincent, P., & Janvin, C. (2003). A neural probabilistic language model. The Journal of Machine Learning Research, 3, 1137–1155.
  4. Mikolov, T., Karafiát, M., Burget, L., & Cernocký, J. (2010). Recurrent neural network based language model. Interspeech.
  5. Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013, January 17). Efficient Estimation of Word Representations in Vector Space. arXiv.org.
  6. Mikolov, T., Sutskever, I., Chen, K., Corrado, G., & Dean, J. (2013, October 17). Distributed Representations of Words and Phrases and their Compositionality. arXiv.org.
  7. Morin, F., & Bengio, Y. (2005). Hierarchical Probabilistic Neural Network Language Model. Aistats.
  8. Mnih, A., & Kavukcuoglu, K. (2013). Learning word embeddings efficiently with noise-contrastive estimation, 2265–2273.
文章目录
  1. 1. Word2Vec学习笔记
    1. 1.1. 统计语言模型(Statistical Language Model)
      1. 1.1.1. Discrete Representation
      2. 1.1.2. Distributed Representation
    2. 1.2. Neural Probabilistic Language Model
    3. 1.3. Word2Vec
      1. 1.3.1. Continuious Bag of Words
      2. 1.3.2. Skip-gram Models
        1. 1.3.2.1. Hierarchical Softmax
        2. 1.3.2.2. Negative Sampling
    4. 1.4. 不是结尾的结尾
    5. 1.5. 参考文献
,