课程主页:https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/

视频地址:https://www.bilibili.com/video/av46216519?from=search&seid=13229282510647565239

这里回顾CS224N Lecture 1的课程内容,这一讲简单介绍了Word2vec,CBOW以及Skip-Gram Model。

如何表示单词

one-hot

最直接的方式是使用one-hot向量,即除了一个位置为$1$,其余位置为$0$的向量,但这个方式有个明显的问题,无法表示单词的相似性,因为任意两个不同的one-hot向量正交,例如

motel和hotel意思相近,但是该表示无法体现这点。

Co-occurrence Matrix

该方法的思想很简单,给定一个单词,统计在某个句子中其前$m$个以及后$m$个单词出现的数量。

考虑如下例子,取$m=1$:

  1. I enjoy flying.
  2. I like NLP.
  3. I like deep learning.

那么Co-occurrence Matrix为:

显然该矩阵非常大,所以使用起来不太方便。

Applying SVD to the cooccurrence matrix

为了处理之前提到的问题,可以使用SVD对该矩阵进行降维。

假设该矩阵为$X$,那么首先进行SVD:

然后通过选择前$k$个奇异向量进行降维:

但是这个方法依旧不太好,因为进行SVD的运算复杂度很高。

如今的语言模型基本都基于一个假设:一个单词的含义由经常出现在附近的单词给出,后面将介绍两种经典方法,分别为CBOW,Skip-Gram Model;CBOW基于上下文预测缺失的单词,Skip-Gram Model则是反过来,基于一个单词预测其上下文。

Continuous Bag of Words Model (CBOW)

CBOW模型:
根据上下文预测中心词。对于每个单词,我们要学习2个向量

  • $v$ :输入向量,即单词在上下文中的表示
  • $u$:输出向量

CBOW模型的记号:

  • $w_i$:词典$V$的第$i$个单词
  • $\mathcal{V} \in \mathbb{R}^{n \times | V|}$:输入单词矩阵
  • $v_i$:$\mathcal V$的第$i$列,单词$w_i$的输入向量表示
  • $\mathcal U \in \mathbb{R}^{|V| \times n}$,输出单词矩阵
  • $u_i$:$\mathcal U$的第$i$行,单词$w_i$的输出向量表示

整个模型如下:

  1. 生成窗口大小为$m$的one-hot输入内容向量:$\left(x^{(c-m)}, \ldots, x^{(c-1)}, x^{(c+1)}, \ldots, x^{(c+m)} \in \mathbb{R}^{|V|}\right)$
  2. 得到输入内容的词嵌入:
  3. 对上述向量取平均得到$\hat{v}=\frac{v_{c-m}+v_{c-m+1}+\ldots+v_{c+m}}{2 m} \in \mathbb{R}^{n}$
  4. 生成得分向量$z=\mathcal{U} \hat{v} \in \mathbb{R}^{|V|}$
  5. 转换为概率$\hat{y}=\operatorname{softmax}(z) \in \mathbb{R}^{|V|}$
  6. 使上述概率和真实概率$y$比较接近(利用某种度量)

最后一点提到的度量为交叉熵损失函数,即

注意$y$也为one-hot形式,不妨设第$i$个下标为$1$,那么上述损失函数即为

即我们要最小化

使用梯度下降的方法可以对上述损失函数进行优化。

网络结构如下:

Skip-Gram Model

Skip-Gram模型:

根据中心词预测上下文。

Skip-Gram模型的记号:

  • $w_i$:词典$V$的第$i$个单词
  • $\mathcal{V} \in \mathbb{R}^{n \times | V|}$:输入单词矩阵
  • $v_i$:$\mathcal V$的第$i$列,单词$w_i$的输入向量表示
  • $\mathcal U \in \mathbb{R}^{n \times |V|}$,输出单词矩阵
  • $u_i$:$\mathcal U$的第$i$行,单词$w_i$的输出向量表示

整个模型如下:

  1. 生成中心单词的one-hot向量$x \in \mathbb{R}^{|V|}$
  2. 得到中心单词的词嵌入:$ v_{c}=\mathcal{V} x \in \mathbb{R}^{n}$
  3. 生成得分向量$z=\mathcal{U}^T {v_c} \in \mathbb{R}^{|V|}$
  4. 转换为概率$\hat{y}=\operatorname{softmax}(z) \in \mathbb{R}^{|V|}$,注意到$\hat{y}_{c-m}, \ldots, \hat{y}_{c-1}, \hat{y}_{c+1}, \ldots, \hat{y}_{c+m}$为观测到每个上下文单词的概率。
  5. 我们希望我们生成的概率和真实概率$y^{(c-m)}, \ldots, y^{(c-1)}, y^{(c+1)}, \ldots, y^{(c+m)}$(one-hot形式)比较接近(利用某种度量)

下面使用了朴素贝叶斯假设(条件独立):

负采样

考虑单词和内容$(w,c)$,我们用$P(D=1 | w, c)$表示$(w,c)$属于训练语料数据的概率(所以$P(D=0 | w, c)$表示$(w,c)$不属于训练语料数据的概率),并且假设

那么,我们希望

注意到上式等价于最小化

其中$\tilde D$为“负”语料数据。

利用上述思想,在CBOW模型中,给定$\hat v=\frac{v_{c-m}+v_{c-m+1}+\ldots+v_{c+m}}{2 m}$,观测到$u_v$对应目标函数为

注意原始的形式为

同样的,在skip-gram模型中,观测到上下文单词$c-m+j$对应的目标函数为

原始的形式为

补充:在上述讨论中,$\left\{\tilde{u}_{k} | k=1 \ldots K\right\}$从分布$P_{n}(w)$中采样,这里均使用$P_{n}(w)$为一元模型的$3/4$次方。在一元模型中,我们假设

所以每个单词在一元模型中的概率为其出现的频率。

分层Softmax

分层Softmax用二叉树表示词典中的所有单词,每个叶节点是一个单词,从根节点到叶节点有唯一的路径,所以我们用该路径表示单词,我们要学习的是该二叉树的结构。给定向量$w_i$,单词$w$的概率$P(w|w_i)$为从根节点出发,到达$w$对应的叶节点的概率。记$L(w)$为从根节点到达叶节点$w$的路径的节点数量(不包括$w$),$n(w,i)$为路径上第$i$个节点,$v_{n(w,i)}$为对应的向量。随机选择内部节点$n$的孩子节点,记为$ch(n)$。那么

其中

$\sigma(.)$为sigmoid函数。

Word2vec

Word2vec依然是使用上下文的思想,考虑下图:

类似之前的讨论,似然函数为

我们的目标函数为

同之前讨论类似,我们假设$P\left(w_{t+j} | w_{t} ; \theta\right)$为softmax函数,即

对$\log P(o|c)$关于$v_c$求梯度可得

根据上式可以利用梯度下降进行计算。