实验四:LSTM模型训练优化与超参数调优

实验目的:

- 探索深度学习模型的超参数调优方法,理解超参数(如学习率、批大小、隐藏单元数、网络层数等)对模型训练动态和最终性能的影响。

- 学习通过实验试验和验证集评估来优化模型:掌握网格搜索、随机搜索等调参思路,在有限计算资源下找到提升模型精度的有效组合。

- 引入防止过拟合和提高泛化性能的技巧,如正则化(Dropout、L2权重衰减)和早停法,提高模型在未见数据上的鲁棒性。

- 借助可视化工具(如TensorBoard)监控不同参数下模型训练曲线, 训练学生分析和比较不同实验结果的能力。通过调优使模型预测误差进一步降低,朝满足误差<1°C目标迈进。

实验资源要求:

- 数据: 与实验三相同的训练集和验证/测试集。

- 软件环境: Python 3.x,PyTorch深度学习框架。可能需要额外的调参支持库,例如 Optuna 或 scikit-learn 的 GridSearchCV(若执行自动调参,可选)。TensorBoard或Matplotlib用于可视化训练过程比较。

- 计算环境: 高性能计算资源。调参需要多次训练模型,为节省时间,可并行或顺序尝试不同参数,建议在计算能力允许范围内一次只调整少量参数以评估影响。

实验时长: 約3小时

实验内容: 在获得初步可用的LSTM模型后,本实验将通过系统的优化和调参提升模型表现。首先,指导学生确定需要调优的主要超参数:学习率决定梯度更新步幅,是影响训练收敛和最终性能的关键参数;隐藏单元数和LSTM层数决定模型容量,需平衡欠拟合与过拟合;批大小影响梯度估计噪声和训练速度;序列长度窗口(如实验三中设定的T)也可能影响模型对依赖的捕捉。还有正则化系数(如L2惩罚项权重)和Dropout率等。这些超参数空间庞大,不可能穷举所有组合,因此本实验将采取分步调优策略:固定某些参数,集中考察其中一两个对性能影响,逐步逼近较优解。

图1 学习率对比(同图显示 train/val 曲线,便于观察收敛速度与震荡)

实验开始时,学生可先检查基线模型训练日志和曲线,分析是否存在学习率不当(如损失震荡或降不下),或模型容量不足/过剩的迹象(如训练误差远高于验证误差表示欠拟合,反之训练误差远低于验证且验证误差较高则过拟合)。基于这些观察确定初步调参方向。例如,如果基线训练收敛缓慢且最终精度不够,可考虑适当增大学习率;如果训练不稳定损失震荡,则减小学习率。又如验证集误差始终明显高于训练误差,考虑引入Dropout正则化抑制过拟合。

在明确思路后,学生将进行超参数试验。可采用手动调参结合网格搜索:例如选择学习率{1e-3, 5e-4, 1e-4}三档,隐藏单元数{50, 100}两档,组合形成6种配置依次训练模型(如时间不足也可仅尝试影响最大的参数)。每种配置训练若干epoch并记录最终验证集误差。为了效率,可以将epoch数调少一些观察总体趋势,然后挑选最优的组合深入训练。实验过程中引导学生有条理地记录每次试验的参数值及结果,学会构建调参日志表。若具备条件,可以使用Optuna等工具自动搜索,但需确保理解其原理和结果评价方式。

图2 学习率对比(同图显示 train/val 曲线,便于观察收敛速度与震荡)

训练多个模型难免混乱,可借助TensorBoard等工具对比不同试验的学习曲线。学生可为每组参数设置不同的运行名,将损失曲线同时绘制在一张图上,以直观比较收敛快慢和最终水平。例如,可能发现学习率=0.001时初期下降快但最终震荡较大,而0.0005下降稍慢但最终验证损失更低更平稳,则后者更优。隐藏单元从50增至100可能降低误差但训练时间增加,也可能引入过拟合需配合正则。通过可视化手段,学生将深化对超参数影响的直观认识。

图3 地平线误差曲线(滚动多步 MAE 随 horizon 变化,基线 vs 调优)

在多轮试验后,确定一套相对最佳的超参数配置。例如:学习率0.0005,隐藏单元100,加入一层Dropout(p=0.2),两层LSTM堆叠等(假定调参结果指向这些值)。最后,使用最佳超参数配置重新训练模型。训练时可适当增加epoch数,让模型充分拟合。同时采用Early Stopping策略:监测验证集损失,如果超过若干epoch(如10次)未提升则提前停止训练,防止过拟合并节省时间。最终模型训练完成后,在验证集上应达到明显优于基线模型的误差水平。

