词向量--Embedding
词向量--Embedding
一、为什么还需要 Embedding
在学习了 One-Hot、Word2Vec 和 FastText 之后,会产生一个自然的疑问:
既然已经有训练好的词向量,为什么在深度学习模型中还要使用 Embedding?
在实际 NLP 任务中,词向量并不是独立存在的模块,而是需要与具体任务和模型一起训练。
Embedding 正是为了解决这一问题而出现的。
二、Embedding 的本质是什么
Embedding 并不是一种新的词向量算法,而是一种在神经网络中使用词向量的方式。
可以从两个角度来理解 Embedding:
-
从功能上看
Embedding 的作用是:把离散的词索引映射为连续的向量表示
-
从实现上看
Embedding 本质上是一个可训练的查表矩阵
假设词表大小为 V,词向量维度为 D,
那么 Embedding 层内部维护的是一个大小为 V × D 的矩阵。
三、Embedding 与 Word2Vec / FastText 的关系
在学习过程中,我逐渐理清了它们之间的关系:
- Word2Vec / FastText
- 是训练词向量的方法
- 通常是独立于具体任务进行训练
- Embedding
- 是模型中的一层
- 词向量作为参数,随任务训练不断更新
两者并不冲突,反而经常结合使用:
- Embedding 可以随机初始化
- 也可以加载 Word2Vec / FastText 的预训练向量作为初始值
四、为什么 Embedding 更适合实际任务
在真实 NLP 任务中,同一个词在不同上下文下可能具有不同含义。
静态词向量(如 Word2Vec)无法区分这种差异。
Embedding 的优势在于:
- 向量是为具体任务服务的
- 可以通过反向传播不断调整
- 能够逐步贴合任务需求
因此,Embedding 是深度学习 NLP 模型中不可或缺的组成部分。
五、使用 PyTorch 实现 Embedding
在实践中,我使用 PyTorch 的 nn.Embedding 来理解 Embedding 的具体行为。
1. 定义 Embedding 层
import torch
import torch.nn as nn
# 假设词表大小为 10,词向量维度为 5
embedding = nn.Embedding(num_embeddings=10, embedding_dim=5)
此时,Embedding 内部已经初始化了一个 10 × 5 的可训练矩阵。
2. 使用词索引获取向量
# 构造一个词索引张量
word_indices = torch.tensor([1, 3, 5])
# 获取对应的词向量
vectors = embedding(word_indices)
print("向量形状:", vectors.shape)
print(vectors)
输出结果说明:
- 输入是词索引
- 输出是对应的词向量
- 每个索引都会映射到一个低维稠密向量
3. Embedding 是如何被训练的
Embedding 层的参数并不是固定的,而是通过任务损失函数反向传播更新。
# 简单示例:计算一个假的损失并反向传播
loss = vectors.sum()
loss.backward()
# 查看梯度
print(embedding.weight.grad)
可以看到,Embedding 中的参数已经参与到了梯度计算中。
六、加载预训练词向量到 Embedding(理解层面)
在更复杂的任务中,常见做法是:
- 使用 Word2Vec / FastText 训练词向量
- 将其作为 Embedding 层的初始权重
- 在下游任务中继续微调
这种方式可以:
- 加快模型收敛
- 提升小数据集上的效果
- 融合通用语义与任务特性
七、Embedding 的局限性
虽然 Embedding 在深度学习中非常重要,但它本身仍然存在局限:
- 每个词仍然只有一个向量
- 无法区分不同上下文下的多义性
- 表达能力受限于模型结构
这些问题,最终推动了上下文相关词向量和预训练语言模型的发展。
八、小结
Embedding 并不是新的词向量算法,而是词向量在神经网络中的工程化落地形式。

浙公网安备 33010602011771号