You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch多变量多对多LSTM时序预测训练损失上升问题求助

问题排查及解决方案

1. 隐状态初始化错误

你当前用torch.randn随机初始化LSTM的隐状态和细胞态,会导致每次前向传播的初始状态随机波动,相同输入得到的输出不稳定,模型无法学习到稳定的时序规律,是损失异常波动的核心原因之一。

  • 修正方案:将init_hidden方法中的随机初始化改为全零初始化:
def init_hidden(self, batch_size):
    hidden_state = torch.zeros(self.n_layers,batch_size,self.n_hidden)
    cell_state = torch.zeros(self.n_layers,batch_size,self.n_hidden)
    self.hidden = (hidden_state, cell_state)

2. 多对多预测的输出头维度不匹配

你当前的实现是把LSTM输出的所有时间步特征拉平后映射为5维向量,输出维度是(batch_size, 5),属于多对一预测结构,完全不符合多对多预测要求。如果你的标签y维度是(batch_size, seq_len, 5)(每个时间步对应5个特征的预测值),损失计算时会触发广播机制,用同一个5维输出和所有时间步的标签计算误差,完全偏离训练目标,自然无法收敛。

  • 修正方案:修改全连接层结构,对每个时间步的LSTM输出单独做特征映射:
# 初始化部分修改
self.l_linear = torch.nn.Linear(self.n_hidden, 5)

# 前向传播部分修改
def forward(self, x):        
    batch_size, seq_len, _ = x.size()
    lstm_out, self.hidden = self.l_lstm(x,self.hidden)
    # lstm_out形状是(batch, seq_len, hidden_size),直接对最后一维做映射
    return self.l_linear(lstm_out)

同时请确认你的split_sequences函数生成的标签y维度为(总样本数, 预测时间步长, 5),和模型输出维度匹配。

3. 损失统计逻辑错误

你当前只打印每轮训练最后一个batch的损失,无法反映整轮训练的平均损失水平,你看到的损失上升大概率只是单个batch的随机波动,不是整体训练效果的体现。

  • 修正方案:每轮累加所有batch的损失,最后打印平均损失:
mv_net.train()
for t in range(train_episodes):
    X, y = sklearn.utils.shuffle(X, y)
    total_loss = 0
    batch_count = 0
    for b in range(0,len(X),batch_size):
        inpt = X[b:b+batch_size,:,:]
        target = y[b:b+batch_size,:]    

        x_batch = torch.tensor(inpt,dtype=torch.float32)    
        y_batch = torch.tensor(target,dtype=torch.float32)

        mv_net.init_hidden(x_batch.size(0))
        optimizer.zero_grad() # 建议调整梯度清零顺序到反向传播前,避免历史梯度残留
        output = mv_net(x_batch) 
        loss = criterion(output, y_batch) 
        loss.backward()
        optimizer.step()  

        total_loss += loss.item()
        batch_count +=1
    print('epoch : ' , t , 'avg_loss : ' , total_loss/batch_count)

4. 超参数调整建议

  • 当前学习率1e-4可以先调整为1e-3,LSTM训练初期通常可以用稍大的学习率加快收敛,后续如果出现震荡再下调
  • 训练轮次50偏少,可先提升到200轮观察收敛趋势
  • 如果后续隐层数量、堆叠层数提升后出现过拟合,可以在LSTM层设置dropout=0.2正则化

内容的提问来源于stack exchange,提问作者Deraam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 03:06:04