nn.Embedding与nn.Linear独热输入等价性及报错问题咨询
独热向量输入下nn.Embedding与nn.Linear的等价性分析
实验背景与过程
我想要理解当输入为独热向量时,nn.Embedding与nn.Linear的工作机制是否等价。以对应索引3的独热向量[0,0,0,1,0,0]为例,进行了如下实验:
1. nn.Embedding测试
创建索引张量_index = torch.LongTensor([3]),自定义权重customEmb为6×4的float张量,设置给nn.Embedding后,输入_index得到了预期的对应行结果[4., 4., 4., 4.]。
2. nn.Linear测试问题记录
- 当设置
customEmb为long类型并转置后作为nn.Linear的权重,报错:Only Tensors of floating point and complex dtype can require gradients; - 将
customEmb改为float类型后,输入long类型的独热向量_in,报错:expected scalar type Long but found Float; - 把
_in和customEmb都转为float类型后,报错消失,但输出为tensor([3.6693, 4.3959, 3.9726, 4.3447]),而非预期的[4.,4.,4.,4.]。
疑问解答
Q1. 最初两次报错的原因是什么?
- 第一次报错:PyTorch中可训练权重必须是浮点或复数类型,反向传播的梯度计算依赖浮点运算,long类型张量无法支持梯度功能,因此用long类型的
customEmb作为nn.Linear权重会触发错误。 - 第二次报错:
nn.Linear要求输入张量与权重的dtype一致。当权重是float类型时,输入的long类型独热向量 dtype 不兼容,所以报错。
Q2. 我对nn.Linear输出的预期是否错误?
预期本身没错——当输入是对应索引3的独热向量时,nn.Linear的输出确实应该等于customEmb的第3行,但问题出在权重的设置方式上。
Q3. 为何转float后输出不符合预期?
问题出在两个操作细节:
nn.Linear的运算逻辑是y = x @ weight.T + bias(默认带偏置),你转置了customEmb作为权重,导致矩阵乘法的维度匹配错误;- 默认开启的偏置会添加随机初始化的偏置值,直接改变了输出结果。
正确的操作应该是:将未转置的customEmb作为nn.Linear的weight参数(in_features=6,out_features=4),同时设置bias=False关闭偏置,这样输入独热向量[0,0,0,1,0,0]时,输出就会和nn.Embedding的结果一致。
内容的提问来源于stack exchange,提问作者MsA
相关产品推荐
相关产品推荐

