经典Embedding方法:Word2Vec与Skip-Gram算法)

news/2025/2/22 19:29:38

引言

在自然语言处理(NLP)中,词嵌入(Word Embedding)是表示词汇语义的关键技术。2013年,Google提出的Word2Vec模型彻底改变了这一领域,其核心思想是通过无监督学习将单词映射到低维稠密向量空间中,使得语义相似的词在向量空间中距离相近。Word2Vec包含两种主要模型:

  • CBOW(Continuous Bag-of-Words):通过上下文预测中心词。
  • Skip-Gram:通过中心词预测上下文。

在这里插入图片描述

1.Word2Vec概述

核心思想,Word2Vec基于分布式假设:

“具有相似上下文的词,其语义也相似。”

例如,句子 "The cat sits on the mat""A dog lies on the rug" 中,catdog 的上下文相似,因此它们的向量表示应接近。

1.1 训练方法:Skip-Gram vs CBOW

假设每个单词与其邻近的单词之间存在最紧密的联系,即每个单词都是由其周围的单词所定义的(CBOW模型的核心理念)。或者,从另一个角度来看,每个单词都对其相邻的单词起到了决定性的作用(Skip-gram模型的主要原理)

模型输入输出适用场景
CBOW上下文词中心词高频词预测
Skip-Gram中心词上下文词低频词捕捉、更通用

实际上后者用的更多、效果也相对较好,本文重点解析Skip-Gram的数学模型。


2.Skip-Gram模型架构

Skip-Gram的目标是:给定中心词,预测其窗口内的上下文词。例如,对于窗口大小=2的句子 "I love natural language processing"

  • 中心词:love
  • 上下文词:I, natural, language

网络结构

  1. 输入层:中心词的one-hot编码(维度=词汇表大小 V)。
  2. 投影层:将输入映射到低维稠密向量(维度= d,即嵌入维度)。
  3. 输出层:通过权重矩阵计算上下文词的概率分布。

在这里插入图片描述

Embedding的概念:Embedding 其实是训练出一个维度为 V × N V \times N V×N 的词向量矩阵 W W W,其中 V V V 是词汇表大小, N N N 是每个词的向量维度。样本经过 One-hot 编码后会变成一个 1 × V 1 \times V 1×V 的稀疏向量,其中仅有一个位置为 1(表示中心词)。与 W W W矩阵进行矩阵乘法 X ∈ R 1 × V X \in \mathbb{R}^{1 \times V} XR1×V W ∈ R V × N W \in \mathbb{R}^{V \times N} WRV×N 后得到一个 1 × N 1 \times N 1×N 的向量,表示中心词的词向量。由于 One-hot 编码的稀疏性质,实际上是从 W W W 中抽取了某一行作为该词的向量表示,所以这个训练好的矩阵也被称为查找表(lookup table)。

在这里插入图片描述

2.1 Skip-Gram的数学模型

Skip-Gram 模型的目标是通过给定中心词 w c w_c wc 来最大化上下文词 w o w_{o} wo 的条件概率。我们用 w c w_c wc 表示中心词,用 w o w_o wo 表示上下文词, w c w_c wc 的上下文范围为 C C C (通常是一个小窗口,例如 5 个词)。

Skip-Gram 模型的目标是最大化以下概率:

P ( w o ∣ w c ) = ∏ − C ≤ j ≤ C , j ≠ 0 P ( w c + j ∣ w c ) P(w_o | w_c) = \prod_{-C \leq j \leq C, j \neq 0} P(w_{c+j} | w_c) P(wowc)=CjC,j=0P(wc+jwc)

其中, P ( w c + j ∣ w c ) P(w_{c+j} | w_c) P(wc+jwc) 表示给定中心词 w c w_c wc,预测上下文词 w c + j w_{c+j} wc+j 的概率。

2.2 概率计算

为了计算 P ( w c + j ∣ w c ) P(w_{c+j} | w_c) P(wc+jwc),我们需要对每个上下文词的概率进行建模。Skip-Gram 模型使用 Softmax 函数来计算概率:

P ( w o ∣ w c ) = e v o T v c ∑ w = 1 ∣ V ∣ e v w T v c P(w_o | w_c) = \frac{e^{v_o^T v_c}}{\sum_{w=1}^{|V|} e^{v_w^T v_c}} P(wowc)=w=1VevwTvcevoTvc

其中:

  • v c v_c vc 是中心词 w c w_c wc 的词向量。
  • v o v_o vo 是上下文词 w o w_o wo 的词向量。
  • ∣ V ∣ |V| V 是词汇表的大小。

