NLP学习路线图(十八):Word2Vec (CBOW Skip-gram)

news2025/6/6 5:10:33

自然语言处理(NLP)的核心挑战在于让机器“理解”人类语言。传统方法依赖独热编码(One-hot Encoding) 表示单词,但它存在严重缺陷:每个单词被视为孤立的符号,无法捕捉词义关联(如“国王”与“王后”的关系),且维度灾难使计算效率低下。

词向量(Word Embedding) 革命性地解决了这些问题。它将单词映射为稠密、低维的实数向量(如50-300维),其核心思想是:具有相似上下文(Context)的单词,其向量表示在向量空间中也应彼此接近。Word2Vec正是实现这一思想的里程碑式模型。

一、Word2Vec:分布式表示的引擎

Word2Vec由Tomas Mikolov等人于2013年在谷歌提出,包含两种高效架构:

  1. CBOW(Continuous Bag-of-Words):通过上下文预测中心词

  2. Skip-gram:通过中心词预测上下文

两者共享核心目标:优化词向量,使模型能根据上下文/中心词准确预测目标词的概率

🔍 核心概念:分布式假设

“一个词的意义由其周围经常出现的词所决定。” —— J.R. Firth

Word2Vec完美实践了这一假设。例如:

句子:“猫在沙发上睡觉”
上下文窗口(size=2): [“在”, “沙发”, “上”, “睡觉”] → 中心词“猫”

模型通过上下文学习“猫”的向量表示。 

二、CBOW模型详解:上下文预测中心词

1. 模型架构

  • 输入层:上下文窗口内所有单词的独热向量(1×V,V=词汇表大小)

  • 投影层:上下文词向量求平均(或求和),形成固定长度向量

  • 隐藏层:无激活函数的全连接层(本质是词向量查找)

  • 输出层:Softmax计算中心词概率分布

2. 数学过程

设上下文词为 c₁, c₂, ..., cₘ,中心词为 w

  1. 输入:one_hot(c₁), ..., one_hot(cₘ)

  2. 查词向量:v_{c₁} = W_input · one_hot(c₁) (W_input为输入矩阵)

  3. 计算上下文平均向量:h = (v_{c₁} + ... + v_{cₘ}) / m

  4. 预测中心词概率:P(w|context) = softmax(W_output · h)
    W_output为输出矩阵)

3. 损失函数:交叉熵
Loss = -log(P(w_true | context))

通过反向传播更新 W_input 和 W_output

✅ 优点:
  • 对小规模数据更鲁棒

  • 训练速度快(尤其高频词)

  • 对中心词预测更平滑

❌ 缺点:
  • 上下文词平等对待(忽略位置信息)

  • 对低频词学习效果较差

三、Skip-gram模型详解:中心词预测上下文

1. 模型架构

 

  • 输入层:中心词的独热向量

  • 隐藏层:直接映射为中心词向量

  • 输出层:为每个上下文位置独立预测概率

2. 数学过程

设中心词为 w,上下文词为 c₁, c₂, ..., cₘ

  1. 输入:one_hot(w)

  2. 查中心词向量:v_w = W_input · one_hot(w)

  3. 对每个上下文位置 j
    P(c_j | w) = softmax(W_output · v_w)

  4. 目标:最大化所有上下文词的概率乘积

3. 损失函数:负对数似然
Loss = -Σ log(P(c_j | w))   (j=1 to m)
✅ 优点:
  • 在大型语料库上表现优异

  • 能有效学习低频词表示

  • 生成高质量的词向量(尤其在复杂任务中)

❌ 缺点:
  • 训练速度较慢(需预测多个目标)

  • 小数据集易过拟合


四、关键技术:优化训练效率

原始Softmax计算成本高昂(O(V)复杂度)。Word2Vec采用两种加速技术:

1. 层次Softmax(Hierarchical Softmax)
  • 使用哈夫曼树(Huffman Tree) 组织词汇表(高频词路径短)

  • 将V分类问题转化为约 log₂(V) 次二分类

  • 每个节点有参数向量,概率计算沿路径进行:

    P(word=w | context) = ∏ P(branch_decision at node)

2. 负采样(Negative Sampling)
  • 核心思想:仅更新少数权重

  • 对每个正样本(中心词, 真实上下文词),随机采样K个负样本(中心词, 非上下文词)

  • 优化目标变为:

    Loss = -log(σ(u_o^T · v_c)) - Σ_{k=1}^K log(σ(-u_k^T · v_c))

  • 其中:

    • σ 为sigmoid函数

    • u_o 是正样本词向量

    • u_k 是负样本词向量

  • K通常取5~20,大幅减少计算量

⚡ 经验:Skip-gram + 负采样是最常用组合,在语义任务中表现最佳。 

五、Word2Vec特性与局限

✨ 核心特性:
  • 语义相似性:相似词向量距离小
    cosine(v("国王"), v("王后")) ≈ 0.8

  • 线性关系:词类比任务表现惊艳
    v("国王") - v("男人") + v("女人") ≈ v("王后")

  • 上下文依赖:一词多义有不同向量(需结合上下文扩展)

