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

LSTM做多输出数值序列预测时高损失、过拟合问题求解

LSTM序列预测高损失、过拟合问题排查与优化方案

现有代码的核心错误

  • 输入维度重构逻辑错误
    你当前将输入reshape为(5850, 33, 1),相当于把33个输入特征强行按「步长33、单步特征数1」的时序格式喂给模型,完全违背LSTM的输入逻辑:如果33个特征是单个时间步下的多维度特征,正确输入维度应为(样本数, 1, 33);如果是长度为33的时序序列、单步对应1个特征,才需要保持(样本数, 33, 1)的维度,且要保证样本是严格按时间顺序排列、未被随机打乱。维度错误会直接导致LSTM无法学到有效特征关联,是损失居高不下的核心原因之一。
  • 模型结构设计不合理
    连续堆叠3层无激活函数的Dense(4)全连接层:线性层叠加无非线性变换时,本质等价于单个线性层,但参数量翻了3倍,只会放大过拟合风险,没有任何特征提取增益。同时LSTM层直接使用relu作为激活,容易出现循环权重梯度爆炸,训练稳定性远差于LSTM默认的tanh激活。
  • 训练配置存在明显疏漏
    • 学习率设置过高:Adam优化器默认最优初始学习率为0.001,直接设置为0.01很容易导致参数更新在最优解附近震荡,甚至直接训崩,无法收敛到低损失区间
    • 早停逻辑未生效:你定义了EarlyStopping回调,但在调用model.fit()时未传入callbacks参数,早停完全不生效,模型会持续训练直到完全过拟合
    • 评估指标选择错误:当前任务是数值回归任务,accuracy是分类任务专用指标,用它监控训练完全没有参考价值,无法判断模型真实收敛状态
    • 缺失特征缩放步骤:LSTM对输入特征的数值尺度非常敏感,如果33个输入特征、4个输出值的量纲差异较大,会直接导致梯度更新不稳定,损失难以下降

可直接落地的优化方案

  • 第一步:修正数据预处理逻辑
    1. 对输入X和输出y分别做标准化处理:仅用训练集的均值、标准差做缩放,避免验证集数据泄露,将所有特征、输出值缩放到均值为0、方差为1的区间,消除量纲影响
    2. 按实际数据格式修正输入reshape逻辑,对应调整LSTM层的input_shape参数
  • 第二步:重构带正则约束的模型结构
    去掉冗余全连接层,加入正则手段抑制过拟合,参考代码如下:
    import tensorflow as tf
    from tensorflow.keras import layers, Sequential
    from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau
    from tensorflow.keras.regularizers import L2
    
    # 示例:单时间步、33个特征的输入场景
    model = Sequential()
    model.add(layers.LSTM(
        units=32,
        activation='tanh', # 用LSTM默认tanh激活,训练更稳定
        recurrent_dropout=0.2, # 循环层加随机失活抑制过拟合
        kernel_regularizer=L2(1e-4), # 加L2权重正则,限制参数权重过大
        input_shape=(1, 33) # 如果是33步长单特征场景,改为(33, 1)
    ))
    model.add(layers.Dropout(0.2)) # 全连接层前加随机失活
    model.add(layers.Dense(4, kernel_regularizer=L2(1e-4))) # 仅保留1层输出层,无需叠加冗余线性层
    
  • 第三步:修正训练配置
    调整学习率、替换评估指标、补全回调逻辑,参考代码如下:
    model.compile(
        optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), # 初始学习率调回稳定默认值
        loss=tf.keras.losses.MeanSquaredError(),
        metrics=[tf.keras.metrics.MeanAbsoluteError()] # 回归任务用MAE作为监控指标,替换分类用的accuracy
    )
    
    # 配置回调:早停保留验证集最优权重,加学习率自动衰减
    callbacks = [
        EarlyStopping(
            monitor='val_loss',
            patience=15,
            restore_best_weights=True # 训练停止后自动加载验证集损失最低的权重,无需手动回滚
        ),
        ReduceLROnPlateau(
            monitor='val_loss',
            factor=0.5, # 损失停滞时学习率减半
            patience=5,
            min_lr=1e-6
        )
    ]
    
    # 启动训练,传入回调,显式设置batch_size保证训练稳定性
    history = model.fit(
        X, y,
        epochs=200,
        batch_size=32,
        verbose=1,
        validation_split=0.2, # 时序任务不要提前打乱数据,需按时间顺序拆分验证集
        callbacks=callbacks
    )
    
  • 额外调优方向:如果调整后仍存在明显过拟合,可以进一步缩减LSTM层神经元数量(比如从32降到16)、适当调高dropout比例,同时检查训练集与验证集的数值分布是否一致——如果验证集数据分布和训练集差异过大,无论怎么调整模型都会出现高损失、表观过拟合的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:03:22