词类比公式与窗口分类推导

分类: 词向量与表示学习 · 难度: 中级 · 关联讲座: L03

词类比公式与窗口分类推导

词类比(Word Analogy)是评估词向量质量的经典内在评估方法,而窗口分类(Window Classification)则是将词向量应用于 NER 等序列标注任务的基础技术。本文推导词类比的数学公式——如何通过向量运算实现”man:woman = king:?”的语义推理,以及窗口分类如何将上下文词向量拼接为分类器输入。

词类比

📐 词类比公式完整推导

变量定义

  • xax_a = 词 aa 的词向量(如 “man”)
  • xbx_b = 词 bb 的词向量(如 “woman”)
  • xcx_c = 词 cc 的词向量(如 “king”)
  • dd = 目标词(如 “queen”)的向量索引
  • \|\cdot\| = L2 范数(向量的欧几里得长度)

推导过程

第 1 步:语义关系 = 向量差。“man → woman” 这个关系可以用 xbxax_b - x_a 表示。训练良好的词向量满足 xbxaxdxcx_b - x_a \approx x_d - x_c,即”性别关系”在向量空间中是一个稳定的偏移方向。

第 2 步:目标向量估计。将关系迁移到 xcx_c,估计 dd 的向量应当接近: x^d=xbxa+xc\hat{x}_d = x_b - x_a + x_c

第 3 步:在词汇表中搜索最近邻。直接用欧几里得距离不够稳定(向量长度不一致),改用余弦相似度cos(x^d,xi)=x^dTxix^dxi\cos(\hat{x}_d, x_i) = \frac{\hat{x}_d^T x_i}{\|\hat{x}_d\| \cdot \|x_i\|}

第 4 步:当所有 xix_i 均已归一化(xi=1\|x_i\| = 1)时,分母中 xi\|x_i\| 可省略: d=argmaxi(xbxa+xc)Txixbxa+xcd = \arg\max_i \frac{(x_b - x_a + x_c)^T x_i}{\|x_b - x_a + x_c\|}

即对查询向量归一化后,直接做点积排名即可。

直觉:词向量空间是”语义坐标系”。不同词对之间的关系对应方向,语义相似 = 方向相同。

🔢 数值计算示例

设定(2维简化版):

向量
man (xax_a)[1.0, 0.0][1.0,\ 0.0]
woman (xbx_b)[0.0, 1.0][0.0,\ 1.0]
king (xcx_c)[0.9, 0.2][0.9,\ 0.2]
queen (待找)[?, ?][?,\ ?]

计算

  1. 计算偏移向量:x^d=xbxa+xc=[0,1][1,0]+[0.9,0.2]=[0.1, 1.2]\hat{x}_d = x_b - x_a + x_c = [0,1] - [1,0] + [0.9,0.2] = [-0.1,\ 1.2]
  2. 归一化:x^d=0.01+1.44=1.451.204\|\hat{x}_d\| = \sqrt{0.01 + 1.44} = \sqrt{1.45} \approx 1.204,归一化后 [0.083, 0.997]\approx [-0.083,\ 0.997]
  3. 若词汇表中 queen 的向量为 [0.05,0.99][0.05, 0.99](已归一化),则点积 0.083×0.05+0.997×0.990.983\approx -0.083 \times 0.05 + 0.997 \times 0.99 \approx 0.983,得分最高

结果:queen 得分最接近查询向量,被正确检索出。

💡 为什么这样做?

词向量空间的核心假设是:语义关系 = 方向向量。“性别关系”、“国家-首都关系”、“时态关系”等都对应向量空间中特定的方向。词类比本质上是:沿着已知关系的方向,在新的起点出发,找落脚点

类比日常:你知道”北京在中国的东部”这个方向,再加上”法国”,就能猜到”巴黎在法国的中部偏北”——同样的逻辑。

⚠️ 常见误区

  1. 误区:直接用欧几里得距离找最近邻更直观 → 正确:词向量的模长不统一,高频词向量往往更长;余弦相似度对方向更敏感,与训练目标更一致
  2. 误区:分子分母的 xbxa+xc\|x_b - x_a + x_c\| 可以省略 → 正确:当比较不同查询时需要归一化;若只是对同一查询排名,分子的归一化不影响 argmax\arg\max 结果,但规范写法应保留
  3. 误区:词类比评估 = 词相似度评估 → 正确:两者测量不同维度,类比测结构关系,相似度测语义距离

窗口分类

📐 窗口分类输入构造与决策函数推导

