01 核心原理(大白话版)

计算机不懂"猫"和"狗"有什么关系,但如果你告诉它:把每个词变成一个坐标点,意思相近的词坐标相近——那计算机就能做"词语加减法"了。

Word2Vec 的思路:一个词的意思由它的邻居决定。同样出现在"吃___"后面的词(饭、面、肉)意思上应该相近,所以给它们相近的向量。

两种训练方式

CBOW(用上下文预测中心词)

给出"我 ___ 苹果",猜中间是"吃"。用周围的词来预测目标词,适合小数据集。

Skip-gram(用中心词预测上下文)

给出"吃",猜周围可能出现"我""苹果"。用目标词预测周围词,对低频词效果更好。

1
随机初始化向量

词表里每个词随机分配一个 100~300 维的向量(就是一串随机数字)。

2
滑窗扫描语料

在大量文本上用滑动窗口构造(中心词, 上下文词)训练对,让模型学"谁常和谁一起出现"。

3
梯度更新向量

预测对了不动,预测错了就把两个词的向量往更接近的方向推一点。反复训练后,意思相近的词自然聚在一起。

词向量是所有 NLP 的基础。LSTM、Transformer、BERT 的输入层本质都是 Embedding(词向量),Word2Vec 是理解这一切的起点。

一步步构建 Word2Vec

从语料到词向量,逐步搭建 Skip-gram。

第一步 准备语料与词表

把句子拆成词,建立词→索引的映射。

第二步 初始化词向量矩阵

输入矩阵 W(中心词)和输出矩阵 CM(上下文词),随机初始化。

第三步 Skip-gram 负采样训练步

正样本(真实上下文词)拉近,负样本(随机词)推远。

第四步 训练循环

遍历所有词和窗口,反复更新词向量直到语义关系浮现。

02 代码

03 学术性讲解

Skip-gram 目标函数

给定中心词 wₜ,最大化上下文词出现的概率:

J = (1/T) Σₜ Σ_{-c≤j≤c, j≠0} log P(wₜ₊ⱼ | wₜ)

其中 c 为窗口大小,T 为语料总词数。条件概率用 softmax 计算:

P(o|c) = exp(uₒᵀvc) / Σw exp(uᵥᵀvc)

每个词有两套向量:作为中心词时用 v,作为上下文词时用 u,最终取两者均值或只用 v。

负采样(Negative Sampling)

全词表 softmax 计算量巨大(词表可达百万级)。负采样把多分类转化为二分类:对每个正样本(真实上下文词),随机采 k 个负样本(非上下文词),只更新这 k+1 个词的向量:

J = log σ(uₒᵀvc) + Σₖ E[log σ(−uₖᵀvc)]

负样本按词频的 3/4 次方采样,低频词被适度提升采样概率。

GloVe 的对比

Word2Vec 基于局部上下文窗口(逐词预测)。GloVe 基于全局共现矩阵,直接分解词-词共现频率矩阵,目标函数为:

J = Σᵢⱼ f(Xᵢⱼ)(wᵢᵀw̃ⱼ + bᵢ + b̃ⱼ − log Xᵢⱼ)²

两者在下游任务上性能相近,Word2Vec 更适合增量更新,GloVe 在小语料上稍优。

词向量的几何性质

训练后的向量空间里存在线性关系:

v(国王) − v(男人) + v(女人) ≈ v(女王)

这说明向量空间捕捉到了语义关系的方向性(性别轴、首都轴等)。相似度常用余弦相似度衡量:cos(θ) = (v₁·v₂)/(‖v₁‖‖v₂‖)。