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\) 附近的概率近似为

\[P(w_o\mid w_c) = \frac{\exp(\bm{u}_o\bm{v}_c)}{\sum_{i\in \mathcal{V}} \exp(\bm{u}_i\bm{v}_c)} \]

其中 \(\mathcal{V}\) 是词库。即对向量内积做softmax。

似然函数为

\[\prod\limits_{i=1}^T\prod\limits_{0<|j|\le m}P(w^{(i+j)}\mid w^{(i)}) \]

CBOW

CBOW模型重在描述背景词对中心词的生成。

将编号为 \(c\) 的中心词 \(w_c\) 出现在编号依次为 \(1,2,...,2m\) 的背景词 \(w_{o_1}w_{o_2}...w_{o_{2m}}\) 中间的概率近似为

\[P(w_c\mid w_{o_1}w_{o_2}...w_{o_{2m}}) = \frac{\exp(\bm{\overline{u}}_o\bm{v}_c)}{\sum_{i\in \mathcal{V}} \exp(\bm{\overline{u}}_o\bm{v}_i)} \]

其中 \(\bm{\overline{u}}_o=\frac{1}{2m}\sum\limits_{i=1}^{2m}\bm{u}_{o_i}\)

似然函数为

\[\prod\limits_{i=1}^TP(w^{(i)}\mid w^{(i-2m)}...w^{(i-1)}w^{(i+1)}...w^{(i+2m)}) \]

近似训练

注意到以上两个模型的概率计算中,都需要遍历词库 \(\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\left((\bm{u}_i-\bm{u}_j)\bm{v}_k\right)\approx \frac{x_{i,k}}{x_{j,k}} \]

因此一个方法是令 \(f\) 是指数函数,也就是使下式成立

\[\exp(\bm{u}_i\bm{v}_j)\approx x_{i,k} \]

另外还可以添加偏置项

\[\bm{u}_i\bm{v}_j+b_i+c_j\approx \log x_{i,k} \]

据此定义损失函数(选用平方损失)

\[\sum\limits_{i,j\in\mathcal{V}}h(x_{i,j})(\bm{u}_i\bm{v}_j+b_i+c_j-\log x_{i,k})^2 \]

其中 \(h\) 是一个钦定好的递增函数。

posted @ 2024-01-16 15:18  xcyle  阅读(95)  评论(0编辑  收藏  举报