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

LSTM模型损失异常且预测值恒定的技术求助

问题:LSTM模型预测结果全为恒定值

数据集与预处理代码

数据集包含597515行、31列,用于测量单个变量,输入形状为(31,1),预处理代码如下:

import pandas as pd
import tensorflow as tf

gpu_devices = tf.config.experimental.list_physical_devices("GPU")
for device in gpu_devices:
    tf.config.experimental.set_memory_growth(device, True)

raw_dataset = pd.read_csv('data.csv').drop(columns=['Unnamed: 0'])
train_set = raw_dataset.sample(frac=0.8, random_state=42)
test_set = raw_dataset.drop(train_set.index)

import numpy as np

train_features = train_set.copy()
test_features = test_set.copy()

train_labels = train_features.pop('T+1')
test_labels = test_features.pop('T+1')
train_features = train_features.to_numpy().reshape(train_features.shape[0], 31, 1)
test_features = test_features.to_numpy().reshape(test_features.shape[0], 31, 1)

模型结构(Optuna调参)

模型参数由Optuna确定,但不同配置均出现相同现象,仅恒定值有差异:

model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(11,return_sequences=True))
model.add(tf.keras.layers.LSTM(4, return_sequences=True))
model.add(tf.keras.layers.LSTM(13, return_sequences=False))
model.add(tf.keras.layers.Dense(1))
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.0940840143887362),
                loss=tf.keras.losses.MeanAbsoluteError(),
                metrics=['mae', 'mse']
                )
history = model.fit(train_features,
                    train_labels,
                    validation_split=0.2,
                    batch_size=65536,
                    epochs=100,
                    verbose=True
                    )

问题现象

  1. 训练损失图:
    损失图

  2. 预测结果全部为恒定值:

array([[-9.407474],
       [-9.407474],
       [-9.407474],
       ...,
       [-9.407474],
       [-9.407474],
       [-9.407474]], dtype=float32)
  1. 前50个测试标签与预测值对比图:
    预测值与标签对比图

解决建议

1. 补充数据归一化/标准化

LSTM对数据尺度极度敏感,未归一化的特征会让模型极易陷入局部最优,直接输出标签均值这类恒定值。建议用标准化工具处理特征和标签:

from sklearn.preprocessing import StandardScaler

# 特征归一化(训练集拟合,测试集复用参数)
scaler_feat = StandardScaler()
train_feat_scaled = scaler_feat.fit_transform(train_features.reshape(-1, 31)).reshape(-1, 31, 1)
test_feat_scaled = scaler_feat.transform(test_features.reshape(-1, 31)).reshape(-1, 31, 1)

# 标签归一化(回归任务需还原时用逆变换)
scaler_label = StandardScaler()
train_label_scaled = scaler_label.fit_transform(train_labels.values.reshape(-1,1))

训练时使用归一化后的数据,预测后通过scaler_label.inverse_transform()还原真实值。

2. 降低学习率

当前学习率0.094远高于Adam默认的0.001,过大的学习率会导致参数更新幅度过大,模型无法收敛到有效解,直接输出恒定值。先把学习率降到0.001,再根据训练曲线微调。

3. 缩小批量大小

65536的batch_size过大,会导致梯度估计偏差严重,模型难以捕捉数据中的模式,最终收敛到最简单的恒定输出。先尝试将batch_size调整到256或512,观察训练过程的损失变化。

4. 简化模型结构

三层LSTM叠加容易引发梯度消失,尤其是中间层仅4个单元的配置。先尝试简化结构:

  • 只用一层LSTM(比如32个单元)测试效果
  • 在LSTM层后添加tf.keras.layers.Dropout(0.2)抑制过拟合

5. 检查标签分布

查看训练集标签T+1的统计信息:

print(train_labels.describe())

如果标签本身集中在-9.4左右,模型会直接输出均值来最小化MAE损失,这种情况需要重新审视任务合理性或数据预处理逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:47:39