一、知识点总结
Word2Vec 是一种 “用词语的‘朋友圈’(上下文)快速给词语生成‘语义身份证’(低维向量)” 的技术,让机器能通过向量距离 “感知” 词语的语义关联,是自然语言处理从 “机械匹配” 走向 “语义理解” 的关键一步,Word2Vec有两种主要架构: 连续词袋模型(Continuous Bag-of-Words) 和 skip-gram 模型(跳字模型)
两者区别: cbow 像 “听众人描述猜主角”(聚合上下文,快而稳,适合高频词);Skip-gram 像 “知主角猜朋友圈”(发散上下文,准而细,适合低频词),两者都通过 “词的邻居” 学习语义向量。(看完后续详细介绍后再回看)
二、cbow模型(连续词袋模型)
1. 由来的背景
传统词表示(如独热编码)无法捕捉语义关联,且维度极高。2013 年 Mikolov 团队提出 Word2Vec 时,设计了 CBOW 模型,其核心思路源于 “上下文决定词义” 的语言学规律 —— 一个词的含义可由其周围的词(上下文)推断。CBOW 针对高频词和小语料优化,通过聚合上下文信息预测中心词,能更稳定地学习词向量。
2.目标及解决的问题
- 核心目标:给定一个词的上下文(如前后 n 个词),预测这个中心词,通过该过程学习低维稠密的词向量,使语义相似的词向量距离更近。
- 解决的问题:
- 克服独热编码的高维度和稀疏性(将词向量从 “词汇表大小” 压缩到 50-300 维);
- 捕捉词的语义关联(如 “医生” 常出现在 “病人”“医院” 附近,两者向量更相似);
- 对高频词学习更稳定(上下文信息多,聚合后噪声小);
- 训练效率高于早期神经语言模型(通过简化网络结构实现)。
3.生活类比
“根据周围人的描述猜主角”
假设你不知道 “小明” 是谁,但听他的朋友说:“他总戴眼镜,爱做题,经常去图书馆”(上下文),你能猜到 “小明” 可能是 “学生”(中心词)。
CBOW 就像这个猜人的过程:通过聚合周围人的描述(上下文词向量),推断中间的人是谁(中心词),并通过多次猜测,逐渐摸清 “学生”“图书馆” 这些词的 “特征”(词向量),让 “学生” 和 “图书馆” 的特征更相似。
4.实现方法
步骤可概括为 “上下文聚合→预测中心词→优化向量”:
- 构建训练数据:
从语料中截取 “上下文 - 中心词” 对。例如,句子 “猫 喜欢 吃 鱼”,若上下文窗口为 2(取中心词前后 2 个词),中心词是 “吃”,则上下文为 “猫、喜欢、鱼”,生成训练对([猫,喜欢,鱼] → 吃)。 - 模型结构(简化版):
- 输入层:上下文每个词的独热向量(仅用于定位对应的词向量);
- 隐藏层:将上下文词的向量取平均(聚合上下文信息),得到一个 “上下文向量”;
- 输出层:通过 softmax 函数计算 “中心词” 的概率(即给定上下文向量,预测每个词是中心词的概率)。
- 训练优化:
目标是最大化 “正确中心词” 的概率(用交叉熵损失函数优化)。为加速计算,实际用负采样(仅对比少数负例词,如随机选 5 个无关词)替代全量 softmax。 - 提取词向量:
训练完成后,取输入层对应的向量作为最终词向量(每个词一个固定向量)。
5.局限性
- 丢失上下文细节:对上下文词向量取平均,可能掩盖个别重要词的影响(如 “不” 等否定词的作用被弱化);
- 对低频词不友好:低频词的上下文样本少,聚合后信息不足,向量精度低;
- 静态词向量:一词一向量,无法处理多义词(如 “银行” 既指金融机构也指河岸);
- 依赖局部上下文:仅用窗口内的词,难以捕捉长距离语义关联(如段落级逻辑)。
三、skip-gram模型
1. 由来的背景
与 CBOW 同期提出,针对 CBOW 对低频词学习不足的问题设计。其核心思路是 “由中心词推断上下文”,因为低频词虽然出现次数少,但每次出现时的上下文仍有价值 —— 通过让一个低频词预测多个上下文,可放大其训练信号,更充分地学习其向量。
2.目标及解决的问题
- 核心目标:给定一个中心词,预测其周围的上下文词(如前后 n 个词),通过该过程学习词向量,使语义相关的词在向量空间中更接近。
- 解决的问题:
- 弥补 CBOW 对低频词的劣势(一个中心词可生成多个上下文样本,增强低频词的训练信号);
- 更精准捕捉词的细微语义差异(如 “国王” 和 “女王” 的区别,通过不同上下文预测体现);
- 支持词向量的数学运算(如 “国王 - 男人 + 女人≈女王”);
- 相比早期模型,训练效率仍较高(通过负采样等技巧优化)。
3.生活类比
“知道一个人,猜他会和谁在一起”
如果你知道 “小明” 是 “程序员”(中心词),你能猜到他可能经常和 “电脑”“代码”“bug” 这些词(上下文)在一起。
Skip-gram 就像这个过程:通过 “程序员” 这个中心词,预测他的社交圈(上下文词),并通过多次预测,逐渐摸清 “程序员”“代码” 的 “特征”(词向量),让它们的特征更相似。对于 “黑客” 这种不常见的词(低频词),每次出现时,通过预测其周围的 “攻击”“网络” 等词,能更充分地学习其特征。
4.实现方法
步骤可概括为 “中心词扩展→预测上下文→优化向量”:
- 构建训练数据:
从语料中截取 “中心词 - 上下文词” 对。例如,句子 “狗 追 猫”,中心词是 “追”,上下文窗口为 1,则生成训练对(追→狗)、(追→猫)(一个中心词对应多个上下文词)。 - 模型结构(简化版):
- 输入层:中心词的独热向量(定位其对应的词向量);
- 隐藏层:直接取中心词的向量(无需平均,保留个体信息);
- 输出层:通过 softmax 函数计算 “每个词是上下文词” 的概率(即给定中心词向量,预测哪些词会出现在周围)。
- 训练优化:
目标是最大化 “所有正确上下文词” 的联合概率(用交叉熵损失优化)。同样用负采样加速计算(每次只对比少量负例)。 - 提取词向量:
训练完成后,取输入层对应的向量作为最终词向量。
5.局限性
- 计算成本较高:一个中心词对应多个上下文词,训练样本量比 CBOW 大,相同语料下训练速度更慢;
- 对高频词效率低:高频词(如 “的”“是”)出现次数多,生成的样本冗余,可能浪费计算资源;
- 静态词向量:同样无法处理多义词(一词一向量);
- 依赖局部上下文:与 CBOW 一样,难以捕捉长距离语义关联。
四、优化技巧
Word2Vec 的核心挑战之一是在大规模语料和大词汇量下的训练效率问题,层次 softmax、子采样、负采样是针对这一问题设计的关键优化技巧,三者从不同角度降低计算复杂度并提升词向量质量
1.层次 Softmax(Hierarchical Softmax)
- 核心目标:解决传统 Softmax 在输出层计算复杂度极高的问题(传统 Softmax 需对词汇表中所有词计算概率,复杂度为 O (V),V 为词汇量)
- 原理:
- 用一棵哈夫曼树(Huffman Tree) 替代输出层的全连接结构,树的叶子节点对应词汇表中的每个词,非叶子节点为辅助节点(隐含参数)。
- 将 “预测中心词(或上下文词)” 的多分类问题,转化为 “从根节点到目标词叶子节点的路径上一系列二分类问题”。
- 每个二分类用 sigmoid 函数计算概率,最终目标词的概率为路径上所有二分类概率的乘积
- 优势:
- 计算复杂度从 O (V) 降至 O (logV)(哈夫曼树的深度与词汇量的对数成正比),大幅提升训练效率。
- 对低频词更友好:哈夫曼树中低频词的路径更长,能获得更多训练更新,缓解低频词表示质量差的问题。
2.子采样(Subsampling)
- 核心目标:减少高频噪声词对词向量质量的干扰,提升训练效率
- 原理:高频词(如 “the”“a”“的” 等)在语料中出现频繁,但携带的上下文信息有限,过多参与训练会浪费计算资源,还可能稀释低频词的有效信号。
- 优势:减少高频词的训练次数,降低计算量,同时增强低频词在训练中的权重,提升整体词向量的区分度
3.负采样(Negative Sampling)
- 随机采样噪声词进行二元分类,大幅降低计算量,特别适合超大规模语料训练。
五、代码简单实现(仅入门)
1、导入库和句子
from gensim.models import Word2Vec
sentences = [
["猫", "狗", "动物"],
["苹果", "香蕉", "水果"],
["猫", "喜欢", "鱼"],
["狗", "喜欢", "肉"],
["苹果", "甜"],
["香蕉", "甜"]
]
2、训练Word2Vec模型(CBOW和skip-gram)
CBOW_model = Word2Vec(
sentences, #训练数据
vector_size =5, #小维度
window =2, #上下文窗口
min_count=1,#不忽略任何词
epochs=50,#训练轮次
sg=0 #CBOW,默认
)
skip_gram_model = Word2Vec(
sentences, #训练数据
vector_size =5, #小维度
window =2, #上下文窗口
min_count=1,#不忽略任何词
epochs=50,#训练轮次
sg=1 #Skip-gram
)
3、核心功能展示
#任取一个模型,两者一致
print("词汇表:", list(CBOW_model.wv.key_to_index.keys()))
# 查看词向量(词语的数值表示)
print("\n'猫'的向量:", CBOW_model.wv["猫"])
词汇表: ['甜', '喜欢', '香蕉', '苹果', '狗', '猫', '肉', '鱼', '水果', '动物']
'猫'的向量: [-0.06826165 -0.01865634 0.11536507 -0.15057638 -0.07893223]
4、CBOW对比Skip-gram架构
数据集小,无差异,忽略结果,只关注用法
print("\nCBOW中与'猫'相似的词:", [w[0] for w in CBOW_model.wv.most_similar("猫")])
print("\nSkip-gram中与'猫'相似的词:", [w[0] for w in skip_gram_model.wv.most_similar("猫")])
CBOW中与'猫'相似的词: ['肉', '喜欢', '苹果', '水果', '甜', '动物', '鱼', '狗', '香蕉']
Skip-gram中与'猫'相似的词: ['肉', '喜欢', '苹果', '水果', '甜', '动物', '鱼', '狗', '香蕉']