为何nn.Embedding多次运行输出不同?权重计算机制解析
关于nn.Embedding权重的常见疑问解答
1. 多次运行结果不同的原因
PyTorch的nn.Embedding层默认采用随机初始化权重,每次运行程序时,随机数生成器的初始种子不一致,导致初始化出的权重矩阵自然不同。如果需要固定结果,可在代码开头设置全局随机种子:
import torch torch.manual_seed(42) # 固定CPU随机种子 torch.cuda.manual_seed_all(42) # 使用GPU时需额外设置
2. 权重值的计算方式(初始化逻辑)
默认情况下,nn.Embedding的权重从均匀分布中随机采样,取值范围是[-sqrt(1/vocab_size), sqrt(1/vocab_size)]。你也可以手动指定初始化策略,比如改用正态分布加载预训练词嵌入。
3. 所用的公式/函数
默认初始化的核心逻辑可简化为以下伪代码:
import math bound = 1.0 / math.sqrt(vocab_size) weights = torch.empty(vocab_size, dim).uniform_(-bound, bound)
若需自定义初始化,可借助nn.init模块的工具函数修改权重,例如:
nn.init.normal_(self.embeddings.weight, mean=0, std=0.01)
4. 是否会使用softmax生成权重?
不会。nn.Embedding本质是一个静态查找表,权重矩阵直接存储每个词对应的嵌入向量,和softmax无关联。softmax通常用于分类任务的输出层计算概率分布,和词嵌入的初始化、查找过程无关。
内容的提问来源于stack exchange,提问作者Amit Vyas
相关产品推荐
相关产品推荐

