CS224n 自然语言处理第一节:简介与词向量

Category 碎碎念

one-hot 编码

在传统 NLP 中,词可以使用 one-hot 向量表示,one-hot 指向量中只有一个 1,其余都是 0。例如词库为向量

$$\mathrm{vocab}=[\mathrm{hotel\ conference\ motel}]$$

那么单词的 one-hot 向量就是

$$\mathrm{motel}=[0\ 0\ 1]$$
$$\mathrm{hotel}=[1\ 0\ 0]$$

这样得到不同词向量是正交的,无法判断词之间的相似性。

word2vec

  • 分布式语义(distributional semantics):一个词的语义由最常出现的邻近词决定。

分布式语义是 NLP 中的一个基本概念,基于这个假设,我们可以通过上下文来表示指定的词,得到的词向量又称为词嵌入(word embeddings)。

word2vec 是基于分布式语义得到词向量的一种重要方法,其基本设想是

  • 拥有一个较大的语料数据库
  • 文本中的每一个词都能通过向量表示,语义相似的词具有相似的向量
  • 在文本中的位置 \(t\) 上,有中心词 \(c\) 和上下文词 \(o\)(为了简化计算,\(c\) 对应的 \(o\) 通常由窗口 \(m\) 决定)
  • 使用 \(c\)\(o\) 的词向量相似性计算给定 \(c\)\(o\) 的概率
  • 不断调整词向量直至最大化该概率(最大似然法)

n

在文本中的位置 \(t=1,\cdots,T\) 上,对中心词 \(w_j\) 固定窗口大小为 \(m\),那么文本数据的似然为

$$L(\theta)=\prod^T_{t=1}\prod_{\substack{-m\leq j\leq m\\j\neq0}}P(w_{t+j}|w_t;\theta)$$

最大似然的目标就是 \(\max L(\theta)\),在这里取负对数将其转化为

$$J(\theta)=-\frac{1}{T}\log L(\theta)=-\frac{1}{T}\prod^T_{t=1}\prod_{\substack{-m\leq j\leq m\\j\neq0}}P(w_{t+j}|w_t;\theta)$$

优化目标就变为 \(\min J(\theta)\),更加符合最优化的习惯,这里的 \(J(\theta)\) 就是 word2vec 的损失函数。

\(J(\theta)\) 中的条件概率一项如何计算呢?这里为了便于计算,当 \(w\) 为中心词时用 \(v_w\) 表示,当 \(w\) 为上下文词时用 \(u_w\) 表示。

 Note 每一个词 \(w\) 都会具有两个不同的向量 \(v_w\)\(u_w\),在计算结束后,这两个向量会非常相似,通常取这两个向量的平均得到词向量。

那么对于任意指定的中心词 \(c\) 和相应的上下文词 \(o\),就有条件概率

$$P(o|c)=\frac{\exp(u_o^Tv_c)}{\sum_{w\in V}\exp(u_w^Tv_c)}$$

该条件概率同时也表示当两个词的向量点积越大,两个词临近的概率 \(P(o|c)\) 越大,这正是 word2vec 的基本思想。该式可以与 softmax 函数类比:

$$\mathrm{softmax}(x_i)=\frac{\exp(x_i)}{\sum_{j=1}^n\exp(x_j)}=p_i$$

其本质就是将中心词 \(c\) 和上下文词 \(o\) 的相似性 \(u_o^Tv_c\) 转化为概率形式(非负且和为 1)。

在得到 \(P(o|c)\) 后,就可以采用梯度下降的方法实现 \(\min J(\theta)\),所以需要计算每个目标词 \(v_c\)\(\frac{\partial}{\partial v_c}\log P(o|c)\),推导过程如下:

$$\begin{align} \frac{\partial}{\partial v_c}\log P(o|c)&=\frac{\partial}{\partial v_c}\log\frac{\exp(u_o^Tv_c)}{\sum_{w\in V}\exp(u_w^Tv_c)}\\ &=\frac{\partial}{\partial v_c}\left[\log \exp(u_o^Tv_c)-\log\sum_{w\in V}\exp(u_w^Tv_c)\right]\\ &=\frac{\partial}{\partial v_c}u_o^Tv_c-\frac{\partial}{\partial v_c}\log\sum_{w\in V}\exp(u_w^Tv_c) \end{align}$$

注意 \(v_c\) 为向量,由向量求导法则 \(\frac{\mathrm{d}Ax}{\mathrm{d}x}=A^T\),可以得到

$$ \begin{align} \frac{\partial}{\partial v_c}\log P(o|c)&=u_o-\frac{\partial}{\partial v_c}\log\sum_{w\in V}\exp(u_w^Tv_c)\\ &=u_o-\frac{1}{\sum_{w\in V}\exp(u_w^Tv_c)}\left[\frac{\partial}{\partial v_c}\sum_{x\in V}\exp(u_x^Tv_c)\right]\\ &=u_o-\frac{1}{\sum_{w\in V}\exp(u_w^Tv_c)}\sum_{x\in V}\frac{\partial}{\partial v_c}\exp(u_x^Tv_c)\\ &=u_o-\frac{1}{\sum_{w\in V}\exp(u_w^Tv_c)}\sum_{x\in V}\exp(u_x^Tv_c)u_x\\ &=u_o-\sum_{x\in V}\frac{\exp(u_x^Tv_c)}{\sum_{w\in V}\exp(u_w^Tv_c)}u_x\\ &=u_o-\sum_{x\in V}P(x|c)u_x \end{align} $$

实际上 \(\sum_{x\in V}P(x|c)u_x\) 就是 \(u_x\) 的期望,使用 softmax 的好处就在于能将最优化问题转化为最小化形如「观察值 – 预测值」的误差。


References