从One-Hot到Embedding:用torch.nn实现文本向量化的完整避坑指南
在自然语言处理领域,如何将离散的文本符号转化为连续的数值表示一直是核心挑战。传统One-Hot编码的局限性促使了Embedding技术的崛起,而PyTorch中的torch.nn.Embedding模块则为这一转换提供了高效实现。本文将深入解析从基础概念到实战优化的完整技术链条。
1. 文本表示演进:从One-Hot到分布式表示
One-Hot编码曾是处理类别数据的标准方法。假设我们有一个包含5个单词的词汇表:["我","爱","深度","学习","NLP"],其One-Hot表示如下:
import torch
vocab = {"我":0, "爱":1, "深度":2, "学习":3, "NLP":4}
one_hot = torch.eye(len(vocab))
print(one_hot)
输出:
tensor([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
这种表示方式存在三个致命缺陷:
- 维度灾难:词汇量增长直接导致维度爆炸
- 语义缺失:所有向量正交,无法表达词义关联
- 存储浪费:99%以上的元素为0,内存利用率极低
分布式表示通过低维稠密向量解决了这些问题。下表对比两种表示:
| 特性 | One-Hot编码 | Embedding表示 |
|---|---|---|
| 维度 | 词汇表大小 | 自定义(通常50-1024) |
| 语义表达 | 无 | 可学习语义关系 |
| 内存占用 | 极高 | 极低 |
| 计算效率 | 低 | 高 |
| 支持预训练 | 否 | 是 |
2. torch.nn.Embedding核心机制解析
PyTorch的Embedding层实质上是一个可训练的查询表:


3475

被折叠的 条评论
为什么被折叠?



