引言

Word2Vec 是一种将词语映射到低维实数向量空间的词向量生成模型,由谷歌团队的 Mikolov 等人于 2013 年提出。它的核心价值在于解决了传统 one-hot 编码维度灾难和语义孤立的问题,通过分布式表示让词向量具备语义关联性,极大推动了自然语言处理(NLP)领域的发展。如今,Word2Vec 在文本分类、情感分析、机器翻译等众多任务中都有着广泛应用,掌握其原理与实践方法对理解现代 NLP 技术至关重要。本文将从原理介绍、代码实现以及应用等方面全面解析 Word2Vec。

1. 神经网络模型

Word2Vec 的核心是浅层神经网络模型,其设计初衷是通过训练过程学习词语的分布式表示。该网络由输入层、隐藏层和输出层构成,结构简洁却能高效捕捉词语间的语义关联。

(1)网络结构

  • 输入层:接收词语的离散表示(通常是 one-hot 编码)。对于包含 V 个词的词汇表,每个词语的 one-hot 向量维度为 V×1
  • 隐藏层:无激活函数的线性层,其权重矩阵 W \bold{W} W(维度为 V×dd 为词向量维度)是训练的核心目标。当输入词的 one-hot 向量与 W \bold{W} W 相乘时,等价于从矩阵中 “提取” 对应行的向量 —— 这就是我们最终需要的词向量。
  • 输出层:通常采用 softmax 函数(或其近似方法),输出对目标词的概率分布。对于输入的上下文(或中心词),输出层会给出词汇表中每个词作为目标词的概率,即 P ( w t ∣ C o n t e x t ) P(w_t | Context) P(wtContext) P ( C o n t e x t ∣ w t ) P(Context | w_t) P(Contextwt)(输入上下文还是中心词对应两种方法,后面会讲到)

(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=tlogP(wtargetwinput)其中 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} WV×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'} Wd×V 维度(d=3V=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小狗蝴蝶)=wVexp(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(小狗,蝴蝶)wVexp(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×dd=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)=wVexp(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(小狗)=wVexp(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(蝴蝶)wVexp(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.690.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 SoftmaxNegative 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(θ₃)
                                  /        \
                                 跑(叶)   跳(叶)

④ 概率计算:沿着路径“走”出来
中心词“追”预测上下文词“小狗” 为例,步骤如下:

  1. 确定路径:从根节点到“小狗”的路径是 根 → 内部节点A → 小狗(假设根节点右子树到内部节点A,内部节点A左子树到小狗)。

  2. 每一步的二分类概率
    每个内部节点 n n n 的参数 θ n \boldsymbol{\theta}_n θn 与隐藏层向量 h \boldsymbol{h} h 做内积,通过 sigmoid函数 计算“走左子树(概率 p p p)”或“右子树(概率 1 − p 1-p 1p)”:
    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+ex),将结果压缩到 ( 0 , 1 ) (0,1) (0,1)

  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(dlogV)(参数少)
适用场景 小词汇表( 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()=σ(vwoTvwc)
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+ex),将结果压缩到 [ 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()=σ(vwnTvwc)

最终损失函数(最小化负对数似然,让正样本概率高、负样本概率低):
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σ(vwoTvwc)wn负样本logσ(vwnTvwc)
⑤ 示例:用负采样重新计算“追→小狗”的损失
假设:

  • 正样本: ( 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小狗Tv=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.606log(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 vTv=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.399log(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 vTv=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.410log(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能在 百万级词汇表 上高效训练,成为工业界首选。它的核心是 “用抽样代替全量计算”,牺牲一点理论严谨性,换来训练速度的飞跃。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