Word2Vec词嵌入技术和动态词嵌入技术
Word2Vec(Word to Vector)是 2013 年由 Google 团队提出的无监督词嵌入模型,是一种静态词嵌入技术,核心目标是将自然语言中的离散词汇映射为低维、稠密的实数向量(即 “词向量”),让向量空间的距离和方向能够反映词汇的语义关联(如 “国王” 与 “女王” 的向量差近似 “男人” 与 “女人” 的向量差)。它解决了传统文本表示(如 One-Hot 编码)“维度灾难” 和 “语义孤立” 的问题,成为 现代自然语言处理(NLP)的基础技术之一。
核心背景:为什么需要 Word2Vec?
在 Word2Vec 出现前,主流的文本表示方法存在明显缺陷,无法捕捉语义信息:
- One-Hot 编码:将每个词表示为长度等于词汇表大小的向量,仅对应词的位置为 1,其余为 0。
- 缺陷:维度极高(词汇表 10 万则向量长度 10 万)、稀疏性强,且无法体现词与词的语义关联(如 “猫” 和 “狗” 的向量点积为 0,无任何相似性)。
- Bag of Words(词袋模型):统计词在文本中的出现频率,忽略语序和语义。
- 缺陷:同样无法捕捉语义,且 “重要” 和 “不重要” 的词权重无差异(需依赖 TF-IDF 优化,但仍无语义关联)。
Word2Vec 的核心突破是:用低维向量的 “数值关系” 刻画词汇的 “语义关系”,例如:
- 向量计算:vec(国王) - vec(男人) + vec(女人) ≈ vec(女王)
式子变换一下可以这样理解:vec(国王) - vec(女王) ≈ vec(男人) - vec(女人)
- 相似性:cos( vec(猫), vec(狗) ) 的值远大于 cos( vec(猫), vec(汽车) )
Word2Vec 算法的两大核心模型(落地的实现技术)
Word2Vec 并非单一模型,而是包含两种互补的无监督学习架构,二者均基于 “上下文与目标词的共现关系”(即 “通过周围词预测中心词,或通过中心词预测周围词”)构建语义关联。
1. CBOW 模型(Continuous Bag of Words,连续词袋模型)
核心思想:用 “上下文词” 预测 “中心词”
例如句子 “我 爱 自然 语言 处理”,若以 “自然” 为中心词,上下文窗口(假设窗口大小为 2)为 “爱” 和 “语言”,CBOW 的任务是:输入 “爱” 和 “语言” 的向量,输出 “自然” 的概率。
模型结构(3 层神经网络)
- 输入层:上下文词的 One-Hot 向量(假设窗口大小为 2,共 2 个向量,每个长度为 V,V 为词汇表大小)。
- 隐藏层:对输入的上下文词向量取平均(或求和),得到一个长度为 N 的向量(N 为词向量维度,通常取 50-300),此层无激活函数。
- 输出层:Softmax 层,输出词汇表中每个词作为 “中心词” 的概率,目标是让真实中心词的概率最大。
特点
- 对小数据集更鲁棒:上下文词的平均操作能降低噪声影响。
- 训练速度更快:每次输入多个上下文词,对高频词的处理更高效。
2. Skip-gram 模型(跳字模型)
核心思想:用 “中心词” 预测 “上下文词”
仍以句子 “我 爱 自然 语言 处理” 为例,以 “自然” 为中心词,上下文窗口为 2,Skip-gram 的任务是:输入 “自然” 的向量,输出 “爱” 和 “语言” 的概率。
模型结构(3 层神经网络)
- 输入层:中心词的 One-Hot 向量(长度为 V)。
- 隐藏层:将输入向量与权重矩阵(V×N)相乘,得到长度为 N 的词向量,无激活函数(此向量即为最终的词嵌入结果)。
- 输出层:Softmax 层,输出词汇表中每个词作为 “上下文词” 的概率,目标是让真实上下文词的概率最大。
特点
- 对低频词更友好:能从少量低频词的共现中学习到更准确的语义(例如 “量子”“区块链” 等低频专业词)。
- 语义捕捉更精准:在大数据集上表现优于 CBOW,是 Word2Vec 中更常用的架构。
两种模型对比
关键优化:解决 Softmax 计算瓶颈
Word2Vec 的原始模型(尤其是输出层的 Softmax)存在严重的计算瓶颈:
Softmax 的概率计算需遍历整个词汇表(P(w_i) = exp(z_i) / Σ_{j=1 to V} exp(z_j))
,若词汇表大小 V=100 万,则每次预测需计算 100 万次指数和求和,训练效率极低。
为解决此问题,Word2Vec 引入了两种核心优化方法:
1. 负采样(Negative Sampling,NS)
核心思想:将 “多分类问题” 转化为 “二分类问题”
- 原始任务:判断 “中心词与上下文词是否为真实共现对”(需区分 V 个词,多分类)。
- 优化后任务:对1 个真实共现对(正样本) 和K 个随机采样的非共现对(负样本) ,训练模型区分 “正 / 负样本”(二分类)。
具体步骤
- 对当前中心词 w 和上下文词 c,标记为正样本((w,c) 是真实共现对)。
- 从词汇表中随机采样 K 个词(通常 K=5-20),确保这些词与 w 无共现关系,标记为负样本((w,c1), (w,c2), …, (w,cK))。
- 用 Sigmoid 函数替代 Softmax,计算每个样本的 “正例概率”,目标是让正样本概率接近 1,负样本概率接近 0。
优势
- 计算量从 O (V) 降至 O (K),K 远小于 V(如 V=100 万,K=10),训练速度提升 10 万倍。
- 负样本采样遵循 “高频词更易被采样” 的原则(用
P(w) ∝ f(w)^0.75
,f (w) 为词的频率),更符合真实语言规律。
2. 层次 Softmax(Hierarchical Softmax)
核心思想:用 “二叉树” 替代 “全连接 Softmax”
将词汇表中的所有词作为二叉树的叶子节点,每个非叶子节点代表一个二分类决策(左子树为 “0”,右子树为 “1”)。从根节点到叶子节点的路径,对应该词的 “概率计算路径”。
具体步骤
- 构建一棵哈夫曼树(Huffman Tree):高频词的路径更短,低频词的路径更长,减少整体计算量。
- 计算词 w 的概率时,无需遍历所有叶子节点,只需沿根节点到 w 的路径,计算每个非叶子节点的二分类概率(用 Sigmoid 函数),最终概率为路径上所有概率的乘积。
优势
- 计算量从 O (V) 降至 O (logV)(哈夫曼树的深度为 log2V),适合高频词占比高的场景。
- 无需采样负样本,避免负样本选择带来的误差。
四、训练过程与超参数
五、优缺点与应用场景
六、与其他词嵌入技术的对比
七、实践工具与代码示例
2. Gensim 实现 Word2Vec 示例
from gensim.models import Word2Vec
from gensim.utils import simple_preprocess# 1. 准备语料(需先分词,此处用simple_preprocess简单分词)
corpus = ["自然语言处理是人工智能的重要分支","Word2Vec是常用的词嵌入技术","深度学习在NLP领域有广泛应用","词向量可以捕捉词汇的语义关联"
]
# 分词:将每个句子拆分为词列表
sentences = [simple_preprocess(text, deacc=True) for text in corpus]
# 结果:[['自然语言处理', '是', '人工智能', '的', '重要', '分支'], ...]# 2. 训练Word2Vec模型
model = Word2Vec(sentences=sentences, # 分词后的句子列表vector_size=100, # 词向量维度window=5, # 窗口大小min_count=1, # 最小词频(此处语料小,设为1)workers=4, # 并行训练的线程数sg=1, # 1=Skip-gram,0=CBOWnegative=5 # 负采样数量
)# 3. 模型应用
# 获取词向量
vec_nlp = model.wv["自然语言处理"] # 输出:(100,)的numpy数组# 计算词相似度
sim = model.wv.similarity("自然语言处理", "NLP") # 输出相似度值# 查找最相似的词
similar_words = model.wv.most_similar("人工智能", topn=3) # 输出Top3相似词# 保存/加载模型
model.save("word2vec.model")
loaded_model = Word2Vec.load("word2vec.model")
总结
Word2Vec 通过 “局部共现 + 低维向量” 的核心思路,首次实现了 “语义可计算”,为现代 NLP 奠定了基础。尽管其静态词向量的缺陷被 ELMo、BERT 等动态模型弥补,但由于其速度快、轻量、易理解的特点,至今仍在中小规模数据集、低资源场景中广泛应用。理解 Word2Vec 的原理(CBOW/Skip-gram、负采样),是掌握更复杂预训练模型(如 BERT)的关键前提。