从零掌握NLP核心:词向量、SVD分解与Word2Vec全解析
2025.09.26 18:40浏览量:15简介:本文详细解析NLP领域中词向量的核心概念,涵盖统计共现矩阵、SVD分解的数学原理及其局限性,深入讲解Word2Vec两种训练模型(Skip-Gram与CBOW)的实现细节与优化技巧,结合PyTorch代码示例帮助读者快速上手。
从零掌握NLP核心:词向量、SVD分解与Word2Vec全解析
一、词向量:自然语言处理的基石
1.1 什么是词向量?
词向量(Word Embedding)是将离散的单词映射到连续向量空间的技术,其核心目标是通过数学表示捕捉词语的语义和语法关系。例如,”king”与”queen”在向量空间中应具有相似的方向,而”dog”与”cat”则应靠近彼此。
关键特性:
- 维度通常为50-300维,远低于原始词汇表大小
- 相似词在向量空间中距离近(如余弦相似度)
- 支持向量运算(如”king”-“man”+”woman”≈”queen”)
1.2 统计共现矩阵(基础方法)
传统方法通过统计词语共现次数构建矩阵:
import numpy as np
from collections import defaultdict
# 示例语料库
corpus = [
"I love natural language processing",
"I enjoy deep learning",
"Word vectors are powerful"
]
# 构建共现矩阵
vocab = set(" ".join(corpus).split())
word2idx = {word: idx for idx, word in enumerate(vocab)}
co_matrix = np.zeros((len(vocab), len(vocab)))
window_size = 2
for sentence in corpus:
words = sentence.split()
for i, word in enumerate(words):
for j in range(max(0, i-window_size), min(len(words), i+window_size+1)):
if i != j:
co_matrix[word2idx[word], word2idx[words[j]]] += 1
问题:矩阵维度高(V×V,V为词汇量),存在稀疏性问题。
二、SVD分解:降维与语义提取
2.1 奇异值分解原理
对共现矩阵X(m×n)进行分解:
X = UΣVᵀ
其中:
- U:左奇异向量(词-主题矩阵)
- Σ:对角矩阵(奇异值,按降序排列)
- Vᵀ:右奇异向量(上下文-主题矩阵)
实现步骤:
from scipy.linalg import svd
# 对共现矩阵进行SVD
U, S, Vt = svd(co_matrix, full_matrices=False)
# 取前k个维度进行降维
k = 2 # 示例维度
word_vectors = U[:, :k] * S[:k] # 缩放后的词向量
2.2 SVD的局限性
- 计算复杂度高:O(mn²)或O(m²n)
- 新词处理困难:无法动态扩展词汇表
- 全局统计依赖:无法捕捉词语的多义性(如”apple”作为公司名与水果)
- 稀疏矩阵问题:零值过多导致分解不稳定
三、Word2Vec:神经网络时代的突破
3.1 核心思想
通过预测上下文(Skip-Gram)或预测中心词(CBOW)的方式,利用神经网络学习词向量。其损失函数采用负采样(Negative Sampling)加速训练。
3.2 Skip-Gram模型详解
目标:给定中心词wₜ,预测上下文词w_{t±c}
import torch
import torch.nn as nn
import torch.optim as optim
class SkipGram(nn.Module):
def __init__(self, vocab_size, embedding_dim):
super().__init__()
self.embeddings = nn.Embedding(vocab_size, embedding_dim)
self.linear = nn.Linear(embedding_dim, vocab_size)
def forward(self, center_word):
# center_word: [batch_size]
emb = self.embeddings(center_word) # [batch_size, embedding_dim]
out = self.linear(emb) # [batch_size, vocab_size]
return out
# 训练参数
vocab_size = 10000
embedding_dim = 100
batch_size = 64
learning_rate = 0.01
model = SkipGram(vocab_size, embedding_dim)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# 模拟训练循环
for epoch in range(10):
# 假设input_words和target_words是批处理数据
input_words = torch.randint(0, vocab_size, (batch_size,))
target_words = torch.randint(0, vocab_size, (batch_size,))
optimizer.zero_grad()
outputs = model(input_words)
loss = criterion(outputs, target_words)
loss.backward()
optimizer.step()
if epoch % 1 == 0:
print(f'Epoch {epoch}, Loss: {loss.item():.4f}')
3.3 CBOW模型对比
特性 | Skip-Gram | CBOW |
---|---|---|
输入 | 中心词 | 上下文词平均 |
输出 | 上下文词概率分布 | 中心词概率分布 |
数据效率 | 较低(每个上下文单独处理) | 较高(上下文共同预测) |
适合场景 | 小数据集/罕见词 | 大数据集/高频词 |
3.4 负采样优化
传统softmax计算复杂度为O(V),负采样将其降为O(K),其中K为负样本数(通常5-20):
def negative_sampling_loss(emb_center, emb_context, true_labels, negative_samples):
# emb_center: [batch_size, emb_dim]
# emb_context: [batch_size, emb_dim]
# true_labels: [batch_size] (1 for positive, 0 for negative)
# negative_samples: [batch_size, num_neg]
# 正样本得分
pos_score = torch.sum(emb_center * emb_context, dim=1)
# 负样本得分
neg_emb = model.embeddings(negative_samples) # [batch_size, num_neg, emb_dim]
neg_score = torch.bmm(emb_context.unsqueeze(1), neg_emb.transpose(1,2)).squeeze(1) # [batch_size, num_neg]
# 组合得分
logits = torch.cat([pos_score.unsqueeze(1), neg_score], dim=1) # [batch_size, 1+num_neg]
labels = torch.zeros(batch_size, dtype=torch.long, device=emb_center.device)
return criterion(logits, labels)
四、实践建议与进阶方向
4.1 参数调优指南
- 向量维度:50-100维适合小型任务,300维为通用选择
- 窗口大小:短文本用2-5,长文本可扩大至10
- 负样本数:5-20个平衡效果与速度
- 子采样:对高频词(如停用词)进行降采样(threshold=1e-5)
4.2 预训练词向量资源
- 中文:腾讯AI Lab嵌入、中文Wiki2Vec
- 英文:GloVe(Stanford)、FastText(Facebook)
- 多语言:LASER(Facebook)、MUSE(Facebook)
4.3 扩展应用场景
五、常见问题解答
Q1:Word2Vec与GloVe有何区别?
A:Word2Vec基于局部上下文预测,GloVe结合全局统计与局部上下文窗口,通常GloVe在词类比任务上表现更好。
Q2:如何处理未登录词(OOV)?
A:可采用字符级CNN、FastText的子词单元,或使用BPE等子词分词方法。
Q3:词向量质量如何评估?
A:常用内在评估(词类比任务)和外在评估(下游任务性能),推荐使用Google的analogical evaluation dataset。
六、总结与展望
词向量技术经历了从统计共现矩阵到神经网络模型的演进,Word2Vec通过负采样和层次softmax解决了传统方法的计算瓶颈。未来发展方向包括:
- 上下文相关词向量:如ELMo、BERT等动态表示
- 低资源语言支持:跨语言词向量对齐
- 高效训练算法:分布式与量化训练
建议读者从Word2Vec入手,逐步掌握更复杂的上下文嵌入模型,为NLP任务打下坚实基础。
发表评论
登录后可评论,请前往 登录 或 注册