变量定义

  • dd = 词向量维度(如 d=300d = 300
  • ww = 窗口半径(如 w=2w = 2,则窗口大小为 2w+1=52w+1 = 5
  • xtRdx_t \in \mathbb{R}^d = 位置 tt 的词向量
  • xwindowR(2w+1)dx_{window} \in \mathbb{R}^{(2w+1)d} = 窗口拼接向量
  • WRC×(2w+1)dW \in \mathbb{R}^{C \times (2w+1)d} = 分类权重矩阵(CC 为类别数)

推导过程

第 1 步:拼接(concatenate)操作。对位置 tt,取上下文窗口内所有词向量,按顺序拼接(不是求和、不是平均): xwindow=[xtwxtw+1xtxt+w]R(2w+1)dx_{window} = \begin{bmatrix} x_{t-w} \\ x_{t-w+1} \\ \vdots \\ x_t \\ \vdots \\ x_{t+w} \end{bmatrix} \in \mathbb{R}^{(2w+1)d}

数学上等价于:xwindow=[xtwT, xtw+1T, , xtT, , xt+wT]Tx_{window} = [x_{t-w}^T,\ x_{t-w+1}^T,\ \ldots,\ x_t^T,\ \ldots,\ x_{t+w}^T]^T

第 2 步:线性分类决策函数: y^=Wxwindow+bRC\hat{y} = W \cdot x_{window} + b \in \mathbb{R}^C

其中 WRC×(2w+1)dW \in \mathbb{R}^{C \times (2w+1)d},每一行对应一个类别的权重。

第 3 步:对二分类(是/否 LOCATION),输出层用 sigmoid: p(LOCx)=σ(y^)=11+ey^p(\text{LOC}|x) = \sigma(\hat{y}) = \frac{1}{1 + e^{-\hat{y}}}

形状检查WW(C)×((2w+1)d)(C) \times ((2w+1)d)xwindowx_{window}((2w+1)d)((2w+1)d),乘积是 (C)(C),加偏置 (C)(C),形状一致。

🔢 数值计算示例

设定d=3d = 3,窗口大小 =3= 3w=1w=1),判断中心词是否为 LOCATION

句子:“in Paris are”,中心词 = “Paris”

向量(d=3d=3
“in” (xt1x_{t-1})[0.2,0.1,0.5][0.2, 0.1, 0.5]
“Paris” (xtx_t)[0.8,0.9,0.3][0.8, 0.9, 0.3]
“are” (xt+1x_{t+1})[0.1,0.3,0.2][0.1, 0.3, 0.2]

计算

  1. 拼接:xwindow=[0.2,0.1,0.5, 0.8,0.9,0.3, 0.1,0.3,0.2]TR9x_{window} = [0.2, 0.1, 0.5,\ 0.8, 0.9, 0.3,\ 0.1, 0.3, 0.2]^T \in \mathbb{R}^9
  2. WR1×9W \in \mathbb{R}^{1 \times 9}(二分类)= [0.1,0.2,0.1,0.5,0.4,0.3,0.0,0.1,0.2][0.1, 0.2, -0.1, 0.5, 0.4, 0.3, 0.0, 0.1, 0.2]b=0.1b = 0.1
  3. y^=Wxwindow+b=0.02+0.020.05+0.40+0.36+0.09+0+0.03+0.04+0.1=1.01\hat{y} = W \cdot x_{window} + b = 0.02 + 0.02 - 0.05 + 0.40 + 0.36 + 0.09 + 0 + 0.03 + 0.04 + 0.1 = 1.01
  4. p=σ(1.01)0.733p = \sigma(1.01) \approx 0.733(73.3% 概率是 LOCATION)

💡 为什么这样做?

窗口分类的核心问题是:孤立地看一个词,无法判断它是不是命名实体。“Washington” 可以是人名也可以是地名,但”President Washington visited”和”Washington D.C. is”语境完全不同。

拼接上下文词向量,等于把”这个词周围的语境”打包成一个大向量,让分类器同时看到局部上下文。这是 NLP 中最基础的上下文特征提取思路。

⚠️ 常见误区

  1. 误区:窗口越大越好 → 正确:窗口是超参,太大引入噪声,太小上下文不足;NER 任务通常 w=2w=2 已足够
  2. 误区:拼接 = 求和(或平均) → 正确:拼接保留了位置信息(哪个词在哪个位置),而求和/平均会丢失顺序信息
  3. 误区:每个词的向量是 one-hot → 正确:这里的 xtx_t 已经是词嵌入(低维稠密向量),不是稀疏的 one-hot 编码