然后在测试集上评估新模型性能,与实验三的基线结果对比。预计调整后的模型在整体误差上有下降,尤其针对之前发现的薄弱环节有所改善。例如,可能原模型在降温初期误差较大,通过增加序列长度和隐藏单元,模型捕捉到了初始陡降的模式,使得早期阶段预测更加准确。计算新的MAE、最大误差,看是否接近或达到1°C以内的目标。如果仍未完全达标,也应相比之前大幅改善。模型泛化性能亦需验证:确保并未通过调参过度拟合训练集,从验证/测试结果看,训练误差与验证误差接近且均降低,表明模型提升是真实有效的。

实验步骤:

1. 确定调优参数列表

目标: 明确待调超参的优先级候选集合/连续区间相互作用假设,形成“由粗到细”的搜索路线图。

操作清单

  • 优先级分层(P1/P2/P3):

    • P1(最优先):学习率 lr(对收敛与最终误差最敏感,先粗后细,建议对数网格);网络容量(hidden_size、num_layers)。

    • P2:正则化强度(weight_decay/L2)、dropout;序列窗口 T_in(影响可观测时长与输入维度)。

    • P3:batch_size、梯度裁剪阈值、学习率调度器类型与超参(如 Cosine/OneCycle 的峰值与周期)。

  • 候选空间与边界:

    • lr ∈ {1e-3, 5e-4, 1e-4}(首轮);若最优落在端点,次轮在其一侧加密(如 2e-3, 1e-3, 7e-4, 5e-4)。

    • hidden_size ∈ {50, 100}(若 100 显著更优且不过拟合,次轮可试 128/160);

    • num_layers ∈ {1, 2}(若 2 层带来验证反弹,保守回退到 1 层);

    • dropout ∈ {0.0, 0.2}(若明显过拟合,再加 0.3/0.4 做二次对比);

    • weight_decay ∈ {0, 1e-5, 5e-5}(与 dropout 互补,先单独评估再联动)。

  • 相互作用假设(待验证):

    • 大 hidden_size/多层通常需要更强正则(更高 dropout 或 weight_decay);

    • 更长 T_in 对 较小 lr 更友好(大 lr 易震荡);

    • 小 batch_size → 噪声更大 → 训练曲线抖动增加,可用更小 lr 或梯度裁剪稳定。

  • 实验预算约束: 设定总试验预算(如 24 次短训),并按 P1→P2→P3 分配名额(示例:P1 12 次,P2 8 次,P3 4 次)。

质量门控与验收

  • 每个超参给出闭区间或离散集合与调参方向假设;

  • 列出禁区(例如 lr>3e-3 训练不稳定、dropout>0.5 容量塌缩等);

  • 形成 search_plan.yaml(含优先级、候选值、预算、停止准则)。

产出物:search_plan.yaml、risk_assumptions.md(相互作用与风险假设)。

2. 设计实验方案

目标: 采用逐次网格搜索 + 缩放加密的策略,单/双因子递进,确保可归因与高性价比探索。

操作清单

  • 阶段 A(学习率扫描):固定(hidden_size=50, num_layers=1, dropout=0, weight_decay=0, batch_size=64, T_in=60),训练 N_warm=20 个 epoch:

    • 比较 val MSE 曲线形态(下降速率、是否震荡、尾段地板);

    • 记录 最佳 epoch(早停点)与泛化间隙(val_min - train_min)。

  • 阶段 B(容量微调):以 A 中最稳、最低 val MSE 的 lr* 为基准,扫描 hidden_size × num_layers:

    • 若 num_layers=2 带来改善,同时观测曲线是否出现过拟合反弹;

    • 若 hidden_size=100 改善有限但训练时间显著上升,倾向保守选择。

  • 阶段 C(正则化与 Dropout):在 (lr*, hidden*, layers*) 固定下,单因子或双因子试验:

    • 先单因子 dropout ∈ {0, 0.2, 0.3};

    • 再与 weight_decay ∈ {0, 1e-5, 5e-5} 组合做局部 2×3 小网格。

  • 阶段 D(必要时):T_in 与 batch_size 小幅扫描(T_in ∈ {45, 60, 90};batch_size ∈ {32, 64}),仅当阶段 B/C 仍难达目标时开启。

  • 停止准则与闸门

    • 若阶段 A/B 已在验证上显著优于基线(如 val MSE 降低 ≥15%),C/D 可缩减规模;

    • 若出现过拟合明显(泛化间隙扩大 ≥50%),优先加正则或回退容量,再继续。