⚠️ 重要局限:
  1. 静态表示:每个词仅一个向量,无法处理一词多义
    (如“苹果”在公司和水果语境中含义不同)

  2. 未考虑全局统计:仅依赖局部窗口,忽略文档级共现

  3. 未建模词序:CBOW/Skip-gram均忽略词位置信息

  4. OOV问题:无法处理未登录词


六、实战:训练与评估

🛠️ 训练步骤(Python示例):
from gensim.models import Word2Vec

sentences = [["猫", "坐", "在", "沙发"], ...]  # 分词后的语料

# 训练Skip-gram模型
model = Word2Vec(
    sentences,
    vector_size=100,   # 向量维度
    window=5,          # 上下文窗口
    sg=1,              # 1=Skip-gram; 0=CBOW
    negative=5,        # 负采样数
    min_count=5,        # 忽略低频词
    workers=4          # 并行线程
)

# 保存与加载
model.save("word2vec.model")
model = Word2Vec.load("word2vec.model")

# 应用示例
print(model.wv.most_similar("人工智能", topn=5))
# 输出: [('机器学习', 0.88), ('深度学习', 0.85), ...]

result = model.wv.evaluate_word_analogies("analogy-questions.txt")
print("词类比准确率:", result["correct"] / result["total"])
📊 评估方法:
  1. 内部任务

    • 词相似度(如计算与人类判断的相关性)

    • 词类比(如 man:woman :: king:?

  2. 下游任务

    • 文本分类(作为特征输入)

    • 命名实体识别(增强上下文表示)

    • 情感分析(捕捉情感语义)

研究显示:在词类比任务中,Skip-gram比CBOW平均高5-10%准确率。 

七、超越Word2Vec:现代嵌入技术

尽管Word2Vec影响深远,后续技术已解决其关键短板:

  • FastText:引入子词(subword)信息,能生成未登录词向量
    向量("深度学习") ≈ 向量("深") + 向量("度") + 向量("学习")

  • GloVe:结合全局统计与局部窗口,优化共现矩阵分解

  • 上下文嵌入(ELMo/BERT):动态生成词向量,解决一词多义
    BERT("苹果股价") vs BERT("吃苹果") → 不同向量表示

  • 大规模预训练模型(GPT, T5):基于Transformer架构,生成任务感知嵌入


八、总结:为什么Word2Vec仍是基石?

Word2Vec的成功在于其简洁性与高效性的完美平衡:

  1. 首次证明浅层神经网络可学习高质量语义表示

  2. 负采样/层次Softmax 大幅提升训练效率

  3. 开创了词类比评估范式,直观展示语义关系

  4. 启发了后续嵌入技术的爆炸性发展

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2398077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习笔记 - 新版Keil软件模拟时钟Xtal灰色不可更改的问题

在新版Keil软件中,模拟时钟无法修改XTAL频率,默认只能使用12MHz时钟。‌这是因为Keil MDK从5.36版本开始,参数配置界面不再支持修改系统XTAL频率,XTAL选项变为灰色,无法修改。这会导致在软件仿真时出现时间错误的问题&…

黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+)

