GloVe
GloVe 的全称是 Global Vectors for Word Representation,由斯坦福团队于2014年提出。它的核心思想是:通过全局统计信息(共现矩阵)与局部上下文窗口方法相结合,来学习词向量。
核心思想
与 Word2Vec(通过局部窗口预测)不同,GloVe 认为,词与词共现的统计信息本身就蕴含了丰富的语义信息。例如,“冰”和“水”经常共现,“冰”和“蒸汽”也经常共现,但“水”和“蒸汽”的共现频率更高。这些共现频率的比率比单纯的共现频率更能区分词义。
在详细说明GloVe的计算过程之前,我们重温一下条件概率的知识,条件概率的计算公式:
$$ P(A|B) = \frac{P(A \cap B)}{P(B)} \quad P(B) > 0 $$
$P(A∣B)$:在事件 $B$ 已经发生的条件下,事件 $A$ 发生的概率,读作:在 $B$ 条件下 $A$ 的概率,其中:
- $P(A\cap B)$:$A$ 和 $B$ 同时发生的概率(联合概率)
- $P(B)$:$B$ 发生的概率
GloVe中的条件概率
上下文词的条件概率:
$$ P(w_j|w_i)$$
在文本中已知中心词是$w_i$的条件下,上下文词是$w_j$的概率。它的计算公式是:
$$ P(w_j|w_i) = \frac{\text{count}(w_i,w_j)}{\text{count}(w_i的所有上下文词)} $$
$\text{count}(w_i,w_j)$:词$w_i$和$w_j$在某个窗口内共现的次数;$\text{count}(w_i)$:词$w_i$作为中心词出现的总次数
假设有语料:语料库:
- "我 喜欢 苹果"
- "我 喜欢 桔子"
- "苹果很好吃"
窗口大小:左右各1个词(总窗口大小=2),按中心词汇总上下文词:
对于 "喜欢" 作为中心词:
- 句1:"喜欢" 有上下文 ["我", "苹果"] → 2个
- 句2:"喜欢" 有上下文 ["我", "桔子"] → 2个
- 句3"喜欢" 没有出现
总计:"喜欢" 作为中心词时,共有 2 + 2 = 4个上下文词, 当 "喜欢"作为中心词时,“我”出现了两次。
$$ \text{count}(喜欢,我) = 2\quad \text{count}(喜欢的所有上下文词) = 4$$
$$P(我|喜欢) = \frac{\text{count}(喜欢,我)}{\text{count}(喜欢的所有上下文词)} = \frac{2}{4} = 0.5$$
同样的方法可计算
$$P(苹果|喜欢) = \frac{\text{count}(喜欢,苹果)}{\text{count}(喜欢的所有上下文词)} = \frac{1}{4} = 0.25$$
$$P(桔子|喜欢) = \frac{\text{count}(喜欢,桔子)}{\text{count}(喜欢的所有上下文词)} = \frac{1}{4} = 0.25$$
对于给定的中心词$w_i$,所有可能上下文词的条件概率之和必须为1:
$$\sum_{j=1}^{V}P(w_j|w_i) = 1$$
如果用总上下文词数作为分母:
$$P(w_j|w_i) = \frac{X_{ij}}{X_i}\quad X_i = \sum_{j}X_{ij} $$
GloVe的作者发现,条件概率的比率比条件概率本身更能揭示语义。经典例子:冰 vs 蒸汽
| 概率 | $P(⋅∣冰)$ | $P(⋅∣蒸汽)$ | 比率$P(⋅∣冰)/P(⋅∣蒸汽)$ |
|---|---|---|---|
| 固体 | 高 | 低 | 很大 (>1) |
| 气体 | 低 | 高 | 很小 (<1) |
| 水 | 高 | 高 | 接近1 |
| 时尚 | 低 | 低 | 接近1 |
对于任意词$k$(如"固体"、"气体"、"水"、"时尚"):
$$\frac{P(w_k|w_i)}{P(w_k|w_j)} = \frac{X_{ik}/X_i}{X_{jk}/X_j} = \frac{X_{ik} \cdot X_j}{X_{jk}\cdot X_i} $$
GloVe希望词向量满足:
$$ \frac{P(w_k|w_i)}{P(w_k|w_j)} \approx \frac{\text{exp}(w_i^T\tilde{w}_k)}{\text{exp}(w_j^T\tilde{w}_k)} = \text{exp}((w_i - w_j)^T\tilde{w}_k) $$
取对数:
$$ (w_i - w_j)^T\tilde{w}_k \approx \log \frac{P(w_k|w_i)}{P(w_k|w_j)} $$
如果词向量完美
$$ w_i^T\tilde{w}_j \approx \log(X_{ij}) $$
推导过程:
令$P_{ik} = P(w_k|w_i), P_{jk} = P(w_k|w_j)$,那么
$$ (w_i - w_j)^T\tilde{w}_k \approx \log P_{ik} - \log P_{jk} $$
$$ \log P_{ik} = \log X_{ik} - \log X_i$$
$$ \log P_{jk} = \log X_{jk} - \log X_j$$
所以
$$ (w_i - w_j)^T\tilde{w}_k \approx (\log X_{ik} - \log X_i) - (\log X_{jk} - \log X_j)$$
$$ w_i^T\tilde{w}_k - \log X_{ik} \approx w_j^T\tilde{w}_k - \log X_{jk} + (\log X_i - \log X_j) $$
因此,对于完美词向量,应该存在函数 $g ( i )$ 只依赖于 $i$,使得:
$$ w_i^T\tilde{w}_k - \log X_{ik} = g(i),对于所有k $$
$$ w_k^T\tilde{w}_j - \log X_{kj} = h(i),对于所有k $$
同时满足这两个条件的最一般形式是:存在常数$a_i$(只依赖于$i$)和$b_j$(只依赖于$j$),使得:
$$w_i^T\tilde{w}_j = \log X_{ij}- a_i - b_i$$
$$w_i^T\tilde{w}_j +a_i+b_j= \log X_{ij}$$
训练方法详解
第一步:构建全局共现矩阵
假设语料库中有 $V$ 个不同的词,我们构建一个 $V \times V$ 的矩阵 $X$,其中元素 $X_{ij}$ 表示:
词 $j$ 出现在词 $i$ 的上下文窗口中的总次数。通常,上下文窗口有一个固定大小(如左右各5个词)。同时,GloVe 会给距离中心词更远的共现词赋予较小的权重(通过衰减函数),表明距离越近越重要。这个矩阵 $X$ 是对称的,并且包含了整个语料库的全局统计信息。
第二步:定义优化目标(损失函数)
GloVe 的关键在于其巧妙的损失函数设计。它希望学习到的词向量能够拟合共现概率的比率。
- 基本假设:词向量的点积应该能够表示共现概率的对数。
- 引入偏差项和权重函数:
- 设计加权损失函数:
- 最终损失函数:
$$ w_i^T\tilde{w}_j \approx \log(X_{ij}) $$ $w_i$是作为中心词时的向量, $\tilde{w}_j$是作为上下文词时的向量
$$w_i^T\tilde{w}_j + a_i + \tilde{b}_j = \log(X_{ij})$$其中$b_i,\tilde{b}_j$是标量偏差项,用于捕捉词本身的频率偏差。
目标是让等式两边尽可能相等,所以使用平方误差。但需要引入一个权重函数 $f(X_{ij})$ 来解决两个关键
处理零值:当 $X_{ij} = 0$ 时, $f ( 0 ) = 0$,避免对零值项进行计算。
衡常见词与罕见词:不能对所有 $( i , j )$ 对平等看待。非常常见的共现(如“the”和“of”)可能携带较少语义信息,而中等频率的共现更重要。
权重函数 $f(x)$ 的典型形式为:
$$ f(x) = \begin{cases} \left( \frac{x}{x_{\text{max}}} \right)^{\alpha} & \text{if}\quad x < x_{\text{max}}\\ 1 & \text{otherwise}\end{cases}$$
其中 $x_{\text{max}}$ 是一个截断阈值(如100), $\alpha$ 是一个衰减参数(如0.75)。这个函数给中低频共现赋予了相对较高的权重,给高频共现赋予了饱和的较低权重,并完全忽略零值。
$$ J= \sum_{i=1}^V\sum_{j=1}^Vf(X_{ij})(w_i^T\tilde{w}_j + b_i+\tilde{b}_j - \log X_{ij})^2$$
目标:通过梯度下降等优化算法,最小化这个损失函数$J$,从而找到所有词向量$w_i,\tilde{w}_j$和偏差项$b_i,\tilde{b}_j$的最优值。
第三步:训练与得到词嵌入矩阵
训练完成后,对于每个词 $i$,我们得到两个向量: $w_i$ (中心词向量)和 $\tilde{w}_i$ (上下文词向量)。GloVe 的常见做法是将两者相加:
$$ \text{FinalVector}_i = w_i + \tilde{w}_i$$
距离衰减函数的定义
$$f(d) = \frac{1}{d}$$ $d$上下文词与中心词的距离(以词数为单位)