1. 词嵌入(word2vec)
相关背景知识,参见 Word2Vec-知其然知其所以然 博客的学习笔记。
自然语言是一套用来表达含义的复杂系统,其中,词是表义的基本单元。
顾名思义,词向量是用来表示词的向量,也可视作词的特征向量或表征。
将词映射为实数域向量的技术称作词嵌入(word embedding)。
近年来,词嵌入已逐渐成为自然语言处理的基础知识。
1.1 one-hot vs word2vec
假设词典中不同词的数量(词典大小)为 N N N,每个词可以和从0到 N − 1 N-1 N−1的连续整数一一对应。这些与词对应的整数称作词的索引。
假设一个词的索引为 i i i,为了得到该词的one-hot向量表示,需要创建一个全0的长为 N N N的向量,并将其第 i i i位设成1。由此,每个词可以表示为一个长度为 N N N的向量,从而直接被神经网络使用。
虽然one-hot词向量构造起来很容易,但通常情况并不是一个好选择。主要的原因是:
one-hot词向量无法准确表达不同词之间的相似度。
以经常使用的余弦相似度为例。对于向量 x , y ∈ R d \boldsymbol{x}, \boldsymbol{y} \in \mathbb{R}^d x,y∈Rd,它们的余弦相似度是它们之间夹角的余弦值:
x ⊤ y ∣ x ∣ ∣ y ∣ ∈ [ − 1 , 1 ] \frac{\boldsymbol{x}^\top \boldsymbol{y}}{|\boldsymbol{x}| |\boldsymbol{y}|} \in [-1, 1] ∣x∣∣y∣x⊤y∈[−1,1]
由于任何两个不同词的one-hot向量的余弦相似度都为0,因此,多个不同词之间的相似度难以通过one-hot向量准确地体现出来。
word2vec工具的提出正是为了解决该问题。它将每个词表示成一个定长的向量,并使得这些向量能较好地表达不同词之间的相似和类比关系。
word2vec工具包含了两个模型,即跳字模型(skip-gram)和连续词袋模型(continuous bag of words,CBOW)。
1.2 skip-gram
1.2.1 基本概念
跳字模型假设基于某个词来生成它在文本序列周围的词。
假设文本序列为:“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")
在跳字模型中,每个词被表示为两个 d d d维向量,用来计算条件概率。
假设这个词在词典中索引为 i i i,当它为中心词时向量表示为 v i ∈ R d \boldsymbol{v}_i\in\mathbb{R}^d vi∈Rd,而为背景词时向量表示为 u i ∈ R d \boldsymbol{u}_i\in\mathbb{R}^d ui∈Rd。
设中心词 w c w_c wc在词典中索引为 c c c,背景词 w o w_o wo在词典中索引为 o o o,给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算得到:
P ( w o ∣ w c ) = exp ( u o ⊤ v c ) ∑ i ∈ V exp ( u i ⊤ v c ) , 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}。
假设给定一个长度为 T T T的文本序列,设时间步 t t t的词为 w ( t ) w^{(t)} w(t)。假设给定中心词的情况下背景词的生成相互独立。
当背景窗口大小为 m m m时,跳字模型的似然函数,即为给定任一中心词生成所有背景词的概率:
∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 P ( 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和大于 T T T的时间步可以忽略。
1.2.2 模型训练
跳字模型的参数是每个词所对应的中心词向量和背景词向量。
训练中通过最大化似然函数来学习模型参数,即最大似然估计。这等价于最小化以下损失函数:
− ∑ t = 1 T ∑ − m ≤ j ≤ m , j ≠ 0 log P ( 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))
若使用随机梯度下降,那么,每一次迭代将先随机采样一个较短的子序列来计算有关该子序列的损失,然后计算梯度来更新模型参数。
梯度计算的关键是,条件概率的对数有关中心词向量和背景词向量的梯度。
根据定义,并结合对数运算的性质,首先有:
log P ( w o ∣ w c ) = u o ⊤ v c − log ( ∑ i ∈ V exp ( u i ⊤ v c ) ) \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∈V∑exp(ui⊤vc))
通过微分,可得上式中 v c \boldsymbol{v}_c vc的梯度:
∂ log P ( w o ∣ w c ) ∂ v c = u o − ∑ j ∈ V exp ( u j ⊤ v c ) u j ∑ i ∈ V exp ( u i ⊤ v c ) = u o − ∑ j ∈ V ( exp ( u j ⊤ v c ) ∑ i ∈ V exp ( u i ⊤ v c ) ) u j = u o − ∑ j ∈ V P ( w j ∣ w c ) u j \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)}\ \\ \text{} \\ \qquad \qquad \qquad \qquad \quad \quad \, \, \, \, = \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\ \\ \text{} \\ \qquad \qquad \qquad = \boldsymbol{u}_o - \sum_{j \in \mathcal{V}} P(w_j \mid w_c) \boldsymbol{u}_j ∂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
其中,该梯度的计算需要词典中所有词以 w c w_c wc为中心词的条件概率。
有关其他词向量的梯度同理可得。
训练结束后,对于词典中的任一索引为 i i i的词,均得到该词作为中心词和背景词的两组词向量 v i \boldsymbol{v}_i vi和 u i \boldsymbol{u}_i ui。
在自然语言处理应用中,一般使用跳字模型的中心词向量作为词的表征向量。
1.3 CBOW
1.3.1 基本概念
与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。
在同样的文本序列“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")
由于连续词袋模型的背景词存在多个,需要将这些背景词向量取平均,然后使用和跳字模型相同的方法来计算条件概率。
设 v i ∈ R d \boldsymbol{v_i}\in\mathbb{R}^d vi∈Rd和 u i ∈ R d \boldsymbol{u_i}\in\mathbb{R}^d ui∈Rd分别表示词典中索引为 i i i的词作为背景词和中心词的向量(注:符号含义与跳字模型中相反)。
设中心词 w c w_c wc在词典中索引为 c c c,背景词 w o 1 , … , w o 2 m w_{o_1}, \ldots, w_{o_{2m}} wo1,…,wo2m在词典中索引为 o 1 , … , o 2 m o_1, \ldots, o_{2m} o1,…,o2m。那么,有给定背景词生成中心词的条件概率:
P ( w c ∣ w o 1 , … , w o 2 m ) = exp ( 1 2 m u c ⊤ ( v o 1 + … + v o 2 m ) ) ∑ i ∈ V exp ( 1 2 m u i ⊤ ( v o 1 + … + v o 2 m ) ) 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))
为了简化符号,记 W o = w o 1 , … , w o 2 m \mathcal{W}_o= {w_{o_1}, \ldots, w_{o_{2m}}} Wo=wo1,…,wo2m,且 v ˉ o = ( v o 1 + … + v o 2 m ) / ( 2 m ) \bar{\boldsymbol{v}}_o = \left(\boldsymbol{v}_{o_1} + \ldots + \boldsymbol{v}_{o{2m}} \right)/(2m) vˉo=(vo1+…+vo2m)/(2m)。
那么,上式可以简写为:
P ( w c ∣ W o ) = exp ( u c ⊤ v ˉ o ) ∑ i ∈ V exp ( u i ⊤ 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)
给定一个长度为 T T T的文本序列,设时间步 t t t的词为 w ( t ) w^{(t)} w(t),背景窗口大小为 m m m。
连续词袋模型的似然函数是由背景词生成任一中心词的概率:
∏ t = 1 T P ( 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))
1.3.2 模型训练
训练连续词袋模型同训练跳字模型基本一致。
连续词袋模型的最大似然估计等价于最小化损失函数:
− ∑ t = 1 T log P ( 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))
根据定义,并结合对数运算的性质,首先有:
log P ( w c ∣ W o ) = u c ⊤ v ˉ o − log ( ∑ i ∈ V exp ( u i ⊤ 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))
通过微分,可以计算出上式中条件概率的对数有关任一背景词向量 v o i \boldsymbol{v}_{o_i} voi( i = 1 , … , 2 m i = 1, \ldots, 2m i=1,…,2m)的梯度:
∂ log P ( w c ∣ W o ) ∂ v o i = 1 2 m ( u c − ∑ j ∈ V exp ( u j ⊤ v ˉ o ) u j ∑ i ∈ V exp ( u i ⊤ v ˉ o ) ) = 1 2 m ( u c − ∑ j ∈ V P ( w j ∣ W o ) u j ) \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) \\ \text{} \\ = \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⎠⎞
有关其他词向量的梯度同理可得。
同跳字模型不同的一点在于,一般使用连续词袋模型的背景词向量作为词的表征向量。