质量门控与验收

  • 每轮只改变≤2 个因子;

  • 记录负例与失败训练(如发散/梯度爆炸)及应对;

  • 每阶段都有“进入下一阶段的闸门指标”(如 val MSE 相对改善阈值)。

产出物:phase_A_B_C_D_design.md、阶段性 runlist.csv(列出将要运行的配置)。

3. 执行调参试验

目标: 用短训对比快速收敛趋势,构建统一口径的日志与曲线,以供横向比较与溯源。

操作清单

  • 统一训练协议(短训版)

    • epoch=20(或 30),固定随机种子;关闭学习率调度器(避免混杂影响);启用梯度裁剪(如 1.0)。

    • 日志:每 epoch 记录 train_loss, val_loss, lr, grad_norm_p50/p95,以及早停候选点。

  • 可视化与对比

    • 同屏曲线:把不同 lr 的 train/val 曲线画在同一图(命名规则:run_name = lr-<val>_H-<size>_L-<layers>_p-<dropout>_wd-<wd>);

    • 热力图:以 val MSE min 为 Z 值,对 lr × hidden_size/dropout × wd 画热力图,便于肉眼锁定“洼地”。

  • 日志表结构(示例): run_id, lr, hidden, layers, dropout, wd, batch, T_in, epochs, val_mse_min, train_mse_min, gen_gap, best_epoch, status, notes

  • 趋势判读规则

    • 高 lr:初期下降快、后期震荡/反弹;

    • 低 lr:平滑但未触底;

    • 容量↑:训练更低、验证可能反弹;

    • 正则↑:验证更稳,但过大易欠拟合(训练与验证都高)。

  • 失败自愈:若某 run 出现发散/NaN,自动降 lr 一档并重试;若仍失败,记录入 status=fail.

质量门控与验收

  • 每个 run 均有完整行的指标记录与曲线;

  • gen_gap(验证-训练)在可接受范围(例如 <0.05)或有正则解释;

  • 前 12 名(val_mse_min 最低)进入候选池。

