Word2Vec 模型原理
文章目录
- 引言
- 1. 神经网络模型
- (1)网络结构
- (2)训练目标
- (3)与词向量的关系
- 2. Word2Vec 架构
- 2.1 CBOW 模型:用上下文预测中心词
- (1)网络结构
- (2)模型实例
- ▶ 步骤 1:构建词汇表与 one-hot 编码
- ▶ 步骤 2:输入权重矩阵 → 提取词向量
- ▶ 步骤 3:聚合上下文语义(求和)
- ▶ 步骤 4:输出层 → 预测中心词概率
- ▶ 步骤 5:训练优化:让预测更准确
- 2.2 Skip-gram 模型:用中心词预测上下文
- (1)网络结构
- (2)模型实例
- ▶ 步骤1:中心词的one-hot编码
- ▶ 步骤2:提取中心词的词向量
- ▶ 步骤3:预测多个上下文词(“一对多”的核心)
- ▶ 步骤4:训练逻辑:让所有上下文词都“猜中”
- 2.3 Skip-gram vs CBOW
- 2.4 优化策略——Hierarchical Softmax:给输出层“瘦身”
- 2.5 优化策略——Negative Sampling:用“抽样”替代“全算”
引言
Word2Vec 是一种将词语映射到低维实数向量空间的词向量生成模型,由谷歌团队的 Mikolov 等人于 2013 年提出。它的核心价值在于解决了传统 one-hot 编码维度灾难和语义孤立的问题,通过分布式表示让词向量具备语义关联性,极大推动了自然语言处理(NLP)领域的发展。如今,Word2Vec 在文本分类、情感分析、机器翻译等众多任务中都有着广泛应用,掌握其原理与实践方法对理解现代 NLP 技术至关重要。本文将从原理介绍、代码实现以及应用等方面全面解析 Word2Vec。
1. 神经网络模型
Word2Vec 的核心是浅层神经网络模型,其设计初衷是通过训练过程学习词语的分布式表示。该网络由输入层、隐藏层和输出层构成,结构简洁却能高效捕捉词语间的语义关联。
(1)网络结构
- 输入层:接收词语的离散表示(通常是 one-hot 编码)。对于包含
V
个词的词汇表,每个词语的 one-hot 向量维度为V×1
。 - 隐藏层:无激活函数的线性层,其权重矩阵 W\bold{W}W(维度为
V×d
,d
为词向量维度)是训练的核心目标。当输入词的 one-hot 向量与 W\bold{W}W 相乘时,等价于从矩阵中 “提取” 对应行的向量 —— 这就是我们最终需要的词向量。 - 输出层:通常采用 softmax 函数(或其近似方法),输出对目标词的概率分布。对于输入的上下文(或中心词),输出层会给出词汇表中每个词作为目标词的概率,即 P(wt∣Context)P(w_t | Context)P(wt∣Context) 或 P(Context∣wt)P(Context | w_t)P(Context∣wt)。(输入上下文还是中心词对应两种方法,后面会讲到)
(2)训练目标
神经网络的训练目标是最大化预测正确目标词的概率。通过反向传播算法不断调整隐藏层权重矩阵 W\bold{W}W,使预测结果尽可能接近真实标签(即语料中实际出现的目标词)。用数学表示为最小化以下损失函数:
L=−∑tlogP(wtarget∣winput)L = -\sum_{t} \log P(w_{target} | w_{input}) L=−t∑logP(wtarget∣winput)其中 ttt 代表语料里的每个训练对, winputw_{input}winput是输入层的词语(上下文或中心词),wtargetw_{target}wtarget是语料中对应的目标词。
【一些答疑】
1、为什么用对数: 语料里有多个训练对,每个对的预测概率是 P1,P2,P3,...P_1, P_2, P_3, ...P1,P2,P3,...。我们希望所有概率的乘积尽可能大,但直接乘会有两个问题:一是概率本身是 0~1 之间的数,多个相乘会越来越小,容易出现「数值下溢」(电脑算不清极小值)。二是乘法计算比加法麻烦,尤其是大量样本时。而对数能把乘法转成加法(log(P1×P2)=logP1+logP2\log(P_1×P_2) = \log P_1+ \log P_2log(P1×P2)=logP1+logP2),还能保持 “大小趋势一致”(比如 P1×P2P_1×P_2P1×P2 越大,logP1+logP2\log P_1+ \log P_2logP1+logP2 也越大)。所以可以把 “最大化概率乘积”,转成 “最大化对数的和”。
2、为什么用负号: 在机器学习里,我们习惯最小化损失函数(损失越小,模型越好)。但刚才的对数和是 “越大越好”(对应概率乘积越大),所以加个负号,把 “最大化概率” 转成 “最小化损失”(损失越小,对数和越大,概率乘积也越大)。
(3)与词向量的关系
训练完成后,隐藏层权重矩阵 W\bold{W}W 的每一行即为对应词语的词向量。这一过程的本质是:网络通过学习 “词语在何种语境中出现” 的规律,将离散的词语映射到 d
维连续空间,使语义相近的词在空间中距离更近。
与深层神经网络不同,Word2Vec 采用单隐藏层设计,这是为了在保证语义捕捉能力的同时,大幅提升训练效率 —— 毕竟其核心目标是学习词向量,而非复杂的特征提取。
2. Word2Vec 架构
2.1 CBOW 模型:用上下文预测中心词
CBOW(Continuous Bag-of-Words)模型通过上下文词语来预测中心词。
(1)网络结构
- 输入层:接收多个上下文词的 one-hot 向量(比如中心词左右各取 n 个词,共 2n 个输入,我们把 n 叫作窗口大小)。
- 隐藏层:将多个上下文词的词向量求和(或平均),压缩成一个统一的语义表示。
- 输出层:通过 Softmax 函数,计算每个词作为中心词的概率,输出最可能的预测结果。
(2)模型实例
假设语料库只有一个句子: “小狗 追 蝴蝶”,设定 窗口大小为 1(中心词 “追” 的左右各取 1 个词,即上下文词是 “小狗” 和 “蝴蝶”)。接下来模拟 CBOW 的完整流程:
▶ 步骤 1:构建词汇表与 one-hot 编码
首先,从语料中提取所有唯一词,构建 词汇表(下面演示仅包含示例词):
V=[小狗,追,蝴蝶,跑,跳]V = [\text{小狗}, \text{追}, \text{蝴蝶}, \text{跑}, \text{跳}]V=[小狗,追,蝴蝶,跑,跳]共 5 个词,对应索引 0~4
。
每个词用 one-hot 向量 表示(只有自身索引位置为 1,其余为 0),例如:
- 小狗 →
[1, 0, 0, 0, 0]
(索引 0) - 蝴蝶 →
[0, 0, 1, 0, 0]
(索引 2)
▶ 步骤 2:输入权重矩阵 → 提取词向量
CBOW 的 输入权重矩阵 W\bold{W}W 是 V×d
维度(V=5
,假设词向量维度 d=3
,方便计算)。它的每一行对应一个词的初始词向量(训练前随机初始化,训练后会学到语义)。
假设初始 W\bold{W}W 如下(数值随机设定,仅作演示):
W=[0.20.50.10.30.70.20.40.60.30.10.40.50.50.20.4]\bold{W} = \begin{bmatrix} 0.2 & 0.5 & 0.1 \\ % 小狗(索引0)的词向量 0.3 & 0.7 & 0.2 \\ % 追(索引1)的词向量 0.4 & 0.6 & 0.3 \\ % 蝴蝶(索引2)的词向量 0.1 & 0.4 & 0.5 \\ % 跑(索引3)的词向量 0.5 & 0.2 & 0.4 \\ % 跳(索引4)的词向量 \end{bmatrix} W=0.20.30.40.10.50.50.70.60.40.20.10.20.30.50.4然后通过上下文词 “小狗” 和 “蝴蝶” 的 one-hot 向量从 W\bold{W}W 中提取词向量:
-
小狗的词向量:W\bold{W}W 的第 0 行 →
[0.2, 0.5, 0.1]
-
蝴蝶的词向量:W\bold{W}W 的第 2 行 →
[0.4, 0.6, 0.3]
▶ 步骤 3:聚合上下文语义(求和)
CBOW 会将 所有上下文词的词向量相加,合并成一个统一的语义表示(也可以求平均,效果类似):
h=小狗的词向量+蝴蝶的词向量=[0.6,1.1,0.4]\boldsymbol{h} = \text{小狗的词向量} + \text{蝴蝶的词向量} = [0.6,\ 1.1,\ 0.4] h=小狗的词向量+蝴蝶的词向量=[0.6, 1.1, 0.4]这一步的意义是 “把多个上下文词的语义‘捏合’成一个整体”,让模型学习 “小狗” 和 “蝴蝶” 共同的上下文特征。
▶ 步骤 4:输出层 → 预测中心词概率
CBOW 的 输出权重矩阵 W′\bold{W'}W′ 是 d×V
维度(d=3
,V=5
),每一列对应一个词的 输出权重(辅助计算预测概率)。
假设初始 W′\bold{W'}W′ 如下(列对应词汇表索引 0~4):
W′=[0.80.10.30.20.50.40.90.20.60.30.20.30.70.80.1]\bold{W'} = \begin{bmatrix} 0.8 & 0.1 & 0.3 & 0.2 & 0.5 \\ % 列0(小狗) 0.4 & 0.9 & 0.2 & 0.6 & 0.3 \\ % 列1(追) 0.2 & 0.3 & 0.7 & 0.8 & 0.1 \\ % 列2(蝴蝶) \end{bmatrix} W′=0.80.40.20.10.90.30.30.20.70.20.60.80.50.30.1① 计算 V 个词的预测 “得分”:
对于每个词(包括中心词 “追”),计算 语义表示 h\boldsymbol{h}h 与 W′\bold{W'}W′ 对应列的点积,得到 “得分” uuu(得分越高,模型认为该词越可能是中心词),得到每个词为中心词的得分 uuu 如下:
② Softmax 转概率:让得分 “归一化”
得分本身没有概率意义,需通过 Softmax 函数 转成[0,1]
之间的概率(所有词的概率和为 1):
P(w∣小狗, 蝴蝶)=exp(uw)∑w′∈Vexp(uw′)P(w \mid \text{小狗, 蝴蝶}) = \frac{\exp(u_w)}{\sum_{w' \in V} \exp(u_{w'})} P(w∣小狗, 蝴蝶)=∑w′∈Vexp(uw′)exp(uw)计算“追”为中心词概率为:
P(追∣小狗,蝴蝶)≈exp(1.17)∑w∈Vexp(uw)≈25.05%P(\text{追} \mid \text{小狗,蝴蝶}) \approx \frac{\exp(1.17)}{\sum_{w \in V} \exp(u_w)} \approx 25.05\% P(追∣小狗,蝴蝶)≈∑w∈Vexp(uw)exp(1.17)≈25.05%
▶ 步骤 5:训练优化:让预测更准确
此时模型预测 “追” 的概率只有 25.05%,显然不够理想。训练的核心是最小化损失函数(回顾公式):
L=−logP(追∣小狗, 蝴蝶)L = -\log P(\text{追} \mid \text{小狗, 蝴蝶}) L=−logP(追∣小狗, 蝴蝶)通过反向传播,模型会调整 W\bold{W}W(输入权重,最终生成词向量)和 W′\bold{W'}W′(输出权重,用于计算中心词概率)的数值,让下次预测时,“追” 的概率更高,损失 L
更小。
2.2 Skip-gram 模型:用中心词预测上下文
Skip-gram 与 CBOW 的逻辑完全相反:它以单个中心词为输入,预测周围所有上下文词(“一对多”模式)。这种设计让模型更擅长捕捉低频词的语义(哪怕词出现次数少,只要有上下文,就能生成训练样本)。
(1)网络结构
- 输入层:接收单个中心词的 one-hot 向量(维度为词汇表大小
V
)。 - 隐藏层:无激活函数,直接将 one-hot 向量映射为词向量(维度
d
)。 - 输出层:通过 Softmax 函数,输出每个词作为上下文词的概率(维度
V
)。
(2)模型实例
假设语料库只有一个句子: “小狗 追 蝴蝶”,以 “追” 预测 “小狗” 和 “蝴蝶” 为例,接下来模拟 Skip-gram 的完整流程:
▶ 步骤1:中心词的one-hot编码
延续CBOW的词汇表设定:
V=[小狗,追,蝴蝶,跑,跳]V = [\text{小狗}, \text{追}, \text{蝴蝶}, \text{跑}, \text{跳}] \quad V=[小狗,追,蝴蝶,跑,跳] 中心词“追”的 one-ho t向量为:[0,1,0,0,0][0,\ 1,\ 0,\ 0,\ 0][0, 1, 0, 0, 0]
▶ 步骤2:提取中心词的词向量
输入权重矩阵 W\bold{W}W 与 CBOW 共享结构(维度 V×d
,d=3
,延续之前的示例参数)。
W=[0.20.50.10.30.70.20.40.60.30.10.40.50.50.20.4]\bold{W} = \begin{bmatrix} 0.2 & 0.5 & 0.1 \\ % 小狗(索引0)的词向量 0.3 & 0.7 & 0.2 \\ % 追(索引1)的词向量 0.4 & 0.6 & 0.3 \\ % 蝴蝶(索引2)的词向量 0.1 & 0.4 & 0.5 \\ % 跑(索引3)的词向量 0.5 & 0.2 & 0.4 \\ % 跳(索引4)的词向量 \end{bmatrix} W=0.20.30.40.10.50.50.70.60.40.20.10.20.30.50.4中心词“追”的词向量是 W\bold{W}W 的 第1行:
h=W[1,:]=[0.3,0.7,0.2]\boldsymbol{h} = W[1, :] = [0.3,\ 0.7,\ 0.2] h=W[1,:]=[0.3, 0.7, 0.2]
▶ 步骤3:预测多个上下文词(“一对多”的核心)
Skip-gram 的输出层,需要为每个上下文词单独计算概率(因为中心词“追”要同时预测“小狗”和“蝴蝶”两个词)。输出权重矩阵 W′\bold{W'}W′ 仍为 d×V
(列对应词汇表索引)。
W′=[0.80.10.30.20.50.40.90.20.60.30.20.30.70.80.1]\bold{W'} = \begin{bmatrix} 0.8 & 0.1 & 0.3 & 0.2 & 0.5 \\ % 列0(小狗) 0.4 & 0.9 & 0.2 & 0.6 & 0.3 \\ % 列1(追) 0.2 & 0.3 & 0.7 & 0.8 & 0.1 \\ % 列2(蝴蝶) \end{bmatrix} W′=0.80.40.20.10.90.30.30.20.70.20.60.80.50.30.1 ① 计算 V 个词的预测 “得分”:
对于每个词(包括上下文词“小狗”和“蝴蝶”),计算语义表示 h\boldsymbol{h}h 与 W′\bold{W'}W′ 对应列的点积,得到 “得分” uuu(得分越高,模型认为该词越可能是上下文词),得到每个词为上下文词的得分 uuu 如下:
② Softmax 转概率:让得分 “归一化”
得分本身没有概率意义,需通过 Softmax 函数 转成[0,1]
之间的概率(所有词的概率和为 1):
P(w∣追)=exp(uw)∑w′∈Vexp(uw′)P(w \mid \text{追}) = \frac{\exp(u_w)}{\sum_{w' \in V} \exp(u_{w'})} P(w∣追)=∑w′∈Vexp(uw′)exp(uw)计算“小狗”和“”蝴蝶为上下文词概率为:
P(小狗∣追)=exp(0.56)∑w∈Vexp(uw)≈20.3%P(\text{小狗} \mid \text{追}) = \frac{\exp(0.56)}{\sum_{w \in V} \exp(u_w)} \approx 20.3\% P(小狗∣追)=∑w∈Vexp(uw)exp(0.56)≈20.3%P(蝴蝶∣追)≈exp(0.37)∑w∈Vexp(uw)≈16.8%P(\text{蝴蝶} \mid \text{追}) \approx \frac{\exp(0.37)}{\sum_{w \in V} \exp(u_w)} \approx 16.8\% P(蝴蝶∣追)≈∑w∈Vexp(uw)exp(0.37)≈16.8%
▶ 步骤4:训练逻辑:让所有上下文词都“猜中”
Skip-gram的损失函数,是 所有上下文词的对数概率之和的负数(因为一个中心词对应多个目标词):
L=−∑上下文词logP(上下文词∣中心词)L = -\sum_{\text{上下文词}} \log P(\text{上下文词} \mid \text{中心词}) L=−上下文词∑logP(上下文词∣中心词) 以当前示例为例:
L≈−[log(0.203)+log(0.168)]≈−[−0.69−0.77]=1.46L \approx -\left[ \log(0.203) + \log(0.168) \right] \approx -\left[ -0.69 - 0. 77\right] = 1.46 L≈−[log(0.203)+log(0.168)]≈−[−0.69−0.77]=1.46 训练时,反向传播会调整 W′\bold{W'}W′(中心词的词向量)和 W\bold{W}W(输出权重),让 所有上下文词的预测概率都提升,最终降低损失L
。
2.3 Skip-gram vs CBOW
维度 | Skip-gram | CBOW |
---|---|---|
输入输出 | 1个中心词 → N个上下文词 | N个上下文词 → 1个中心词 |
数据利用 | 低频词友好(1次出现→N个样本) | 高频词友好(N个词→1个样本) |
计算成本 | 高(每个中心词对应多个目标) | 低(多个词合并为一个目标) |
语义捕捉 | 更细粒度(擅长低频词关联) | 更偏向整体语境(依赖高频共现) |
Skip-gram的“一对多”模式,让 低频词也能通过少量出现次数,生成足够多的训练样本(比如“量子”很少见,但只要出现一次,其上下文“物理”“力学”都会成为预测目标)。因此:
- ✅ 适合场景:专业领域语料(如论文)、生僻词多的文本(如诗歌)。
- ❌ 不适合场景:高频词主导的大规模语料(如新闻),CBOW效率更高。
但Skip-gram的计算量天生更高(每个中心词要预测多个上下文词),需依赖 Hierarchical Softmax 或 Negative Sampling 等优化技巧(后续章节会详细解析)。
2.4 优化策略——Hierarchical Softmax:给输出层“瘦身”
Hierarchical Softmax 是一种用于解决词表过大导致计算量庞大的方法。普通 Softmax 计算概率时,需遍历整个词汇表(复杂度 O(V)\boldsymbol{O(V)}O(V)),当词汇表达10万级时,计算量会爆炸。Hierarchical Softmax(分层Softmax) 用 二叉树 替代全连接层,将复杂度降至 O(logV)\boldsymbol{O(\log V)}O(logV),是 Word2Vec 高效训练的核心技巧。
① 为什么需要它?——普通Softmax的致命缺陷
假设词汇表有 V=105V=10^5V=105 个词,词向量维度 d=300d=300d=300:
- 输出权重矩阵 W′W'W′ 的规模是 300×105=3×107300×10^5 = 3×10^7300×105=3×107(参数多)。
- 计算Softmax时,需对 10万个词 分别计算 exp(uw)\exp(u_w)exp(uw) 并求和(时间长)。
当 VVV 很大时,这会导致 训练慢到无法接受。
② 核心思路:用二叉树替代全连接层
Hierarchical Softmax 的核心是 把“多分类问题”拆解成一系列“二分类问题”:
- 叶子节点:对应词汇表的所有词(共 VVV 个)。
- 内部节点:每个节点代表一次二分类(左子树 vs 右子树),并维护一个参数向量 θ\boldsymbol{\theta}θ(维度 ddd)。
③ 构建哈夫曼树:让高频词“走捷径”
为了加速,二叉树通常采用 哈夫曼树(按词的频率构建,高频词的路径更短)。以之前的词汇表 [小狗, 追, 蝴蝶, 跑, 跳]
为例,假设语料中词频:
- 追(100次)> 小狗(60次)= 蝴蝶(60次)> 跑(30次)= 跳(30次)
构建的哈夫曼树结构(简化示例,仅演示路径):
根节点(θ₀)/ \/ \追(叶) 内部节点A(θ₁)/ \/ \小狗(叶) 内部节点B(θ₂)/ \/ \蝴蝶(叶) 内部节点C(θ₃)/ \跑(叶) 跳(叶)
④ 概率计算:沿着路径“走”出来
以 中心词“追”预测上下文词“小狗” 为例,步骤如下:
-
确定路径:从根节点到“小狗”的路径是 根 → 内部节点A → 小狗(假设根节点右子树到内部节点A,内部节点A左子树到小狗)。
-
每一步的二分类概率:
每个内部节点 nnn 的参数 θn\boldsymbol{\theta}_nθn 与隐藏层向量 h\boldsymbol{h}h 做内积,通过 sigmoid函数 计算“走左子树(概率 ppp)”或“右子树(概率 1−p1-p1−p)”:
p(n,左)=σ(h⊤⋅θn),p(n,右)=1−σ(h⊤⋅θn)p(n, \text{左}) = \sigma(\boldsymbol{h}^\top \cdot \boldsymbol{\theta}_n),\quad p(n, \text{右}) = 1 - \sigma(\boldsymbol{h}^\top \cdot \boldsymbol{\theta}_n) p(n,左)=σ(h⊤⋅θn),p(n,右)=1−σ(h⊤⋅θn)
σ(x)=1/(1+e−x)\sigma(x) = 1/(1+e^{-x})σ(x)=1/(1+e−x),将结果压缩到 (0,1)(0,1)(0,1)
- 路径概率相乘:
“小狗”的最终概率是 路径上所有二分类概率的乘积:
P(小狗∣追)=p(根,右)×p(内部节点A,左)P(\text{小狗} \mid \text{追}) = p(\text{根}, \text{右}) \times p(\text{内部节点A}, \text{左}) P(小狗∣追)=p(根,右)×p(内部节点A,左)
⑤ 对比:普通Softmax vs Hierarchical Softmax
维度 | 普通Softmax | Hierarchical Softmax |
---|---|---|
时间复杂度 | O(V)O(V)O(V)(遍历全表) | O(logV)O(\log V)O(logV)(遍历树高) |
空间复杂度 | O(dV)O(dV)O(dV)(参数多) | O(d⋅logV)O(d \cdot \log V)O(d⋅logV)(参数少) |
适用场景 | 小词汇表(V<1万V<1万V<1万) | 大词汇表(V>10万V>10万V>10万) |
关键局限:
Hierarchical Softmax依赖 词频统计 构建哈夫曼树,若语料中 低频词实际语义重要(如专业术语),可能因路径长导致训练不足。此时,Negative Sampling(负采样) 更灵活(在下一小节介绍)。
2.5 优化策略——Negative Sampling:用“抽样”替代“全算”
负采样(Negative Sampling) 是另一种提高训练效率的方法。它不再计算所有词的概率,而是每次从词表中随机采样少量负例(与当前上下文无关的词),通过最大化正例(中心词与上下文词的共现)的概率和最小化负例的概率来训练模型。
① 为什么需要它?——Softmax的“无效计算”
假设中心词是“追”,真实上下文是“小狗”和“蝴蝶”:
- 普通Softmax要计算 所有5万个词 的概率(哪怕99%的词和“追”无关)。
- 这些“无关词”的计算完全是 浪费算力。
负采样的核心:只计算“正样本(真实上下文)”和“少量负样本(随机采样的无关词)”,其他词直接忽略。
② 核心思想:把“多分类”拆成“多个二分类”
对每个训练样本(中心词 wcw_cwc + 上下文词 wow_owo):
- 正样本:(wc,wo)(w_c, w_o)(wc,wo) → 模型应预测“相关”(概率接近1)。
- 负样本:随机选 kkk 个词 w1,w2,...,wkw_1, w_2, ..., w_kw1,w2,...,wk → 模型应预测“不相关”(概率接近0)。
通过 sigmoid函数 处理二分类概率,损失函数只需计算这 1+k1+k1+k 个样本。
③ 如何选负样本?——按词频“偏采样”
直接随机选负样本会有问题:高频词(如“的”“是”)会被频繁选中,但它们和任何词都可能共现,导致模型学不到有效特征。
Word2Vec采用 “词频的3/4次方”采样(公式化表述为 P(w)∝freq(w)3/4P(w) \propto \text{freq}(w)^{3/4}P(w)∝freq(w)3/4):
- 高频词的采样概率被 适度降低(避免过度采样)。
- 低频词的采样概率被 适度提高(避免永远选不到)。
举个例子(词汇表词频:追(100)、小狗(60)、蝴蝶(60)、跑(30)、跳(30)):
- 原始概率:追(100/280)≈35.7%,小狗(60/280)≈21.4%…
- 3/4次方后:追(1000.75≈31.6)、小狗(600.75≈22.7)… 重新归一化后,高频词占比下降,低频词占比上升。
④ 损失函数推导:只算正+负样本
对正样本 (wc,wo)(w_c, w_o)(wc,wo),模型预测“相关”的概率用sigmoid表示:
P(正)=σ(vwoT⋅vwc)P(\text{正}) = \sigma(\boldsymbol{v}_{w_o}^T \cdot \boldsymbol{v}_{w_c}) P(正)=σ(vwoT⋅vwc)
(vwo\boldsymbol{v}_{w_o}vwo 是上下文词向量,vwc\boldsymbol{v}_{w_c}vwc 是中心词向量;σ(x)=1/(1+e−x)\sigma(x)=1/(1+e^{-x})σ(x)=1/(1+e−x),将结果压缩到 [0,1][0,1][0,1] 区间)
对每个负样本 wnw_nwn,模型预测“不相关”的概率:
P(负)=σ(−vwnT⋅vwc)P(\text{负}) = \sigma(-\boldsymbol{v}_{w_n}^T \cdot \boldsymbol{v}_{w_c}) P(负)=σ(−vwnT⋅vwc)
最终损失函数(最小化负对数似然,让正样本概率高、负样本概率低):
L=−logσ(vwoT⋅vwc)−∑wn∈负样本logσ(−vwnT⋅vwc)L = -\log\sigma(\boldsymbol{v}_{w_o}^T \cdot \boldsymbol{v}_{w_c}) - \sum_{w_n \in \text{负样本}} \log\sigma(-\boldsymbol{v}_{w_n}^T \cdot \boldsymbol{v}_{w_c}) L=−logσ(vwoT⋅vwc)−wn∈负样本∑logσ(−vwnT⋅vwc)
⑤ 示例:用负采样重新计算“追→小狗”的损失
假设:
- 正样本:(wc=追,wo=小狗)(w_c=\text{追}, w_o=\text{小狗})(wc=追,wo=小狗)
- 负样本:随机选2个词(跑、跳,按词频3/4次方采样)
- 中心词向量 v追=[0.3,0.7,0.2]\boldsymbol{v}_{\text{追}} = [0.3, 0.7, 0.2]v追=[0.3,0.7,0.2]
- 上下文词向量:
- v小狗=[0.2,0.5,0.1]\boldsymbol{v}_{\text{小狗}} = [0.2, 0.5, 0.1]v小狗=[0.2,0.5,0.1](正样本)
- v跑=[0.1,0.4,0.5]\boldsymbol{v}_{\text{跑}} = [0.1, 0.4, 0.5]v跑=[0.1,0.4,0.5](负样本1)
- v跳=[0.5,0.2,0.4]\boldsymbol{v}_{\text{跳}} = [0.5, 0.2, 0.4]v跳=[0.5,0.2,0.4](负样本2)
正样本概率计算:
v小狗T⋅v追=0.2×0.3+0.5×0.7+0.1×0.2=0.06+0.35+0.02=0.43\boldsymbol{v}_{\text{小狗}}^T \cdot \boldsymbol{v}_{\text{追}} = 0.2×0.3 + 0.5×0.7 + 0.1×0.2 = 0.06 + 0.35 + 0.02 = 0.43 v小狗T⋅v追=0.2×0.3+0.5×0.7+0.1×0.2=0.06+0.35+0.02=0.43
σ(0.43)≈0.606⇒log(0.606)≈−0.498\sigma(0.43) ≈ 0.606 \quad \Rightarrow \quad \log(0.606) ≈ -0.498 σ(0.43)≈0.606⇒log(0.606)≈−0.498
负样本概率计算:
-
跑(负样本1):
v跑T⋅v追=0.1×0.3+0.4×0.7+0.5×0.2=0.03+0.28+0.1=0.41\boldsymbol{v}_{\text{跑}}^T \cdot \boldsymbol{v}_{\text{追}} = 0.1×0.3 + 0.4×0.7 + 0.5×0.2 = 0.03 + 0.28 + 0.1 = 0.41 v跑T⋅v追=0.1×0.3+0.4×0.7+0.5×0.2=0.03+0.28+0.1=0.41
σ(−0.41)≈0.399⇒log(0.399)≈−0.917\sigma(-0.41) ≈ 0.399 \quad \Rightarrow \quad \log(0.399) ≈ -0.917 σ(−0.41)≈0.399⇒log(0.399)≈−0.917 -
跳(负样本2):
v跳T⋅v追=0.5×0.3+0.2×0.7+0.4×0.2=0.15+0.14+0.08=0.37\boldsymbol{v}_{\text{跳}}^T \cdot \boldsymbol{v}_{\text{追}} = 0.5×0.3 + 0.2×0.7 + 0.4×0.2 = 0.15 + 0.14 + 0.08 = 0.37 v跳T⋅v追=0.5×0.3+0.2×0.7+0.4×0.2=0.15+0.14+0.08=0.37
σ(−0.37)≈0.410⇒log(0.410)≈−0.892\sigma(-0.37) ≈ 0.410 \quad \Rightarrow \quad \log(0.410) ≈ -0.892 σ(−0.37)≈0.410⇒log(0.410)≈−0.892
总损失:
L=−(−0.498)−[(−0.917)+(−0.892)]=0.498+1.809=2.307L = -(-0.498) - [(-0.917) + (-0.892)] = 0.498 + 1.809 = 2.307 L=−(−0.498)−[(−0.917)+(−0.892)]=0.498+1.809=2.307
⑥ Negative Sampling vs Hierarchical Softmax
维度 | Negative Sampling | Hierarchical Softmax |
---|---|---|
计算效率 | 更高(O(1+k)O(1+k)O(1+k),kkk通常取5~20) | O(logV)O(\log V)O(logV)(树高决定) |
参数规模 | 无额外参数(复用词向量) | 需维护二叉树节点参数 |
语义适应性 | 不依赖词频,动态词表更友好 | 依赖哈夫曼树(词频驱动) |
适用场景 | 大规模语料(如社交文本) | 静态大词表(如百科数据) |
关键结论:
负采样的“暴力简化”让Word2Vec能在 百万级词汇表 上高效训练,成为工业界首选。它的核心是 “用抽样代替全量计算”,牺牲一点理论严谨性,换来训练速度的飞跃。