GloVe词向量模型原理:全局统计与局部上下文融合解析
聊到GloVe模型,很多人第一反应是“这不就是矩阵分解那一套”。实际上,它走出了一条更精巧的路径——既不放弃全局统计的宏观视角,也不忽略局部上下文的细腻关系,干脆把两者融入同一个数学框架,让它们彼此增益。换句话说,它既非纯矩阵分解,也非Word2Vec式的滑动窗口预测,而是基于词汇共现频率,让向量内积加上偏置项逼近共现次数的对数。这个设计思路,至今仍相当出色。
共现矩阵:全局统计的实操形态
“全局”两个字听起来抽象,但落地很直接——它把每一对词在整个语料中、固定上下文窗口(比如前后5个词)内共同出现的总次数,老老实实统计出来。注意,窗口本身已施加局部约束:只统计相邻或邻近的词,而非随机位置。因此共现矩阵X的每个元素Xᵢⱼ,本质上已天然携带局部信息——每个词对在所有滑动窗口中联合出现的加权次数,距离越近权重越高。
- 例如,“猫”和“可爱”如果在100个窗口里紧挨着出现,“猫”和“引擎”只在3个窗口里擦肩而过,那么X猫,可爱就会远大于X猫,引擎。
- 矩阵维度是V×V(V是词汇表大小),但实际存储通常采用稀疏结构——绝大多数词对从未共现,Xᵢⱼ = 0。
目标函数:用向量运算拟合统计规律
GloVe不搞概率预测,也不做分类任务。它的目标简单直接:让词向量wᵢ和ŵⱼ的内积,加上两个独立偏置bᵢ、b̂ⱼ,尽可能等于log(Xᵢⱼ)。即希望:
wᵢ⊤ŵⱼ + bᵢ + b̂ⱼ ≈ log(Xᵢⱼ)
这个等式直接连通两个世界:一边是连续、可微、支持向量运算的数学空间,另一边是离散、真实、带有语义强度的共现计数。内积反映相似性,偏置项吸收词频带来的固有偏差——像“的”这种高频词本就容易与任何词共现,需要单独校准。
- 当Xᵢⱼ = 0时,log(0)无意义,GloVe直接跳过此项,避免引入噪声。
- 当Xᵢⱼ很小(比如1到5),log(Xᵢⱼ)为负数但很敏感,模型会认真拟合这些低频但可靠的信号。
- 当Xᵢⱼ很大(比如“the”和“cat”这类高频组合),log将其压缩,防止主导梯度更新。
加权损失:平衡高低频词的训练贡献
直接采用平方误差(wᵢ⊤ŵⱼ + bᵢ + b̂ⱼ − log Xᵢⱼ)²进行训练,高频共现仍会干扰全局。GloVe引入权重函数f(Xᵢⱼ),最终损失变为:
f(Xᵢⱼ) × (wᵢ⊤ŵⱼ + bᵢ + b̂ⱼ − log Xᵢⱼ)²
典型的f设计如下:当Xᵢⱼ ≤ xₘₐₓ时,f(Xᵢⱼ) = (Xᵢⱼ/xₘₐₓ)α;否则为1。α通常取0.75,xₘₐₓ设为100。该机制的效果:
- Xᵢⱼ = 0 → f = 0,完全忽略从未共现的词对。
- Xᵢⱼ在1到xₘₐₓ之间 → f随Xᵢⱼ平缓上升,低频共现获得合理权重。
- Xᵢⱼ > xₘₐₓ → f饱和为1,高频共现不再放大梯度。
为什么能支持语义类比?
核心原因在于:目标函数强制向量关系符合共现比率。比如“king”和“man”的共现比,如果接近“queen”和“woman”的共现比,即:
log(Xking,man/Xking,woman) ≈ log(Xqueen,man/Xqueen,woman)
展开这一等式,等价于(wking − wqueen)⊤(wman − wwoman) ≈ 常数——说明向量差的方向一致。大量这样的比率被模型吸收后,最终自然涌现出“king − man + woman”趋近“queen”这类经典线性关系。
这种线性结构并非人为堆砌,而是全局共现模式在向量空间中自然涌现的结果。归根结底,GloVe的厉害之处在于:用简洁的数学假设,将隐藏在统计数字背后的语义结构,老老实实地呈现出来。
