全局向量的词嵌入(GloVe)
让我们先回顾一下word2vec中的跳字模型。将跳字模型中使用softmax运算表达的条件概率P(wj∣wi)P(w_j\mid w_i)P(wj∣wi)记作qijq_{ij}qij,即
qij=exp(uj⊤vi)∑k∈Vexp(uk⊤vi), q_{ij}=\frac{\exp(\boldsymbol{u}_j^\top \boldsymbol{v}_i)}{ \sum_{k \in \mathcal{V}} \text{exp}(\boldsymbol{u}_k^\top \boldsymbol{v}_i)}, qij=∑k∈Vexp(uk⊤vi)exp(uj⊤vi),
其中vi\boldsymbol{v}_ivi和ui\boldsymbol{u}_iui分别是索引为iii的词wiw_iwi作为中心词和背景词时的向量表示,V={0,1,…,∣V∣−1}\mathcal{V} = \{0, 1, \ldots, |\mathcal{V}|-1\}V={0,1,…,∣V∣−1}为词典索引集。
对于词wiw_iwi,它在数据集中可能多次出现。我们将每一次以它作为中心词的所有背景词全部汇总并保留重复元素,记作多重集(multiset)Ci\mathcal{C}_iCi。一个元素在多重集中的个数称为该元素的重数(multiplicity)。举例来说,假设词wiw_iwi在数据集中出现2次:文本序列中以这2个wiw_iwi作为中心词的背景窗口分别包含背景词索引2,1,5,22,1,5,22,1,5,2和2,3,2,12,3,2,12,3,2,1。那么多重集Ci={1,1,2,2,2,2,3,5}\mathcal{C}_i = \{1,1,2,2,2,2,3,5\}Ci={1,1,2,2,2,2,3,5},其中元素1的重数为2,元素2的重数为4,元素3和5的重数均为1。将多重集Ci\mathcal{C}_iCi中元素jjj的重数记作xijx_{ij}xij:它表示了整个数据集中所有以wiw_iwi为中心词的背景窗口中词wjw_jwj的个数。那么,跳字模型的损失函数还可以用另一种方式表达:
−∑i∈V∑j∈Vxijlog qij. -\sum_{i\in\mathcal{V}}\sum_{j\in\mathcal{V}} x_{ij} \log\,q_{ij}. −i∈V∑j∈V∑xijlogqij.
我们将数据集中所有以词wiw_iwi为中心词的背景词的数量之和∣Ci∣\left|\mathcal{C}_i\right|∣Ci∣记为xix_ixi,并将以wiw_iwi为中心词生成背景词wjw_jwj的条件概率xij/xix_{ij}/x_ixij/xi记作pijp_{ij}pij。我们可以进一步改写跳字模型的损失函数为
−∑i∈Vxi∑j∈Vpijlog qij. -\sum_{i\in\mathcal{V}} x_i \sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}. −i∈V∑xij∈V∑pijlogqij.
上式中,−∑j∈Vpijlog qij-\sum_{j\in\mathcal{V}} p_{ij} \log\,q_{ij}−∑j∈Vpijlogqij计算的是以wiw_iwi为中心词的背景词条件概率分布pijp_{ij}pij和模型预测的条件概率分布qijq_{ij}qij的交叉熵,且损失函数使用所有以词wiw_iwi为中心词的背景词的数量之和来加权。最小化上式中的损失函数会令预测的条件概率分布尽可能接近真实的条件概率分布。
然而,作为常用损失函数的一种,交叉熵损失函数有时并不是好的选择。一方面,正如我们在10.2节(近似训练)中所提到的,令模型预测qijq_{ij}qij成为合法概率分布的代价是它在分母中基于整个词典的累加项。这很容易带来过大的计算开销。另一方面,词典中往往有大量生僻词,它们在数据集中出现的次数极少。而有关大量生僻词的条件概率分布在交叉熵损失函数中的最终预测往往并不准确。
10.5.1 GloVe模型
鉴于此,作为在word2vec之后提出的词嵌入模型,GloVe模型采用了平方损失,并基于该损失对跳字模型做了3点改动 [1]:
- 使用非概率分布的变量pij′=xijp'_{ij}=x_{ij}pij′=xij和qij′=exp(uj⊤vi)q'_{ij}=\exp(\boldsymbol{u}_j^\top \boldsymbol{v}_i)qij′=exp(uj⊤vi),并对它们取对数。因此,平方损失项是(log pij′−log qij′)2=(uj⊤vi−log xij)2\left(\log\,p'_{ij} - \log\,q'_{ij}\right)^2 = \left(\boldsymbol{u}_j^\top \boldsymbol{v}_i - \log\,x_{ij}\right)^2(logpij′−logqij′)2=(uj⊤vi−logxij)2。
- 为每个词wiw_iwi增加两个为标量的模型参数:中心词偏差项bib_ibi和背景词偏差项cic_ici。
- 将每个损失项的权重替换成函数h(xij)h(x_{ij})h(xij)。权重函数h(x)h(x)h(x)是值域在[0,1][0,1][0,1]的单调递增函数。
如此一来,GloVe模型的目标是最小化损失函数
∑i∈V∑j∈Vh(xij)(uj⊤vi+bi+cj−log xij)2.\sum_{i\in\mathcal{V}} \sum_{j\in\mathcal{V}} h(x_{ij}) \left(\boldsymbol{u}_j^\top \boldsymbol{v}_i + b_i + c_j - \log\,x_{ij}\right)^2.i∈V∑j∈V∑h(xij)(uj⊤vi+bi+cj−logxij)2.
其中权重函数h(x)h(x)h(x)的一个建议选择是:当x<cx < cx<c时(如c=100c = 100c=100),令h(x)=(x/c)αh(x) = (x/c)^\alphah(x)=(x/c)α(如α=0.75\alpha = 0.75α=0.75),反之令h(x)=1h(x) = 1h(x)=1。因为h(0)=0h(0)=0h(0)=0,所以对于xij=0x_{ij}=0xij=0的平方损失项可以直接忽略。当使用小批量随机梯度下降来训练时,每个时间步我们随机采样小批量非零xijx_{ij}xij,然后计算梯度来迭代模型参数。这些非零xijx_{ij}xij是预先基于整个数据集计算得到的,包含了数据集的全局统计信息。因此,GloVe模型的命名取“全局向量”(Global Vectors)之意。
需要强调的是,如果词wiw_iwi出现在词wjw_jwj的背景窗口里,那么词wjw_jwj也会出现在词wiw_iwi的背景窗口里。也就是说,xij=xjix_{ij}=x_{ji}xij=xji。不同于word2vec中拟合的是非对称的条件概率pijp_{ij}pij,GloVe模型拟合的是对称的log xij\log\, x_{ij}logxij。因此,任意词的中心词向量和背景词向量在GloVe模型中是等价的。但由于初始化值的不同,同一个词最终学习到的两组词向量可能不同。当学习得到所有词向量以后,GloVe模型使用中心词向量与背景词向量之和作为该词的最终词向量。
10.5.2 从条件概率比值理解GloVe模型
我们还可以从另外一个角度来理解GloVe模型。沿用本节前面的符号,P(wj∣wi)P(w_j \mid w_i)P(wj∣wi)表示数据集中以wiw_iwi为中心词生成背景词wjw_jwj的条件概率,并记作pijp_{ij}pij。作为源于某大型语料库的真实例子,以下列举了两组分别以“ice”(冰)和“steam”(蒸汽)为中心词的条件概率以及它们之间的比值 [1]:
| wkw_kwk= | “solid” | “gas” | “water” | “fashion” |
|---|---|---|---|---|
| p1=P(wk∣p_1=P(w_k\midp1=P(wk∣ “ice” ))) | 0.00019 | 0.000066 | 0.003 | 0.000017 |
| p2=P(wk∣p_2=P(w_k\midp2=P(wk∣ “steam” ))) | 0.000022 | 0.00078 | 0.0022 | 0.000018 |
| p1/p2p_1/p_2p1/p2 | 8.9 | 0.085 | 1.36 | 0.96 |
我们可以观察到以下现象。
- 对于与“ice”相关而与“steam”不相关的词wkw_kwk,如wk=w_k=wk=“solid”(固体),我们期望条件概率比值较大,如上表最后一行中的值8.9;
- 对于与“ice”不相关而与“steam”相关的词wkw_kwk,如wk=w_k=wk=“gas”(气体),我们期望条件概率比值较小,如上表最后一行中的值0.085;
- 对于与“ice”和“steam”都相关的词wkw_kwk,如wk=w_k=wk=“water”(水),我们期望条件概率比值接近1,如上表最后一行中的值1.36;
- 对于与“ice”和“steam”都不相关的词wkw_kwk,如wk=w_k=wk=“fashion”(时尚),我们期望条件概率比值接近1,如上表最后一行中的值0.96。
由此可见,条件概率比值能比较直观地表达词与词之间的关系。我们可以构造一个词向量函数使它能有效拟合条件概率比值。我们知道,任意一个这样的比值需要3个词wiw_iwi、wjw_jwj和wkw_kwk。以wiw_iwi作为中心词的条件概率比值为pij/pik{p_{ij}}/{p_{ik}}pij/pik。我们可以找一个函数,它使用词向量来拟合这个条件概率比值
f(uj,uk,vi)≈pijpik. f(\boldsymbol{u}_j, \boldsymbol{u}_k, {\boldsymbol{v}}_i) \approx \frac{p_{ij}}{p_{ik}}. f(uj,uk,vi)≈pikpij.
这里函数fff可能的设计并不唯一,我们只需考虑一种较为合理的可能性。注意到条件概率比值是一个标量,我们可以将fff限制为一个标量函数:f(uj,uk,vi)=f((uj−uk)⊤vi)f(\boldsymbol{u}_j, \boldsymbol{u}_k, {\boldsymbol{v}}_i) = f\left((\boldsymbol{u}_j - \boldsymbol{u}_k)^\top {\boldsymbol{v}}_i\right)f(uj,uk,vi)=f((uj−uk)⊤vi)。交换索引jjj和kkk后可以看到函数fff应该满足f(x)f(−x)=1f(x)f(-x)=1f(x)f(−x)=1,因此一种可能是f(x)=exp(x)f(x)=\exp(x)f(x)=exp(x),于是
f(uj,uk,vi)=exp(uj⊤vi)exp(uk⊤vi)≈pijpik.f (\boldsymbol{u}_j, \boldsymbol{u}_k, {\boldsymbol{v}}_i) = \frac{\exp\left(\boldsymbol{u}_j^\top {\boldsymbol{v}}_i\right)}{\exp\left(\boldsymbol{u}_k^\top {\boldsymbol{v}}_i\right)} \approx \frac{p_{ij}}{p_{ik}}. f(uj,uk,vi)=exp(uk⊤vi)exp(uj⊤vi)≈pikpij.
满足最右边约等号的一种可能是exp(uj⊤vi)≈αpij\exp\left(\boldsymbol{u}_j^\top {\boldsymbol{v}}_i\right) \approx \alpha p_{ij}exp(uj⊤vi)≈αpij,这里α\alphaα是一个常数。考虑到pij=xij/xip_{ij}=x_{ij}/x_ipij=xij/xi,取对数后uj⊤vi≈log α+log xij−log xi\boldsymbol{u}_j^\top {\boldsymbol{v}}_i \approx \log\,\alpha + \log\,x_{ij} - \log\,x_iuj⊤vi≈logα+logxij−logxi。我们使用额外的偏差项来拟合−log α+log xi- \log\,\alpha + \log\,x_i−logα+logxi,例如,中心词偏差项bib_ibi和背景词偏差项cjc_jcj:
uj⊤vi+bi+cj≈log(xij). \boldsymbol{u}_j^\top \boldsymbol{v}_i + b_i + c_j \approx \log(x_{ij}). uj⊤vi+bi+cj≈log(xij).
对上式左右两边取平方误差并加权,我们可以得到GloVe模型的损失函数。
小结
- 在有些情况下,交叉熵损失函数有劣势。GloVe模型采用了平方损失,并通过词向量拟合预先基于整个数据集计算得到的全局统计信息。
- 任意词的中心词向量和背景词向量在GloVe模型中是等价的。
本文深入解析GloVe模型,一种改进的词嵌入技术,采用平方损失并利用全局统计信息,使得词向量能更有效地捕获词间关系。文章对比了GloVe与word2vec的区别,阐述了其如何通过拟合对称的条件概率比值来提升词向量的质量。
7032

被折叠的 条评论
为什么被折叠?



