nn.Embedding的num_embeddings必须等于词汇表大小(含特殊符号),embedding_dim是词向量维度,通常取50–1024,需权衡表达能力与过拟合风险。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

PyTorch 的 nn.Embedding 层不是“搭出来”的模块,而是直接实例化即可使用的可训练查找表。它不需手动写前向传播逻辑,核心在于正确准备索引输入、设置参数,并理解其背后的数据流。
明确两个关键参数怎么定
num_embeddings 就是词表大小——必须等于你构建的词汇字典中唯一 token 的总数(含特殊符号如 <pad>、<unk>)。常见错误是漏掉 padding 位,导致索引越界。比如词表含 9998 个词 + <pad>(索引 0)+ <unk>(索引 1),那 num_embeddings 必须设为 10000。
embedding_dim 是每个词向量的维度,没有固定公式,但有实用参考:小数据集(
- 新手建议从 100 开始试,后续根据验证集 loss 和准确率调整
- 注意:该值不影响训练速度,但显著影响显存占用(权重矩阵大小 = num_embeddings × embedding_dim)
文本到索引:三步不能跳
Embedding 层只认整数索引,不接受原始字符串。必须完成:分词 → 构建词表 → 映射索引。
- 英文统一转小写,避免 “Apple” 和 “apple” 被视为不同词
- 中文用
jieba分词,再统计频次;低频词(如出现 ≤2 次)应归入 <unk>,控制词表膨胀 - 始终为 padding 预留索引 0,并在
nn.Embedding中显式传入padding_idx=0,这样对应位置梯度归零,不参与更新
Embedding 层怎么用:一句话调用
它本质是一个函数:输入 shape 为 (batch_size, seq_len) 的长整型张量,输出 shape 为 (batch_size, seq_len, embedding_dim) 的浮点张量。
import torch import torch.nn as nn <h1>假设已构建好词表:vocab_size = 5000,想用128维向量</h1><p>emb_layer = nn.Embedding(num_embeddings=5000, embedding_dim=128, padding_idx=0)</p><h1>模拟一个 batch:2 句话,每句最长 10 个词(已 pad 对齐)</h1><p>indices = torch.tensor([[1, 5, 3, 0, 0], # 第一句:3个有效词 + 2个pad [7, 2, 9, 4, 0]]) # 第二句:4个有效词 + 1个pad</p><h1>直接调用,得到词向量</h1><p>vectors = emb_layer(indices) # shape: (2, 5, 128)
无需写 forward,不用初始化权重——PyTorch 默认用均匀分布初始化,且自动加入反向传播链。
训练中要注意的真实细节
Embedding 层权重会随训练更新,但某些场景需冻结或特殊处理:
- 若使用预训练词向量(如 GloVe),可用
emb_layer.weight.data.copy_(pretrained_tensor)加载,并设emb_layer.weight.requires_grad = False冻结 - 训练初期 embedding loss 下降慢?检查是否误将
padding_idx设错,导致 pad 位置参与梯度更新,污染整体学习信号 - 想观察词向量变化?打印
emb_layer.weight[0](<pad>)应始终为全 0;而emb_layer.weight[10](某个常见词)会在训练前后明显偏移


