产出物:tuning_trial_log.csv、curves/*.png、heatmaps/*.png、failures.log.

4. 选择最佳参数组合

目标: 在多个候选间做稳健决策,避免只盯住单次最小值,兼顾方差与可复现。

操作清单

  • Top-K 重复试验:对 val_mse_min 最好的 K=3~5 个配置重复 3 次(不同随机种子),统计均值±标准差。

  • 加权评分(示例):

score=MSE 均值正则化+λσMSE稳定性成本+μgengap过拟合罚项score=MSE~均值正则化+λσMSE稳定性成本+μgen_gap过拟合罚项score=MSE~均值正则化+λ⋅σMSE稳定性成本+μ⋅gen_gap过拟合罚项\text{score} = \underbrace{\tilde{MSE}}_{\text{均值正则化}} + \lambda\cdot \underbrace{\sigma_{\text{MSE}}}_{\text{稳定性成本}} + \mu \cdot \underbrace{\text{gen\_gap}}_{\text{过拟合罚项}}

其中 λ,μλ,μλ,μ\lambda,\mu 可取 0.5/1.0 量级。

  • 复杂度与收益权衡:若两配置 score 相近,优先选层数更少/参数更少的一方(便于后续扩展与部署)。

  • 失败情景的排除:剔除在任一复现实验中出现发散/异常的配置。

  • 最终锁定:给出 cfg* = {lr*, hidden*, layers*, dropout*, wd*, batch*, T_in*},并写明拒选原因(例如“两层带来 0.3% 改善但代价过高/不稳定”)。

质量门控与验收

  • 复现实验完成且 score 最优;

  • 决策记录有“反事实说明”(为何不选第二名)。

产出物:best_config.json、selection_report.md(含重复实验统计与对照图)。

5. 训练最终模型

目标: 以完整训练周期在 cfg* 上获得稳健模型,并通过早停避免后期过拟合。

操作清单

  • 训练协议(完整版)

    • epoch=100(或根据早停平均触发点 + 额外余量设定);

    • 启用学习率调度(如 CosineAnnealingLR(T_max=E) 或 OneCycleLR),并保留无调度的对照一次;

    • 仍保持梯度裁剪与固定 dtype(float32);

    • 早停:patience=10, min_delta=1e-4,保存 “最佳验证损失模型” 与 “最后一次” 两份权重。

  • 监控与度量

    • 逐 epoch 记录 train/val 曲线、grad_norm 分位数、学习率轨迹;

    • 每隔 K=10 epoch 固定一段验证子序列,输出“真实 vs 预测”曲线,检查是否出现“初期滞后/趋稳振荡”。

  • 稳定性回归:训练完成后重新加载最佳权重,在验证集复算指标,与在线日志一致性核对(防腐败)。

  • 可解释性辅助(可选):输出对关键特征的输入扰动敏感性(在小幅噪声下的 ΔMAE),避免对单一特征过度依赖。

质量门控与验收

  • 早停触发前后指标一致,重载无误差;

  • val MSE/MAE 明显优于基线(设目标:≥15% 相对改善);

  • 日志、曲线与模型权重齐全,可复现。

产出物:best.ckpt、last.ckpt、training_curve_full.csv、lr_schedule.csv、fixed_segment_plots/*.png.

6. 评估改进效果

目标: 在未参与调参的测试集上,定量+定性证明真实提升且非过拟合假象。

操作清单

  • 统一评估口径:与基线一致的切分与指标:MSE/MAE/RMSE/MaxAE,以及地平线误差曲线 MAE(h)(多步滚动)。

  • 分阶段评估:冷启动段(0–300s)、快速降温段、趋稳段分别报告;若项目目标要求 MaxAE ≤ 1°C,重点给出覆盖率(如 95% 时间点误差 < 1°C)。

  • 场景复盘:对基线表现最差的 2–3 个测试场景复绘“真实 vs 预测”,标注改善幅度与可能原因(如更长 T_in 捕捉了初始陡降)。

  • 统计显著性(如有多会话):对会话级 MAE 做配对检验(t/Wilcoxon),报告 p 值与效应量(Cohen’s d)。

  • 稳健性检查:在输入叠加小扰动(不改变分布)的条件下复测,确保改进非脆弱性带来。

质量门控与验收

  • 测试集零泄漏;

  • 与基线相比,MAE 与 MaxAE 均下降(报告绝对/相对降幅);

  • MAE(h) 的增长斜率显著变小(滚动误差扩散得到抑制)。

产出物:test_metrics.csv(含分阶段与 MAE(h))、baseline_vs_tuned_plots/*.png、significance_report.md.

7. 结果记录与小结

目标: 系统沉淀结论、经验与风险,确保可审计、可复现、可对外展示与后续复用。

操作清单

  • 关键发现清单(示例模板):

    • 有效因子:lr 中档(5e-4)最稳;hidden_size=100 较 50 更优但需 dropout=0.2 抑制过拟合;num_layers=2 收益有限。

    • 无效/负效因子:过大 lr 导致尾段震荡;过强 weight_decay 造成欠拟合。

    • 机制解释:更大容量帮助刻画初期陡降的快速动力学;正则抑制了趋稳段的微振荡。

  • 成本与权衡:训练时间↑(给出倍数),但换取 MAE ↓ X%、MaxAE ↓ Y°C;若上线受限,可给出“轻量版”备选(较小 hidden_size + 稍小 T_in)。

  • 资产化与归档

    • 保存最终配置、权重、调参日志、曲线与图表、数据版本信息(data_version, split_indices);

    • 编写 experiment_card.md(问题定义、数据、模型、超参、指标、已知局限与下一步计划);

    • CHANGELOG.md 记录与前一版的变化与直接收益。

  • 下一步路线图(展望):

    • 方法:直接多步监督(减少滚动误差)、残差头/注意力、分段建模(阶段标签);

    • 训练:学习率暖启动、余弦退火 + 早停组合、困难样本重加权;

    • 评估:不确定性估计(MC Dropout/分位回归),将“1°C 约束”扩展为置信下界。

质量门控与验收

  • 产物目录完整、带哈希校验;

  • 报告中每个结论有图/表/数值支撑;

  • 在全新环境可一键重现“基线 vs 最优”的关键图表与指标。

产出物:best_config.json、best.ckpt、tuning_trial_log.csv、experiment_card.md、baseline_vs_tuned_plots/、CHANGELOG.md、artifacts_manifest.json.

附:建议的文件/目录组织

experiments/

├─ configs/

│ ├─ search_plan.yaml

│ └─ best_config.json

├─ runs/

│ ├─ phaseA_lr_sweep/

│ ├─ phaseB_capacity/

│ └─ phaseC_reg/

├─ logs/

│ ├─ tuning_trial_log.csv

│ └─ failures.log

├─ artifacts/

│ ├─ best.ckpt

│ ├─ last.ckpt

│ ├─ training_curve_full.csv

│ └─ baseline_vs_tuned_plots/

├─ reports/

│ ├─ selection_report.md

│ ├─ significance_report.md

│ ├─ experiment_card.md

│ └─ CHANGELOG.md

└─ meta/

├─ data_version.txt

└─ split_indices.json

最后更新于