PyTorch双向LSTM新闻标题情感分析损失停滞嵌入层问题咨询
问题诊断与解决方案
核心问题定位
你遇到的训练损失停滞问题完全是由嵌入层的错误处理逻辑导致的,具体问题如下:
- PyTorch的
nn.Embedding层设计为直接接收词索引整数张量作为输入,不需要提前做独热编码。输入形状为(批次大小, 序列长度)时,输出自动为(批次大小, 序列长度, 嵌入维度),刚好符合你预期的(10, 30, 100)形状。 - 你给嵌入层传入了形状为
(10, 30, 5745)的独热编码张量,嵌入层会把最后一维的5745个值全部当成词索引查表,所以输出才会多出一维变成(10, 30, 5745, 100),这个输出本身就不具备正确的语义特征。 - 后续添加的
torch.max(embeddings, dim=2)逻辑完全错误:独热编码只有一个位置为1,其余为0,相当于你查了5745个词的嵌入向量后取最大值,最终得到的张量根本不是对应位置词的正确嵌入。模型拿错误特征训练自然无法收敛,损失长期维持在0.6-0.7刚好是二分类随机猜测的损失水平(ln2≈0.693),和问题表现完全吻合。
修复步骤
- 删除训练代码中独热编码的调用行,即删掉
x = one_hot_encode(x, vocab),one_hot_encode函数整个可以废弃。 - 删除模型
forward方法中如下两行错误代码:
embeddings = torch.max(embeddings, dim=2) embeddings = embeddings[0].type(torch.cuda.FloatTensor)
- 直接把
batches输出的形状为(10, 30)的词索引张量,转成torch张量后移到CUDA设备,直接喂入模型即可,此时嵌入层输出会自动为你需要的(10, 30, 100)形状。
修改完成后可以在forward中打印embeddings.shape确认输出符合预期,重新训练后损失会正常下降。
内容的提问来源于stack exchange,提问作者pete
相关产品推荐
相关产品推荐

