Word2Vec 模型原理
Word2Vec是一种通过浅层神经网络学习词向量的模型,由谷歌团队于2013年提出。它采用单隐藏层结构,将词语映射到低维连续空间,解决了传统one-hot编码的维度灾难和语义孤立问题。核心包含CBOW和Skip-gram两种架构:CBOW通过上下文预测中心词,适合高频词;Skip-gram用中心词预测上下文,擅长捕捉低频词。模型通过最大化预测概率(最小化负对数似然损失)训练,最终输出词向量矩阵。这
文章目录
引言
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 ( w t ∣ C o n t e x t ) P(w_t | Context) P(wt∣Context) 或 P ( C o n t e x t ∣ w t ) P(Context | w_t) P(Context∣wt)。(输入上下文还是中心词对应两种方法,后面会讲到)
(2)训练目标
神经网络的训练目标是最大化预测正确目标词的概率。通过反向传播算法不断调整隐藏层权重矩阵 W \bold{W} W,使预测结果尽可能接近真实标签(即语料中实际出现的目标词)。用数学表示为最小化以下损失函数:
L = − ∑ t log P ( w t a r g e t ∣ w i n p u t ) L = -\sum_{t} \log P(w_{target} | w_{input}) L=−t∑logP(wtarget∣winput)其中 t t t 代表语料里的每个训练对, w i n p u t w_{input} winput是输入层的词语(上下文或中心词), w t a r g e t w_{target} wtarget是语料中对应的目标词。
【一些答疑】
1、为什么用对数: 语料里有多个训练对,每个对的预测概率是 P 1 , P 2 , P 3 , . . . P_1, P_2, P_3, ... P1,P2,P3,...。我们希望所有概率的乘积尽可能大,但直接乘会有两个问题:一是概率本身是 0~1 之间的数,多个相乘会越来越小,容易出现「数值下溢」(电脑算不清极小值)。二是乘法计算比加法麻烦,尤其是大量样本时。而对数能把乘法转成加法( log ( P 1 × P 2 ) = log P 1 + log P 2 \log(P_1×P_2) = \log P_1+ \log P_2 log(P1×P2)=logP1+logP2),还能保持 “大小趋势一致”(比如 P 1 × P 2 P_1×P_2 P1×P2 越大, log P 1 + log P 2 \log P_1+ \log P_2 logP1+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.2 0.5 0.1 0.3 0.7 0.2 0.4 0.6 0.3 0.1 0.4 0.5 0.5 0.2 0.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.8 0.1 0.3 0.2 0.5 0.4 0.9 0.2 0.6 0.3 0.2 0.3 0.7 0.8 0.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′ 对应列的点积,得到 “得分” u u u(得分越高,模型认为该词越可能是中心词),得到每个词为中心词的得分 u u u 如下:

② Softmax 转概率:让得分 “归一化”
得分本身没有概率意义,需通过 Softmax 函数 转成[0,1]之间的概率(所有词的概率和为 1):
P ( w ∣ 小狗, 蝴蝶 ) = exp ( u w ) ∑ w ′ ∈ V exp ( u w ′ ) 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 ∈ V exp ( u w ) ≈ 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 = − log P ( 追 ∣ 小狗, 蝴蝶 ) 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.2 0.5 0.1 0.3 0.7 0.2 0.4 0.6 0.3 0.1 0.4 0.5 0.5 0.2 0.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.8 0.1 0.3 0.2 0.5 0.4 0.9 0.2 0.6 0.3 0.2 0.3 0.7 0.8 0.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′ 对应列的点积,得到 “得分” u u u(得分越高,模型认为该词越可能是上下文词),得到每个词为上下文词的得分 u u u 如下:

② Softmax 转概率:让得分 “归一化”
得分本身没有概率意义,需通过 Softmax 函数 转成[0,1]之间的概率(所有词的概率和为 1):
P ( w ∣ 追 ) = exp ( u w ) ∑ w ′ ∈ V exp ( u w ′ ) 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 ∈ V exp ( u w ) ≈ 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 ∈ V exp ( u w ) ≈ 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 = − ∑ 上下文词 log P ( 上下文词 ∣ 中心词 ) L = -\sum_{\text{上下文词}} \log P(\text{上下文词} \mid \text{中心词}) L=−上下文词∑logP(上下文词∣中心词) 以当前示例为例:
L ≈ − [ log ( 0.203 ) + log ( 0.168 ) ] ≈ − [ − 0.69 − 0.77 ] = 1.46 L \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 ( log V ) \boldsymbol{O(\log V)} O(logV),是 Word2Vec 高效训练的核心技巧。
① 为什么需要它?——普通Softmax的致命缺陷
假设词汇表有 V = 1 0 5 V=10^5 V=105 个词,词向量维度 d = 300 d=300 d=300:
- 输出权重矩阵 W ′ W' W′ 的规模是 300 × 1 0 5 = 3 × 1 0 7 300×10^5 = 3×10^7 300×105=3×107(参数多)。
- 计算Softmax时,需对 10万个词 分别计算 exp ( u w ) \exp(u_w) exp(uw) 并求和(时间长)。
当 V V V 很大时,这会导致 训练慢到无法接受。
② 核心思路:用二叉树替代全连接层
Hierarchical Softmax 的核心是 把“多分类问题”拆解成一系列“二分类问题”:
- 叶子节点:对应词汇表的所有词(共 V V V 个)。
- 内部节点:每个节点代表一次二分类(左子树 vs 右子树),并维护一个参数向量 θ \boldsymbol{\theta} θ(维度 d d d)。
③ 构建哈夫曼树:让高频词“走捷径”
为了加速,二叉树通常采用 哈夫曼树(按词的频率构建,高频词的路径更短)。以之前的词汇表 [小狗, 追, 蝴蝶, 跑, 跳] 为例,假设语料中词频:
- 追(100次)> 小狗(60次)= 蝴蝶(60次)> 跑(30次)= 跳(30次)
构建的哈夫曼树结构(简化示例,仅演示路径):
根节点(θ₀)
/ \
/ \
追(叶) 内部节点A(θ₁)
/ \
/ \
小狗(叶) 内部节点B(θ₂)
/ \
/ \
蝴蝶(叶) 内部节点C(θ₃)
/ \
跑(叶) 跳(叶)
④ 概率计算:沿着路径“走”出来
以 中心词“追”预测上下文词“小狗” 为例,步骤如下:
-
确定路径:从根节点到“小狗”的路径是 根 → 内部节点A → 小狗(假设根节点右子树到内部节点A,内部节点A左子树到小狗)。
-
每一步的二分类概率:
每个内部节点 n n n 的参数 θ n \boldsymbol{\theta}_n θn 与隐藏层向量 h \boldsymbol{h} h 做内积,通过 sigmoid函数 计算“走左子树(概率 p p p)”或“右子树(概率 1 − p 1-p 1−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 ( log V ) O(\log V) O(logV)(遍历树高) |
| 空间复杂度 | O ( d V ) O(dV) O(dV)(参数多) | O ( d ⋅ log V ) 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%的词和“追”无关)。
- 这些“无关词”的计算完全是 浪费算力。
负采样的核心:只计算“正样本(真实上下文)”和“少量负样本(随机采样的无关词)”,其他词直接忽略。
② 核心思想:把“多分类”拆成“多个二分类”
对每个训练样本(中心词 w c w_c wc + 上下文词 w o w_o wo):
- 正样本: ( w c , w o ) (w_c, w_o) (wc,wo) → 模型应预测“相关”(概率接近1)。
- 负样本:随机选 k k k 个词 w 1 , w 2 , . . . , w k w_1, w_2, ..., w_k w1,w2,...,wk → 模型应预测“不相关”(概率接近0)。
通过 sigmoid函数 处理二分类概率,损失函数只需计算这 1 + k 1+k 1+k 个样本。
③ 如何选负样本?——按词频“偏采样”
直接随机选负样本会有问题:高频词(如“的”“是”)会被频繁选中,但它们和任何词都可能共现,导致模型学不到有效特征。
Word2Vec采用 “词频的3/4次方”采样(公式化表述为 P ( w ) ∝ freq ( w ) 3 / 4 P(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)… 重新归一化后,高频词占比下降,低频词占比上升。
④ 损失函数推导:只算正+负样本
对正样本 ( w c , w o ) (w_c, w_o) (wc,wo),模型预测“相关”的概率用sigmoid表示:
P ( 正 ) = σ ( v w o T ⋅ v w c ) P(\text{正}) = \sigma(\boldsymbol{v}_{w_o}^T \cdot \boldsymbol{v}_{w_c}) P(正)=σ(vwoT⋅vwc)
( v w o \boldsymbol{v}_{w_o} vwo 是上下文词向量, v w c \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] 区间)
对每个负样本 w n w_n wn,模型预测“不相关”的概率:
P ( 负 ) = σ ( − v w n T ⋅ v w c ) P(\text{负}) = \sigma(-\boldsymbol{v}_{w_n}^T \cdot \boldsymbol{v}_{w_c}) P(负)=σ(−vwnT⋅vwc)
最终损失函数(最小化负对数似然,让正样本概率高、负样本概率低):
L = − log σ ( v w o T ⋅ v w c ) − ∑ w n ∈ 负样本 log σ ( − v w n T ⋅ v w c ) 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)
⑤ 示例:用负采样重新计算“追→小狗”的损失
假设:
- 正样本: ( w c = 追 , w o = 小狗 ) (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.307 L = -(-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), k k k通常取5~20) | O ( log V ) O(\log V) O(logV)(树高决定) |
| 参数规模 | 无额外参数(复用词向量) | 需维护二叉树节点参数 |
| 语义适应性 | 不依赖词频,动态词表更友好 | 依赖哈夫曼树(词频驱动) |
| 适用场景 | 大规模语料(如社交文本) | 静态大词表(如百科数据) |
关键结论:
负采样的“暴力简化”让Word2Vec能在 百万级词汇表 上高效训练,成为工业界首选。它的核心是 “用抽样代替全量计算”,牺牲一点理论严谨性,换来训练速度的飞跃。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)