一. 算法复杂度分析 1.1 时间复杂度 时间复杂度分析:来评估代码的执行耗时的 常见的复杂度表示形式 常见复杂度 1.2 空间复杂度 空间复杂度全称是渐进空间复杂度,表示算法占用的额外存储空间与数据规模之间的增长关系 二. 数组 数组(Array&a…

Nginx+Tomcat负载均衡

目录 Tomcat简介 Tomcat 的核心功能 Tomcat架构 Tomcat 的特点 Tomact配置 关闭防火墙及系统内核 Tomcar 主要文件信息 配置文件说明 案例一:Java的Web站点 案例二:NginxTomcat负载均衡、动静分离 Tomcat简介 Tomcat 是由 Apache 软件基金会&am…

【论文解读】ReAct:从思考脱离行动, 到行动反馈思考

认识从实践开始,经过实践得到了理论的认识,还须再回到实践去。 ——《实践论》,毛泽东 1st author: About – Shunyu Yao – 姚顺雨 paper [2210.03629] ReAct: Synergizing Reasoning and Acting in Language ModelsReAct: Synergizing Reasoning and…

简单配置RHEL9.X

切换默认运行级别 将系统默认启动模式从多用户的图形界面调整为多用户的文本界面,适用于优化系统资源占用或进行远程服务器管理的场景。 注意:安装选择“带GUI的服务器”部分常用命令默认安装;如果选择“最小安装”时,部分常用命…

下载并运行自制RAG框架

项目部署 https://github.com/huangjia2019/rag-project01-framework git clone https://github.com/huangjia2019/rag-project01-framework.git 一 、 前端分部分部署 在 Ubuntu 系统 上安装 Node.js 和 npm(Node Package Manager),并初始…

Rust 学习笔记:Cargo 工作区

Rust 学习笔记:Cargo 工作区 Rust 学习笔记:Cargo 工作区创建工作区在工作区中创建第二个包依赖于工作区中的外部包向工作区添加测试将工作区中的 crate 发布到 crates.io添加 add_two crate 到工作区总结 Rust 学习笔记:Cargo 工作区 随着项…

颈部的 “异常坚持”

生活中,有些人的颈部会突然变得 “异常坚持”—— 头部不受控制地偏向一侧,或是不自主地旋转、后仰,仿佛被无形的力量牵引着。这种情况不仅影响外观,还会带来强烈的不适感,颈部肌肉紧绷、酸痛,像被一根绳索…

Ubuntu22.04安装MinkowskiEngine

MinkowskiEngine简介 Minkowski引擎是一个用于稀疏张量的自动微分库。它支持所有标准神经网络层,例如对稀疏张量的卷积、池化和广播操作。 MinkowskiEngine安装 官方源码链接:GitHub - NVIDIA/MinkowskiEngine: Minkowski Engine is an auto-diff neu…

【计算机网络】第2章:应用层—应用层协议原理

目录 1. 网络应用的体系结构 2. 客户-服务器(C/S)体系结构 3. 对等体(P2P)体系结构 4. C/S 和 P2P 体系结构的混合体 Napster 即时通信 5. 进程通信 6. 分布式进程通信需要解决的问题 7. 问题1:对进程进行编址…

【Zephyr 系列 6】使用 Zephyr + BLE 打造蓝牙广播与连接系统(STEVAL-IDB011V1 实战)

🧠关键词:Zephyr、BLE、广播、连接、GATT、低功耗蓝牙、STEVAL-IDB011V1 📌适合人群:希望基于 Zephyr 实现 BLE 通信的嵌入式工程师、蓝牙产品开发人员 🧭 前言:为什么选择 Zephyr 开发 BLE? 在传统 BLE 开发中,我们大多依赖于厂商 SDK(如 Nordic SDK、BlueNRG SD…

利用 Scrapy 构建高效网页爬虫:框架解析与实战流程

目录 前言1 Scrapy 框架概述1.1 Scrapy 的核心优势1.2 Scrapy 的典型应用场景 2 Scrapy 工作原理解析2.1 框架结构图2.2 Spider:定义数据采集策略2.3 Scheduler:调度请求与去重2.4 Downloader:网页下载器2.5 Item:结构化数据容器2…

RPG20.创建敌人的初始能力和加载武器

1. 基于StartUpAbilitiy基类创建专门用于敌人数据的DAStartUpABility,然后再基于新创建的DA再创建一个蓝图 2.打开 DataAsset_EnemyStartUpData.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "Cor…

自适应移动平均(Adaptive Moving Average, AMA)

文章目录 1. 考夫曼自适应移动平均 (KAMA)算法推导及Python实现2. 对 (KAMA)算法参数进行优化及实现 自适应移动平均(Adaptive Moving Average, AMA)由Perry Kaufman在其著作《Trading Systems and Methods》中提出,它通过动态调整平滑系数来…

涨薪技术|0到1学会性能测试第95课-全链路脚本开发实例

至此关于系统资源监控、apache监控调优、Tomcat监控调优、JVM调优、Mysql调优、前端监控调优、接口性能监控调优的知识已分享完,今天学习全链路脚本开发知识。后续文章都会系统分享干货,带大家从0到1学会性能测试。 前面章节介绍了如何封装.h头文件,现在通过一个实例来介绍…

Spring AI Alibaba + Nacos 动态 MCP Server 代理方案

作者:刘宏宇,Spring AI Alibaba Contributor 文章概览 Spring AI Alibaba MCP 可基于 Nacos 提供的 MCP server registry 信息,建立一个中间代理层 Java 应用,将 Nacos 中注册的服务信息转换成 MCP 协议的服务器信息&#xff0c…

MCP:让AI工具协作变得像聊天一样简单 [特殊字符]

想象一下,你正在处理一个项目,需要从A平台查看团队讨论,从B平台获取客户信息,还要在GitHub上检查代码进度。传统做法是什么?打开三个不同的网页,在各个平台间来回切换,复制粘贴数据,最后还可能因为信息分散而遗漏重要细节。 听起来很熟悉?这正是当前工作流程的痛点所…

AI炼丹日志-27 - Anubis 通过 PoW工作量证明的反爬虫组件 上手指南 原理解析

点一下关注吧!!!非常感谢!!持续更新!!! Java篇: MyBatis 更新完毕目前开始更新 Spring,一起深入浅出! 大数据篇 300: Hadoop&…

阿姆达尔定律的演进:古斯塔夫森定律

前言 在上一篇文章《使用阿姆达尔定律来提升效率》中提到的阿姆达尔定律前提是假设问题的规模保持不变,并且给定一台速度更快的机器,目标是更快地解决问题。然而,在大多数情况下,这并不完全正确。当有一台更快的机器时&#xff0…

JavaScript极致性能优化全攻略

JavaScript性能优化深度指南 1 引言 JavaScript性能优化在现代Web开发中至关重要。随着Web应用日益复杂,性能直接影响用户体验、搜索引擎排名和业务转化率。研究表明,页面加载时间每增加1秒,转化率下降7%,跳出率增加32%。通过优化JavaScript性能,开发者可以: 提升用户满…