Softmax 函数通过计算词向量之间的点积来衡量中心词和上下文词之间的相似度。

值得注意的是,参考最上面的模型架构图

  • v c v_c vc v o v_o vo并不在同一个向量空间中
  • 模型有两个矩阵,分别为输入矩阵 W V × N W_{V \times N} WV×N,输出矩阵 W N × V ′ W_{N \times V}^{'} WN×V, 输入向量转变为Embedding是通过输入层到隐藏层的权重矩阵Q但是输出向量并不是直接从输入矩阵中获取,而是通过输出矩阵获取,所以可以看到输入向量即Embedding 与输出矩阵相乘其实就是在算他与其他词向量的点积 再通过softmax计算相似性。

2.3 训练目标

Skip-Gram 模型的目标是通过优化损失函数来最大化条件概率。所以采用极大似然估计法,加上负号(注意原文是求最大值,但是加上负号求最小值其实是一样,并且更符合损失函数定义),并取对数形式,得到损失函数表示如下

J ( θ ) = − 1 N ∑ i = 1 N ∑ − C ≤ j ≤ C , j ≠ 0 log ⁡ P ( w i + j ∣ w i ) J(\theta) = -\frac{1}{N}\sum_{i=1}^{N} \sum_{-C \leq j \leq C, j \neq 0} \log P(w_{i+j} | w_i) J(θ)=N1i=1NCjC,j=0logP(wi+jwi)

其中:

  • N N N 是句子的总词数。
  • C C C 是上下文窗口的大小。

通过优化这个损失函数,模型能够学习到每个词的低维向量表示,从而捕捉到词与词之间的语义关系。

2.4 Skip-Gram 模型的训练过程

  1. 初始化: 为每个词语初始化一个随机向量。
  2. 遍历语料: 对每个中心词 w c w_c wc,选择一个上下文窗口,遍历窗口中的上下文词 w o w_o wo
  3. 计算概率: 使用 Softmax 计算 P ( w o ∣ w c ) P(w_o | w_c) P(wowc)
  4. 更新词向量: 使用梯度下降法优化模型,更新词向量。

2.5 代码实现

class Embedding(nn.Module):
    def __init__(self, input_dim, emb_dim):
        """
        初始化 Embedding 层。
        :param input_dim: 输入特征的维度。
        :param emb_dim: 嵌入的维度。
        """
        super(Embedding, self).__init__()
        self.input_matrix = nn.Parameter(torch.randn(input_dim,emb_dim)) #输入特征的嵌入矩阵
        self.output_matrix = nn.Parameter(torch.randn(emb_dim,input_dim)) #输出特征的嵌入矩阵


    def forward(self,x):
        """
        前向传播函数。
        :param x: 输入张量,形状为 (batch_size, input_dim)。
        :return: 返回样本与整个词汇表的点积,形状为 (batch_size, input_dim)。
        """
        embedding = torch.matmul(x,self.input_matrix) #获取输入特征的嵌入表示
        product = torch.matmul(embedding, self.output_matrix) #计算输入特征与整个词汇表的点积
        return torch.softmax(product,-1) #对点积进行softmax归一化 (batch_size, input_dim)
     

3优化方法

直接计算全量Softmax(复杂度 O(V))在大词汇表下不可行。上面也可以看到,每个样本在softmax那块都需要计算整个词汇表的输出概率,这样的计算开销实际上是非常大的,常用优化方法:

1.负采样:为了提高训练效率,Skip-Gram 模型通常使用负采样(Negative Sampling),即只对一部分负样本进行训练,而不是对整个词汇表进行训练。

推导过程如下:

用以下损失近似原始目标:
L = − log ⁡ σ ( v c ⋅ v w ) − ∑ k = 1 K E w k ∼ P n ( w ) log ⁡ σ ( − v c ⋅ v w n e g ) \mathcal{L} = -\log \sigma(v_c \cdot v_w) - \sum_{k=1}^K \mathbb{E}_{w_k \sim P_n(w)} \log \sigma(-v_{c} \cdot v_{wneg}) L=logσ(vcvw)k=1KEwkPn(w)logσ(vcvwneg)
其中:

  • σ 是sigmoid函数
  • v c v_c vc表示给定中心词 c的Embedding向量 和上下文词(正样本)$ v_w 的向量,负样本 的向量,负样本 的向量,负样本v_{wneg}$向量
  • K 是负样本数(通常5~20)
  • P n ( w ) P_n(w) Pn(w) 是噪声分布(如词频的3/4次方)

这里对 P n P_n Pn进行扩展
P n ( w ) = f ( w ) 3 4 ∑ w ′ f ( w ′ ) 3 4 P_n(w) = \frac{f(w)^{\frac{3}{4}}}{\sum_{w'} f(w')^{\frac{3}{4}}} Pn(w)=wf(w)43f(w)43
其中: f ( w ) f(w) f(w)是词 w w w 在语料库中的频率。

  • f ( w ′ ) f(w') f(w) 是语料库中每个词 w ′ w' w的频率。

选择词频的 3/4 次方作为噪声分布的权重,有以下几个原因:

  • 减少高频词的选择概率:高频词(如 “the”、“is” 等常见功能词)并不太有助于捕捉语义信息,因此通过降低其选择概率,避免其过多出现在负样本中。
  • 提高低频词的选择概率:低频词对于模型学习更具挑战性和语义信息,因此提高低频词的选择概率,有助于模型学习到更加丰富的语义表示。

推导过程如下:

符号表示
p ( D = 1 ∣ c , w ; θ ) p(D = 1 | c, w; \theta) p(D=1∣c,w;θ) 表示给定中心词 c c c 和上下文词 w w w 的正样本概率, p ( D = 0 ∣ c , w ; θ ) p(D = 0 | c, w; \theta) p(D=0∣c,w;θ) 表示负样本概率。


优化目标:
= arg ⁡ max ⁡ θ ∏ ( w , c ) ∈ D p ( D = 1 ∣ c , w ; θ ) ∏ ( w , c ) ∈ D ′ p ( D = 0 ∣ c , w ; θ ) = arg ⁡ max ⁡ θ ∏ ( w , c ) ∈ D p ( D = 1 ∣ c , w ; θ ) ∏ ( w , c ) ∈ D ′ ( 1 − p ( D = 1 ∣ c , w ; θ ) ) = arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ p ( D = 1 ∣ c , w ; θ ) + ∑ ( w , c ) ∈ D ′ log ⁡ ( 1 − p ( D = 1 ∣ c , w ; θ ) ) \begin{aligned} &= \arg \max_{\theta} \prod_{(w,c) \in D} p(D = 1 | c, w; \theta) \prod_{(w,c) \in D'} p(D = 0 | c, w; \theta)\\ &= \arg \max_{\theta} \prod_{(w,c) \in D} p(D = 1 | c, w; \theta) \prod_{(w,c) \in D'} (1 - p(D = 1 | c, w; \theta))\\ &= \arg \max_{\theta} \sum_{(w,c) \in D} \log p(D = 1 | c, w; \theta) + \sum_{(w,c) \in D'} \log (1 - p(D = 1 | c, w; \theta)) \end{aligned} =argθmax(w,c)Dp(D=1∣c,w;θ)(w,c)Dp(D=0∣c,w;θ)=argθmax(w,c)Dp(D=1∣c,w;θ)(w,c)D(1p(D=1∣c,w;θ))=argθmax(w,c)Dlogp(D=1∣c,w;θ)+(w,c)Dlog(1p(D=1∣c,w;θ))
接下来,利用 Sigmoid 函数的定义 σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1,将模型的预测概率表达为:

p ( D = 1 ∣ c , w ; θ ) = 1 1 + e − v c ⋅ v w p(D = 1 | c, w; \theta) = \frac{1}{1 + e^{-v_c \cdot v_w}} p(D=1∣c,w;θ)=1+evcvw1
于是,上式变为:

= arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ 1 1 + e − v c ⋅ v w + ∑ ( w , c ) ∈ D ′ log ⁡ ( 1 − 1 1 + e − v c ⋅ v w ) = arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ 1 1 + e − v c ⋅ v w + ∑ ( w , c ) ∈ D ′ log ⁡ ( 1 1 + e v c ⋅ v w ) = arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ σ ( v c ⋅ v w ) + ∑ ( w , c ) ∈ D ′ log ⁡ σ ( − v c ⋅ v w ) \begin{aligned} &= \arg \max_{\theta} \sum_{(w,c) \in D} \log \frac{1}{1 + e^{-v_c \cdot v_w}} + \sum_{(w,c) \in D'} \log \left( 1 - \frac{1}{1 + e^{-v_c \cdot v_w}} \right)\\ &= \arg \max_{\theta} \sum_{(w,c) \in D} \log \frac{1}{1 + e^{-v_c \cdot v_w}} + \sum_{(w,c) \in D'} \log \left( \frac{1}{1 + e^{v_c \cdot v_w}} \right)\\ &= \arg \max_{\theta} \sum_{(w,c) \in D} \log \sigma(v_c \cdot v_w) + \sum_{(w,c) \in D'} \log \sigma (-v_c \cdot v_w) \end{aligned} =argθmax(w,c)Dlog1+evcvw1+(w,c)Dlog(11+evcvw1)=argθmax(w,c)Dlog1+evcvw1+(w,c)Dlog(1+evcvw1)=argθmax(w,c)Dlogσ(vcvw)+(w,c)Dlogσ(vcvw)

为了符合损失函数形式,我们取负号,改求最小值,得到最终的优化目标即为:
L = − log ⁡ σ ( v c ⋅ v w ) − ∑ k = 1 K E w k ∼ P n ( w ) log ⁡ σ ( − v c ⋅ v w n e g ) \mathcal{L} = -\log \sigma(v_c \cdot v_w) - \sum_{k=1}^K \mathbb{E}_{w_k \sim P_n(w)} \log \sigma(-v_{c} \cdot v_{wneg}) L=logσ(vcvw)k=1KEwkPn(w)logσ(vcvwneg)

2.Hierarchical Softmax:通过使用哈夫曼树优化 Softmax 计算,进一步提高训练效率。


总结

  1. Skip-Gram的优势
    • 擅长捕捉低频词。
    • 生成的高质量词向量可应用于语义分析、推荐系统召回等。
  2. 数学本质
    通过最大似然估计,学习词向量以编码上下文相似性。
  3. 实际应用
    • 预训练词向量(如GloVe、BERT的基础)。
    • 相似词检索、文本分类、命名实体识别等。

参考文献

  1. Mikolov et al. (2013). Efficient Estimation of Word Representations in Vector Space.
  2. Goldberg & Levy (2014). word2vec Explained.
  3. Rong, Xin. “word2vec Parameter Learning Explained.” arXiv, November 2014. University of Michigan
  4. 王喆《深度学习推荐系统》
  5. word2vec跳字模型skip-gram详解,使用Pytorch实现

http://www.niftyadmin.cn/n/5862687.html

相关文章

UE5中按钮圆角,设置边框

FSlateBrush NormalBrush; NormalBrush.DrawAs ESlateBrushDrawType::RoundedBox; NormalBrush.TintColor FLinearColor(245 / 255.f, 245 / 255.f, 1.0f); // NormalBrush.OutlineSettings.CornerRadii FVector4(1.0f, 1.0f, 1.0f, 1.0f); // 圆角半径,分别对应…

普通人使用生成式语言模型的几个阶段

随着生成式语言模型(如 ChatGPT、Grok 等)逐渐走进大众生活,普通人从最初的懵懂尝试,到熟练运用,再到理性判断其输出结果是否可靠,经历了一个逐步进阶的过程。以下,我将详细描述普通人使用生成式…

R语言安装生物信息数据库包

R语言安装生物信息数据库包 在生物信息学领域,R语言是重要的数据分析工具。今天,我们就来聊聊在R语言环境下,安装生物信息数据库包(org.*.*.db)的步骤。 为什么要安装org.*.*.db系列包 生物信息学分析中&#xff0c…

网络安全高级软件编程技术

安全软件开发入门 软件安全问题 有趣的《黑客帝国》终极解释: 《黑客帝国》故事里面的人物关系,就像电脑里面的各种程序的关系一样: 电脑里面的系统程序:Matrix; 病毒程序:以Neo为首的人类; …

Java+SpringBoot+Vue+数据可视化的美食餐饮连锁店管理系统

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当下这个瞬息万变的时代,餐饮行业正以惊人的速度蓬勃发展。随着人们生活水…

AI边缘计算盒子价格各异,如何精准选型成企业难题

在如今的数字化转型浪潮下,AI 边缘计算盒子正成为企业智能化升级的核心设备!但产品价格因品牌、型号、性能而异,如何精准选型成企业难题!下面万物这就带大家了解下AI边缘计算盒子价格: 企业产品线丰富,满足…

基于Spring Boot的RabbitMQ延时队列技术实现

文章目录 基于Spring Boot的RabbitMQ延时队列技术实现延时队列应用场景基本概念实现延时队列添加依赖基础配置配置类设计消息生产者消息消费者 两种TTL设置方式 订单超时关闭实例订单服务消息处理 延迟消息插件安装插件配置延迟交换机 基于Spring Boot的RabbitMQ延时队列技术实…

《Keras 3 : 使用迁移学习进行关键点检测》:此文为AI自动翻译

《Keras 3 :使用迁移学习进行关键点检测》 作者:Sayak Paul,由 Muhammad Anas Raza 转换为 Keras 3 创建日期:2021/05/02 最后修改时间:2023/07/19 描述:使用数据增强和迁移学习训练关键点检测器。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 关键点检测包…