logo

从零掌握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 统计共现矩阵(基础方法)

传统方法通过统计词语共现次数构建矩阵:

  1. import numpy as np
  2. from collections import defaultdict
  3. # 示例语料库
  4. corpus = [
  5. "I love natural language processing",
  6. "I enjoy deep learning",
  7. "Word vectors are powerful"
  8. ]
  9. # 构建共现矩阵
  10. vocab = set(" ".join(corpus).split())
  11. word2idx = {word: idx for idx, word in enumerate(vocab)}
  12. co_matrix = np.zeros((len(vocab), len(vocab)))
  13. window_size = 2
  14. for sentence in corpus:
  15. words = sentence.split()
  16. for i, word in enumerate(words):
  17. for j in range(max(0, i-window_size), min(len(words), i+window_size+1)):
  18. if i != j:
  19. co_matrix[word2idx[word], word2idx[words[j]]] += 1

问题:矩阵维度高(V×V,V为词汇量),存在稀疏性问题。

二、SVD分解:降维与语义提取

2.1 奇异值分解原理

对共现矩阵X(m×n)进行分解:
X = UΣVᵀ
其中:

  • U:左奇异向量(词-主题矩阵)
  • Σ:对角矩阵(奇异值,按降序排列)
  • Vᵀ:右奇异向量(上下文-主题矩阵)

实现步骤

  1. from scipy.linalg import svd
  2. # 对共现矩阵进行SVD
  3. U, S, Vt = svd(co_matrix, full_matrices=False)
  4. # 取前k个维度进行降维
  5. k = 2 # 示例维度
  6. word_vectors = U[:, :k] * S[:k] # 缩放后的词向量

2.2 SVD的局限性

  1. 计算复杂度高:O(mn²)或O(m²n)
  2. 新词处理困难:无法动态扩展词汇表
  3. 全局统计依赖:无法捕捉词语的多义性(如”apple”作为公司名与水果)
  4. 稀疏矩阵问题:零值过多导致分解不稳定

三、Word2Vec:神经网络时代的突破

3.1 核心思想

通过预测上下文(Skip-Gram)或预测中心词(CBOW)的方式,利用神经网络学习词向量。其损失函数采用负采样(Negative Sampling)加速训练。

3.2 Skip-Gram模型详解

目标:给定中心词wₜ,预测上下文词w_{t±c}

  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. class SkipGram(nn.Module):
  5. def __init__(self, vocab_size, embedding_dim):
  6. super().__init__()
  7. self.embeddings = nn.Embedding(vocab_size, embedding_dim)
  8. self.linear = nn.Linear(embedding_dim, vocab_size)
  9. def forward(self, center_word):
  10. # center_word: [batch_size]
  11. emb = self.embeddings(center_word) # [batch_size, embedding_dim]
  12. out = self.linear(emb) # [batch_size, vocab_size]
  13. return out
  14. # 训练参数
  15. vocab_size = 10000
  16. embedding_dim = 100
  17. batch_size = 64
  18. learning_rate = 0.01
  19. model = SkipGram(vocab_size, embedding_dim)
  20. criterion = nn.CrossEntropyLoss()
  21. optimizer = optim.SGD(model.parameters(), lr=learning_rate)
  22. # 模拟训练循环
  23. for epoch in range(10):
  24. # 假设input_words和target_words是批处理数据
  25. input_words = torch.randint(0, vocab_size, (batch_size,))
  26. target_words = torch.randint(0, vocab_size, (batch_size,))
  27. optimizer.zero_grad()
  28. outputs = model(input_words)
  29. loss = criterion(outputs, target_words)
  30. loss.backward()
  31. optimizer.step()
  32. if epoch % 1 == 0:
  33. print(f'Epoch {epoch}, Loss: {loss.item():.4f}')

3.3 CBOW模型对比

特性 Skip-Gram CBOW
输入 中心词 上下文词平均
输出 上下文词概率分布 中心词概率分布
数据效率 较低(每个上下文单独处理) 较高(上下文共同预测)
适合场景 小数据集/罕见词 大数据集/高频词

3.4 负采样优化

传统softmax计算复杂度为O(V),负采样将其降为O(K),其中K为负样本数(通常5-20):

  1. def negative_sampling_loss(emb_center, emb_context, true_labels, negative_samples):
  2. # emb_center: [batch_size, emb_dim]
  3. # emb_context: [batch_size, emb_dim]
  4. # true_labels: [batch_size] (1 for positive, 0 for negative)
  5. # negative_samples: [batch_size, num_neg]
  6. # 正样本得分
  7. pos_score = torch.sum(emb_center * emb_context, dim=1)
  8. # 负样本得分
  9. neg_emb = model.embeddings(negative_samples) # [batch_size, num_neg, emb_dim]
  10. neg_score = torch.bmm(emb_context.unsqueeze(1), neg_emb.transpose(1,2)).squeeze(1) # [batch_size, num_neg]
  11. # 组合得分
  12. logits = torch.cat([pos_score.unsqueeze(1), neg_score], dim=1) # [batch_size, 1+num_neg]
  13. labels = torch.zeros(batch_size, dtype=torch.long, device=emb_center.device)
  14. return criterion(logits, labels)

四、实践建议与进阶方向

4.1 参数调优指南

  1. 向量维度:50-100维适合小型任务,300维为通用选择
  2. 窗口大小:短文本用2-5,长文本可扩大至10
  3. 负样本数:5-20个平衡效果与速度
  4. 子采样:对高频词(如停用词)进行降采样(threshold=1e-5)

4.2 预训练词向量资源

  • 中文:腾讯AI Lab嵌入、中文Wiki2Vec
  • 英文:GloVe(Stanford)、FastText(Facebook)
  • 多语言:LASER(Facebook)、MUSE(Facebook)

4.3 扩展应用场景

  1. 词义消歧:通过聚类区分多义词
  2. 文本分类:用词向量平均值作为文档表示
  3. 机器翻译:构建跨语言词向量空间
  4. 推荐系统:计算用户兴趣与物品描述的相似度

五、常见问题解答

Q1:Word2Vec与GloVe有何区别?
A:Word2Vec基于局部上下文预测,GloVe结合全局统计与局部上下文窗口,通常GloVe在词类比任务上表现更好。

Q2:如何处理未登录词(OOV)?
A:可采用字符级CNN、FastText的子词单元,或使用BPE等子词分词方法。

Q3:词向量质量如何评估?
A:常用内在评估(词类比任务)和外在评估(下游任务性能),推荐使用Google的analogical evaluation dataset

六、总结与展望

词向量技术经历了从统计共现矩阵到神经网络模型的演进,Word2Vec通过负采样和层次softmax解决了传统方法的计算瓶颈。未来发展方向包括:

  1. 上下文相关词向量:如ELMo、BERT等动态表示
  2. 低资源语言支持:跨语言词向量对齐
  3. 高效训练算法:分布式与量化训练

建议读者从Word2Vec入手,逐步掌握更复杂的上下文嵌入模型,为NLP任务打下坚实基础。

相关文章推荐

发表评论