词嵌入(word2vec)
自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。顾名思义,词向量是用来表示词的向量,也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌入(word embedding)。近年来,词嵌入已逐渐成为自然语言处理的基础知识。
跳字模型
跳字模型假设基于某个词来生成它在文本序列周围的词。举个例子:
- 假设文本序列是“the”“man”“loves”“his”“son”
- 以“loves”作为中心词,设背景窗口大小为2
如下图所示,跳字模型所关心的是,给定中心词“loves”,生成与它距离不超过2个词的背景词“the”“man”“his”“son”的条件概率,即
P(the",man",his",son"∣“loves").P(\textrm{the"},\textrm{man"},\textrm{his"},\textrm{son"}\mid\textrm{``loves"}).P(the",man",his",son"∣“loves").
假设给定中心词的情况下,背景词的生成是相互独立的,那么上式可以改写成
P(the"∣loves")⋅P(man"∣loves")⋅P(his"∣loves")⋅P(son"∣loves").P(\textrm{the"}\mid\textrm{loves"})\cdot P(\textrm{man"}\mid\textrm{loves"})\cdot P(\textrm{his"}\mid\textrm{loves"})\cdot P(\textrm{son"}\mid\textrm{loves"}).P(the"∣loves")⋅P(man"∣loves")⋅P(his"∣loves")⋅P(son"∣loves").
在跳字模型中,每个词被表示成两个ddd维向量,用来计算条件概率。
- 假设这个词在词典中索引为iii
- 当它为中心词时向量表示为vi∈Rd\boldsymbol{v}_i\in\mathbb{R}^dvi∈Rd
- 当它为背景词时向量表示为ui∈Rd\boldsymbol{u}_i\in\mathbb{R}^dui∈Rd
- 设中心词wcw_cwc在词典中索引为ccc,背景词wow_owo在词典中索引为ooo
给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到:
P(wo∣wc)=exp(uo⊤vc)∑i∈Vexp(ui⊤vc),P(w_o \mid w_c) = \frac{\text{exp}(\boldsymbol{u}_o^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)},P(wo∣wc)=∑i∈Vexp(ui⊤vc)exp(uo⊤vc),
其中词典索引集V=0,1,…,∣V∣−1\mathcal{V} = {0, 1, \ldots, |\mathcal{V}|-1}V=0,1,…,∣V∣−1。假设给定一个长度为TTT的文本序列,设时间步ttt的词为w(t)w^{(t)}w(t)。假设给定中心词的情况下背景词的生成相互独立,当背景窗口大小为mmm时,跳字模型的似然函数即给定任一中心词生成所有背景词的概率。
∏t=1T∏−m≤j≤m,j≠0P(w(t+j)∣w(t)),\prod_{t=1}^{T} \prod_{-m \leq j \leq m,\ j \neq 0} P(w^{(t+j)} \mid w^{(t)}),t=1∏T−m≤j≤m, j=0∏P(w(t+j)∣w(t)),
这里小于1和大于TTT的时间步可以忽略。
训练跳字模型
跳字模型的参数是每个词所对应的中心词向量和背景词向量。训练中我们通过最大化似然函数来学习模型参数,即最大似然估计。这等价于最小化以下损失函数:
−∑t=1T∑−m≤j≤m,j≠0logP(w(t+j)∣w(t)).- \sum_{t=1}^{T} \sum_{-m \leq j \leq m,\ j \neq 0} \text{log}P(w^{(t+j)} \mid w^{(t)}).−t=1∑T−m≤j≤m, j=0∑logP(w(t+j)∣w(t)).
如果使用随机梯度下降,那么在每一次迭代里我们随机采样一个较短的子序列来计算有关该子序列的损失,然后计算梯度来更新模型参数。梯度计算的关键是条件概率的对数有关中心词向量和背景词向量的梯度。根据定义,首先看到
logP(wo∣wc)=uo⊤vc−log(∑i∈Vexp(ui⊤vc))\log P(w_o \mid w_c) = \boldsymbol{u}_o^\top \boldsymbol{v}_c - \log\left(\sum{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)\right)logP(wo∣wc)=uo⊤vc−log(∑i∈Vexp(ui⊤vc))
通过微分,我们可以得到上式中vc\boldsymbol{v}_cvc的梯度
∂logP(wo∣wc)∂vc=uo−∑j∈Vexp(uj⊤vc)uj∑i∈Vexp(ui⊤vc)=uo−∑j∈V(exp(uj⊤vc)∑i∈Vexp(ui⊤vc))uj=uo−∑j∈VP(wj∣wc)uj.\begin{aligned} \frac{\partial \text{log} P(w_o \mid w_c)}{\partial \boldsymbol{v}_c} &= \boldsymbol{u}_o - \frac{\sum_{j \in \mathcal{V}} \exp(\boldsymbol{u}_j^\top \boldsymbol{v}_c)\boldsymbol{u}_j}{\sum_{i \in \mathcal{V}} \exp(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\ \\&= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} \left(\frac{\text{exp}(\boldsymbol{u}_j^\top \boldsymbol{v}_c)}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \boldsymbol{v}_c)}\right) \boldsymbol{u}_j\ \\&= \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} P(w_j \mid w_c) \boldsymbol{u}_j. \end{aligned} ∂vc∂logP(wo∣wc)=uo−∑i∈Vexp(ui⊤vc)∑j∈Vexp(uj⊤vc)uj =uo−j∈V∑(∑i∈Vexp(ui⊤vc)exp(uj⊤vc))uj =uo−j∈V∑P(wj∣wc)uj.
它的计算需要词典中所有词以wcw_cwc为中心词的条件概率。有关其他词向量的梯度同理可得。
训练结束后,对于词典中的任一索引为iii的词,我们均得到该词作为中心词和背景词的两组词向量vi\boldsymbol{v}_ivi和ui\boldsymbol{u}_iui。在自然语言处理应用中,一般使用跳字模型的中心词向量作为词的表征向量。
连续词袋模型
连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。在同样的文本序列“the”“man”“loves”“his”“son”里,以“loves”作为中心词,且背景窗口大小为2时,连续词袋模型关心的是,给定背景词“the”“man”“his”“son”生成中心词“loves”的条件概率(如下图所示),也就是
P(“loves"∣“the",man",his",“son").P(\textrm{“loves"}\mid\textrm{“the"},\textrm{man"},\textrm{his"},\textrm{``son"}).P(“loves"∣“the",man",his",“son").
因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。设vi∈Rd\boldsymbol{v_i}\in\mathbb{R}^dvi∈Rd和ui∈Rd\boldsymbol{u_i}\in\mathbb{R}^dui∈Rd分别表示词典中索引为iii的词作为背景词和中心词的向量(注意符号的含义与跳字模型中的相反)。设中心词wcw_cwc在词典中索引为ccc,背景词wo1,…,wo2mw_{o_1}, \ldots, w_{o_{2m}}wo1,…,wo2m在词典中索引为o1,…,o2mo_1, \ldots, o_{2m}o1,…,o2m,那么给定背景词生成中心词的条件概率
P(wc∣wo1,…,wo2m)=exp(12muc⊤(vo1+…+vo2m))∑i∈Vexp(12mui⊤(vo1+…+vo2m)).P(w_c \mid w_{o_1}, \ldots, w_{o_{2m}}) = \frac{\text{exp}\left(\frac{1}{2m}\boldsymbol{u}_c^\top (\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o{2m}}) \right)}{ \sum_{i \in \mathcal{V}} \text{exp}\left(\frac{1}{2m}\boldsymbol{u}_i^\top (\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o{2m}}) \right)}.P(wc∣wo1,…,wo2m)=∑i∈Vexp(2m1ui⊤(vo1+…+vo2m))exp(2m1uc⊤(vo1+…+vo2m)).
为了让符号更加简单,我们记Wo=wo1,…,wo2m\mathcal{W}o= {w{o_1}, \ldots, w_{o_{2m}}}Wo=wo1,…,wo2m,且vˉo=(vo1+…+vo2m)/(2m)\bar{\boldsymbol{v}}_o = \left(\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o_{2m}} \right)/(2m)vˉo=(vo1+…+vo2m)/(2m),那么上式可以简写成
P(wc∣Wo)=exp(uc⊤vˉo)∑i∈Vexp(ui⊤vˉo).P(w_c \mid \mathcal{W}_o) = \frac{\exp\left(\boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o\right)}{\sum_{i \in \mathcal{V}} \exp\left(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o\right)}.P(wc∣Wo)=∑i∈Vexp(ui⊤vˉo)exp(uc⊤vˉo).
给定一个长度为TTT的文本序列,设时间步ttt的词为w(t)w^{(t)}w(t),背景窗口大小为mmm。连续词袋模型的似然函数是由背景词生成任一中心词的概率
∏t=1TP(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m)).\prod_{t=1}^{T} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).t=1∏TP(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m)).
训练连续词袋模型
训练连续词袋模型同训练跳字模型基本一致。连续词袋模型的最大似然估计等价于最小化损失函数
−∑t=1TlogP(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m)).-\sum_{t=1}^T \text{log} P(w^{(t)} \mid w^{(t-m)}, \ldots, w^{(t-1)}, w^{(t+1)}, \ldots, w^{(t+m)}).−t=1∑TlogP(w(t)∣w(t−m),…,w(t−1),w(t+1),…,w(t+m)).
注意到
logP(wc∣Wo)=uc⊤vˉo−log(∑i∈Vexp(ui⊤vˉo)).\log P(w_c \mid \mathcal{W}_o) = \boldsymbol{u}_c^\top \bar{\boldsymbol{v}}_o - \log\left(\sum_{i \in \mathcal{V}} \exp\left(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o\right)\right).logP(wc∣Wo)=uc⊤vˉo−log(i∈V∑exp(ui⊤vˉo)).
通过微分,我们可以计算出上式中条件概率的对数有关任一背景词向量voi\boldsymbol{v}_{o_i}voi(i=1,…,2mi = 1, \ldots, 2mi=1,…,2m)的梯度
∂logP(wc∣Wo)∂voi=12m(uc−∑j∈Vexp(uj⊤vˉo)uj∑i∈Vexp(ui⊤vˉo))=12m(uc−∑j∈VP(wj∣Wo)uj).\frac{\partial \log P(w_c \mid \mathcal{W}_o)}{\partial \boldsymbol{v}_{o_i}} = \frac{1}{2m} \left(\boldsymbol{u}_c - \sum_{j \in \mathcal{V}} \frac{\exp(\boldsymbol{u}_j^\top \bar{\boldsymbol{v}}_o)\boldsymbol{u}_j}{ \sum_{i \in \mathcal{V}} \text{exp}(\boldsymbol{u}_i^\top \bar{\boldsymbol{v}}_o)} \right) \\ = \frac{1}{2m}\left(\boldsymbol{u}_c - \sum_{j \in \mathcal{V}} P(w_j \mid \mathcal{W}_o) \boldsymbol{u}_j \right).∂voi∂logP(wc∣Wo)=2m1⎝⎛uc−j∈V∑∑i∈Vexp(ui⊤vˉo)exp(uj⊤vˉo)uj⎠⎞=2m1⎝⎛uc−j∈V∑P(wj∣Wo)uj⎠⎞.
有关其他词向量的梯度同理可得。同跳字模型不一样的一点在于,我们一般使用连续词袋模型的背景词向量作为词的表征向量。
- 词向量是用来表示词的向量。把词映射为实数域向量的技术也叫词嵌入。
- word2vec包含跳字模型和连续词袋模型。跳字模型假设基于中心词来生成背景词。连续词袋模型假设基于背景词来生成中心词。