词义表示的进化:从规则到分布式语义

WordNet 近义词表示

早期的NLP系统依赖人工构建的规则和词典,如 WordNet。这类工具通过同义词集合上下位关系 (Hyponymy) 描述词义,例如将“proficient”标记为“good”的同义词。然而,这种方法存在明显局限:

  1. 静态性:无法捕捉新兴含义(如“wicked”在俚语中的“酷”意);一些单词仅在特定情况下意义相近
  2. 主观性:词语意义需要人工界定
  3. 实时性:依赖人工标注,更新缓慢;
  4. 缺乏相似性计算 :无法量化“hotel”和“motel”的语义相似度。

Localist: One-Hot 编码与词袋模型

2013 年前,NLP 普遍采用 One-Hot 编码 表示词汇,即用高维稀疏向量(如长度为 1010 万的向量中仅一个位置为 11)表示单词。这种“局部表示”导致:

  • 维度灾难1010 万词汇需 1010 万维空间;
  • 零相似性 :正交向量无法反映词义关联(如“hotel”与“motel”)。

Distributed Semantics 与 Word2Vec

Word2Vec 是一种通过无监督学习生成词向量的工具,其核心思想是基于词的上下文共现规律,将词映射到低维稠密向量空间中,使得语义相似的词在向量空间中距离较近。主要有两种模型:一种是根据上下文推理中心词的 CBOW 模型,另一种是根据中心词推理上下文的 Skip-Gram 模型。

这里的 Word Vector 也被称为 Word Embedding 或者 Word Representations

Skip Gram

给定上下文长度为 mm,对于样本数据中心词为 wtw_t,其上下文为 wtm,,wt+mw_{t-m},\dots,w_{t+m},Skip Gram 训练的目标就是最大化上下文词的条件概率

j=mmP(wt+jwt) \prod_{j=-m}^m P(w_{t+j}|w_t)

对于全部语料库,那么就要最大化每一个这样的中心词和上下文的条件概率,把他们乘起来(假设 Skip Gram 的参数为 θ\theta

这里的 θ\theta 其实是一个矩阵。假设我们把词汇编码为 dd 维稠密向量,词汇表大小为 VV,则 θ\theta 的大小应该为 R2dV\mathbb R^{2dV},我们这里直接把 θ\theta 当作词汇表来看。

其本质是一个将词汇映射到 embedding 空间的函数 f:{0,1}VRdf:\mathbb \{0,1\}^V\mapsto R^{d}。要取出 viv_i 向量,可以通过矩阵乘法,设置每一行为 11、其余全部置 00 来取出这一行的词向量,相当于 θ\theta 乘上了一个常数。

vw=θTCv(w)v_w=\theta^TC_v(w)uw=θTCu(w)u_w=\theta^TC_u(w),这里的 Cv,CuC_v,C_u 可以是 ww 的 One-Hot Vector.

θ=arg maxθt=1Tmjmj0Pθ(wt+jwt) \theta=\argmax_\theta \prod_{t=1}^T \prod_{-m \le j\le m}^{j\ne 0} P_\theta(w_{t+j}|w_t)

这也等同于最小化其负对数

θ=arg minθJ(θ)=arg minθ1Tt=1Tmjmj0logPθ(wt+jwt) \theta=\argmin_\theta J(\theta)=\argmin_\theta -\frac{1}{T}\sum_{t=1}^T \sum_{-m \le j\le m}^{j\ne 0} \log P_\theta(w_{t+j}|w_t)

这里概率的计算就是老套路 softmax 了,我们把整个词汇库的 context vector 和当前词的中心词向量点乘起来,做 softmax(这里用 oo 表示上下文词,uwu_w 表示单词 ww 作为上下文时的向量,vwv_w 表示 ww 作为中心词时的向量)

P(oc)=exp(uoTvc)wVexp(uwTvc) P(o|c)=\frac{\exp(u_{o}^T v_c)}{\sum_{w\in \mathbb V} \exp(u_w^T v_c)}

于是损失函数 J(θ)J(\theta) 变成了

J(θ)=1Tt=1Tmjmj0(uoTvclogwVexp(uwTvc)) J(\theta)=-\frac{1}{T}\sum_{t=1}^{T} \sum_{-m \le j\le m}^{j\ne 0} \Big(u_o^Tv_c-\log\sum_{w\in\mathbb V}\exp(u_w^Tv_c)\Big)