当前位置: 首页 > news >正文

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×dd 为词向量维度)是训练的核心目标。当输入词的 one-hot 向量与 W\bold{W}W 相乘时,等价于从矩阵中 “提取” 对应行的向量 —— 这就是我们最终需要的词向量。
  • 输出层:通常采用 softmax 函数(或其近似方法),输出对目标词的概率分布。对于输入的上下文(或中心词),输出层会给出词汇表中每个词作为目标词的概率,即 P(wt∣Context)P(w_t | Context)P(wtContext)P(Context∣wt)P(Context | w_t)P(Contextwt)(输入上下文还是中心词对应两种方法,后面会讲到)

(2)训练目标

神经网络的训练目标是最大化预测正确目标词的概率。通过反向传播算法不断调整隐藏层权重矩阵 W\bold{W}W,使预测结果尽可能接近真实标签(即语料中实际出现的目标词)。用数学表示为最小化以下损失函数:
L=−∑tlog⁡P(wtarget∣winput)L = -\sum_{t} \log P(w_{target} | w_{input}) L=tlogP(wtargetwinput)其中 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)=log⁡P1+log⁡P2\log(P_1×P_2) = \log P_1+ \log P_2log(P1×P2)=logP1+logP2),还能保持 “大小趋势一致”(比如 P1×P2P_1×P_2P1×P2 越大,log⁡P1+log⁡P2\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}WV×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'}Wd×V 维度(d=3V=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}hW′\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小狗蝴蝶)=wVexp(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(小狗,蝴蝶)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.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}hW′\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)=wVexp(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(小狗)=wVexp(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(蝴蝶)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.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.690.77]=1.46 训练时,反向传播会调整 W′\bold{W'}W(中心词的词向量)和 W\bold{W}W(输出权重),让 所有上下文词的预测概率都提升,最终降低损失L

2.3 Skip-gram vs CBOW

维度Skip-gramCBOW
输入输出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=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(θ₃)/        \跑(叶)   跳(叶)

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

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

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

维度普通SoftmaxHierarchical Softmax
时间复杂度O(V)O(V)O(V)(遍历全表)O(log⁡V)O(\log V)O(logV)(遍历树高)
空间复杂度O(dV)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%的词和“追”无关)。
  • 这些“无关词”的计算完全是 浪费算力

负采样的核心:只计算“正样本(真实上下文)”和“少量负样本(随机采样的无关词)”,其他词直接忽略。

② 核心思想:把“多分类”拆成“多个二分类”
对每个训练样本(中心词 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()=σ(vwoTvwc)
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+ex),将结果压缩到 [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()=σ(vwnTvwc)

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

  • 正样本:(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小狗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.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 SamplingHierarchical Softmax
计算效率更高(O(1+k)O(1+k)O(1+k)kkk通常取5~20)O(log⁡V)O(\log V)O(logV)(树高决定)
参数规模无额外参数(复用词向量)需维护二叉树节点参数
语义适应性不依赖词频,动态词表更友好依赖哈夫曼树(词频驱动)
适用场景大规模语料(如社交文本)静态大词表(如百科数据)

关键结论:
负采样的“暴力简化”让Word2Vec能在 百万级词汇表 上高效训练,成为工业界首选。它的核心是 “用抽样代替全量计算”,牺牲一点理论严谨性,换来训练速度的飞跃。

http://www.lryc.cn/news/610249.html

相关文章:

  • 【科研绘图系列】R语言绘制解释度条形图的热图
  • JavaScript案例(待办事项列表)
  • 项目配置文件正确但是启动失败,报配置文件内容错误或中间件地址与实际不符
  • 蓝桥杯----AT24C02
  • 在Windows 11+I7+32GB内存+RTX 3060上部署Stable Diffusion 3.5 Medium详细步骤
  • 《Python 实用项目与工具制作指南》· 3.2 实战·开发密码管理器
  • Spring AI实战:SpringBoot项目结合Spring AI开发——提示词(Prompt)技术与工程实战详解
  • 在CAPL自动化脚本中巧用panel函数
  • 贯穿全生命周期,生成式AI正在重塑游戏行业
  • Pytorch-05 所以计算图和自动微分到底是什么?(计算图及自动微分引擎原理讲解)
  • 数分思维13:AB测试
  • HTTP、WebSocket、TCP、Kafka等通讯渠道对比详解
  • C# 类型
  • Python-初学openCV——图像预处理(七)——模板匹配、霍夫变换
  • 专题:2025生命科学与生物制药全景报告:产业图谱、投资方向及策略洞察|附130+份报告PDF、原数据表汇总下载
  • idea添加gitlab访问令牌
  • Docker-07.Docker基础-数据卷挂载
  • leetcode_11 盛最多水的容器
  • C++ stdset 与 stdmultiset 深度比较
  • pathspec ‘with_def_layout‘ did not match any file(s) known to git`
  • jenkins+gitlab自动发布系统
  • IntelliJIDEA上传GitHub全攻略
  • JVM学习专题(四)对象创建过程
  • 数据结构:如何判断一个链表中是否存在环(Check for LOOP in Linked List)
  • IDM(Internet Download Manager)是什么?它有什么作用
  • 微帧GPU视频硬编优化引擎:面向人工智能大时代的AI算法与硬编协同优化方案
  • C语言实现Elasticsearch增删改查API
  • 部署 Kibana 8.2.2 可视化管理 Elasticsearch 8.2.2 集群
  • 解决 PS暂存盘已满的五种方法
  • PSOFT Pencil+ 4.25 插件安装教程(适用于 3ds Max 2022-2025)