NLP 之一:词向量
语言模型
对于一段文本 \(W=w^{(1)}w^{(2)}...w^{(T)}\),我们希望计算其出现的概率。
如果直接在数据集中统计出现的数量,复杂度过高。因此目标变为快速估计其概率。
首先整个句子出现的概率可以拆分为若干个条件概率相乘,即 \(P(W)=\prod\limits_{i=1}^T P(w^{(i)}\mid w^{(1)}...w^{(i-1)})\)。
一个经典方法 \(n\)-grams 假设每个词只和之前 \(n-1\) 个词有关,简化模型计算。
词向量
我们希望将神经网络沿用至此,但直接将词编号输入难以体现词与词之间的关系。(one-hot)
词嵌入(word embedding)的想法是将每个词映射成低维空间中的定长向量,两个词的相似程度表现为其对应向量的空间位置关系。
为了建立一个词向量模型,我们需要假设一个似然函数的模型,然后通过神经网络训练其参数,实现最大似然估计。
如果只是传统的同时学习词向量和模型参数,训练量过大。因此可以先只训练出简单的词向量,然后不同的模型基于此设计不同的神经网络。
Word2vec
接下来会介绍训练词向量的经典工作 Word2vec,其包含两个模型:Skip-gram 和 CBOW。
两个模型均是考虑中心词与其附近的背景词之间的关系。背景词指的是与中心词距离不超过窗口大小 \(m\) 的词。对中心词来说,窗口内所有背景词的地位相同。
假设词向量维数为 \(d\),我们会对每个词训练出其作为中心词的词向量 \(\bm{v}_i\) 和作为背景词的词向量 \(\bm{u}_i\)。两个词 \(w_i\) 和 \(w_j\) 越相似,\(\bm{v}_i\bm{u}_j\) 和 \(\bm{u}_i\bm{v}_j\) 应越大。
Skip-gram
Skip-gram模型重在描述中心词对背景词的生成。
将编号为 \(o\) 的背景词 \(w_o\) 出现在编号为 \(c\) 的中心词 \(w_c\) 附近的概率近似为
其中 \(\mathcal{V}\) 是词库。即对向量内积做softmax。
似然函数为
CBOW
CBOW模型重在描述背景词对中心词的生成。
将编号为 \(c\) 的中心词 \(w_c\) 出现在编号依次为 \(1,2,...,2m\) 的背景词 \(w_{o_1}w_{o_2}...w_{o_{2m}}\) 中间的概率近似为
其中 \(\bm{\overline{u}}_o=\frac{1}{2m}\sum\limits_{i=1}^{2m}\bm{u}_{o_i}\)。
似然函数为
近似训练
注意到以上两个模型的概率计算中,都需要遍历词库 \(\mathcal{V}\),复杂度过高无法接受。
两个近似技巧可以将复杂度降下来:
- 负采样(Negative Sampling) 不再遍历 \(\mathcal{V}\) 而是在里面采样 \(K\) 次(目标函数也有所修改)。
- 层次Softmax(Hierarchical Softmax) 对所有单词建一棵哈夫曼树,每个非叶子节点是一个二分类器,相当于每次只考虑 target word 和两个集合之间哪个更相近,这样每个节点只需要进行一次两个元素的Softmax。
GloVe(Global Vectors for Word Representation)
记 \(x_{i,j}\) 表示某一语料中词 \(w_j\) 出现在 \(w_i\) 背景窗口中的次数。显然有 \(x_{i,j}=x_{j,i}\)。
对三个词 \(w_i,w_j,w_k\),我们希望有
因此一个方法是令 \(f\) 是指数函数,也就是使下式成立
另外还可以添加偏置项
据此定义损失函数(选用平方损失)
其中 \(h\) 是一个钦定好的递增函数。