【注】参考自李沐的《动手学深度学习》。

1. 简介

自然语言是一套用来表达含义的复杂系统,词是表义的基本单元。而我们要考虑是如何构造词向量来表示词。把词映射为实数域向量的技术称为词嵌入

2. 词嵌入

  • 最初的词嵌入采用 one-hot 编码来生成词向量,但 one-hot 编码的词向量无法准确表达不同词之间的相似度。刻画词向量间的相似度常常使用余弦相似度:对于向量 x,yRd \boldsymbol{x},\boldsymbol{y} \in \mathbb{R}^d ,它们之间的余弦相似度为

xTyxy[1,1]\begin{array}{c} \frac{\boldsymbol{x}^T \boldsymbol{y}}{\parallel\boldsymbol{x}\parallel \parallel\boldsymbol{y}\parallel} \in [-1, 1] \end{array}

而使用 one-hot 编码的任何两个词向量的余弦相似度均为 0,因此无法刻画不同词之间的相似和类比关系。

  • 目前的词嵌入采用 word2vec 工具,其主要包含两中词向量编码模型:跳字模型连续词袋模型

假设文本序列是 \mbox{「the」、「man」、「loves」、「his」、「son」},设背景窗口大小为 2,以 \mbox{「loves」} 作为中心词,则其余词为 \mbox{「loves」} 的背景词

2.1 跳字模型

跳字模型假设基于中心词来生成它在文本序列周围的背景词;并假设给定中心词的情况下,背景词的生成是相互独立的。给定中心词 \mbox{「loves」} 生成其背景词的概率为:

\begin{array}{c} P(\mbox{「the」},\mbox{「man」},\mbox{「his」},\mbox{「son」}|\mbox{「loves」}) = P(\mbox{「the」}|\mbox{「loves」}) \cdot P(\mbox{「man」}|\mbox{「loves」}) \cdot P(\mbox{「his」}|\mbox{「loves」}) \cdot P(\mbox{「son」}|\mbox{「loves」}) \end{array}
  • 在跳字模型中,每个词被表示为两个 dd 维向量,用来计算条件概率。假设某个词在词典中的索引为 ii,则它作为中心词时词向量表示为 viRd \boldsymbol{v}_i \in \mathbb{R}^d ,作为背景词时词向量表示为 uiRd \boldsymbol{u}_i \in \mathbb{R}^d

  • 设中心词 wcw_c 在词典中索引为 cc,背景词 WoW_o 在词典中索引为 oo,则给定中心词生成背景词的条件概率为

P(wowc)=euoTvciVeuiTvc\begin{array}{c} P(w_o | w_c) = \frac{e^{\boldsymbol{u}_o^T \boldsymbol{v}_c}}{\sum_{i \in \mathcal{V}} e^{\boldsymbol{u}_i^T \boldsymbol{v}_c}} \end{array}

其中词典索引集 V={0,1,,V1} \mathcal{V} = \{0,1,\cdots,|\mathcal{V}-1|\}

  • 假设给定一个长度为 TT 的文本序列,设时间步 tt 的词为 w(t)w^{(t)},当窗口大小为 mm 时,跳字模型的目标似然函数即为给定任一中心词生成其所有背景词的概率

t=1Tmjm,j0P(w(t+j)w(t))\begin{array}{c} \prod_{t=1}^T \prod_{-m \leq j \leq m, j \ne 0} P(w^{(t+j)} | w^{(t)}) \end{array}

训练跳字模型时通过最大化似然函数(最大似然估计)来学习模型参数,等价于最小化损失函数

 t=1Tmjm,j0logP(w(t+j)w(t))\begin{array}{c} \ - \sum_{t=1}^T \sum_{-m \leq j \leq m, j \ne 0} \log P(w^{(t+j)} | w^{(t)}) \end{array}

【注】在跳字模型中,一般使用中心词向量作为词向量表达词。

2.2 连续词袋模型

连续词袋模型与跳字模型类似,但与跳字模型最大的不同在于连续词袋模型假设基于中心词的背景词来生成中心词。即计算条件概率:

\begin{array}{c} P(\mbox{「loves」}|\mbox{「the」}, \mbox{「man」}, \mbox{「his」}, \mbox{「son」}) \end{array}
  • 在连续词袋模型中,每个词也被表示为两个 dd 维向量,用来计算条件概率。假设某个词在词典中的索引为 ii,与跳字模型相反的是,则它作为背景词时词向量表示为 viRd \boldsymbol{v}_i \in \mathbb{R}^d ,作为中心词时词向量表示为 uiRd \boldsymbol{u}_i \in \mathbb{R}^d

  • 由于背景词有多个,一般将这些背景词向量取平均后来计算条件概率。设中心词 wcw_c 在词典中索引为 cc,背景词 wo1,,wo2mw_{o_1},\cdots,w_{o_{2m}} 在词典中索引为 o1,,o2mo_1,\cdots,o_{2m},则给定背景词生成中心词的条件概率为:

P(wcwo1,,wo2m)=e12mucT(vo1++vo2m)iVe12muiT(vo1++vo2m)\begin{array}{c} P(w_c | w_{o_1}, \cdots, w_{o_{2m}}) = \frac{e^{\frac{1}{2m} \boldsymbol{u}_c^T (\boldsymbol{v_{o_1}} + \cdots + \boldsymbol{v_{o_{2m}}})}}{\sum_{i \in \mathcal{V}} e^{\frac{1}{2m} \boldsymbol{u}_i^T (\boldsymbol{v_{o_1}} + \cdots + \boldsymbol{v_{o_{2m}}})}} \end{array}

Wo={wo1,,wo2m},vˉo=(vo1++vo2m) \mathcal{W}_o = \{w_{o_1}, \cdots, w_{o_{2m}}\}, \bar{\boldsymbol{v}}_o = (\boldsymbol{v_{o_1}} + \cdots + \boldsymbol{v_{o_{2m}}}) ,则上式可简写成

P(wcWo)=eucTvˉoiVeuiTvoˉ\begin{array}{c} P(w_c | \mathcal{W}_o) = \frac{e^{\boldsymbol{u}_c^T \bar{\boldsymbol{v}}_o}}{\sum_{i \in \mathcal{V}} e^{\boldsymbol{u}_i^T \bar{\boldsymbol{v}_o}}} \end{array}

  • 假设给定一个长度为 TT 的文本序列,设时间步 tt 的词为 w(t)w^{(t)},当窗口大小为 mm 时,连续词袋模型的似然函数是由背景词生成任意中心词的概率

t=1TP(w(t)w(tm),,w(t1),w(t+1),,w(t+m))\begin{array}{c} \prod_{t=1}^T P(w^{(t)} | w^{(t-m)}, \cdots, w^{(t-1)}, w^{(t+1)}, \cdots, w^{(t+m)}) \end{array}

训练连续词袋模型时通过最大化似然函数(最大似然估计)来学习模型参数,等价于最小化损失函数

 t=1TlogP(w(t)w(tm),,w(t1),w(t+1),,w(t+m))\begin{array}{c} \ - \sum_{t=1}^T \log P(w^{(t)} | w^{(t-m)}, \cdots, w^{(t-1)}, w^{(t+1)}, \cdots, w^{(t+m)}) \end{array}

【注】在连续词袋模型中,一般使用背景词向量作为词向量表达词。