简单测试集上循环网络动态特性:为何前期预测更精准?
问题分析:LSTM预测前期准确后期偏差的原因
问题背景
我正在理解RNN工作原理,设计了一个用电预测示例:输入一周的用电数据,预测次日每小时的用电量。为简化模拟,用电函数设为c(h)=h(h为小时数,c(h)为对应小时用电量),单日用电量序列为[0,1,2,...,23]。
训练后发现,仅前期小时的预测接近理想的恒等函数,增加训练轮数后准确时段会延长;若起始小时设为5,曲线从5开始呈线性。想知道为何会出现前期预测远优于后期的现象?我的猜测是前期数据影响贯穿更多训练步骤,但不确定该推测是否正确。
实现代码
#!/usr/bin/env python import sys from keras.models import Sequential from keras import layers import matplotlib import matplotlib.pyplot as plt import numpy as np matplotlib.use('TKAgg') Inputs = np.tile(np.arange(24), (7)).reshape(1, 7*24, 1) Outputs = np.arange(24).reshape(1, 24, 1) model2 = Sequential() model2.add(layers.LSTM(32, # 32 is choosen at random input_shape=(7*24, Inputs.shape[-1]) )) model2.add(layers.Dense(24, activation='linear')) model2.compile(loss='mean_squared_error', optimizer='adam') history = model2.fit(x=Inputs, y=Outputs, epochs=200, batch_size= 1, validation_data = (Inputs, Outputs)) plt.figure() plt.ylim([0, 24]) plt.xlim([0, 24]) y = model2(Inputs, training=False) plt.plot(y[0]) plt.show()
核心原因分析
你的猜测方向是对的,但更准确的解释要结合LSTM的输出结构和任务特性:
单LSTM输出的信息容量限制
当前模型用LSTM处理完168小时的输入后,仅输出最后一个时间步的隐藏状态,再通过全连接层一次性预测24个小时的结果。LSTM的隐藏状态(32维)容量有限:- 预测序列的前几个小时,只需要从隐藏状态中提取输入末尾的“小时递增”模式,这个模式在输入最后一段(第7天的20-23点)反复出现,容易被捕捉。
- 但后期的预测需要从单一隐藏状态中推导更长的递增序列,隐藏状态无法完整存储整个输入的递增逻辑,导致越往后的预测偏差越大。
梯度衰减的更新效率差异
虽然LSTM缓解了传统RNN的梯度消失问题,但后期预测的损失梯度需要反向传播回168个时间步:- 前期预测的损失梯度传递路径短,能直接关联到输入末尾部分,参数更新更高效,所以先收敛。
- 后期预测的梯度需要穿越更长的路径,会逐渐衰减,参数更新效率低,需要更多训练轮次才能逐步拟合。
外推任务的天然难度
你的任务本质是从已知递增序列外推后续序列,而非拟合已有模式。模型需要学习“输入是连续递增,输出也应连续递增”的逻辑,但单LSTM+全连接的结构很难一次性掌握完整的线性外推能力,只能先拟合开头部分,随着训练轮数增加才会覆盖更长的序列。
改进建议
- 改用Seq2Seq(序列到序列)结构:用LSTM做编码器处理输入,再用另一个LSTM做解码器逐个输出预测值,解码器可利用前一时刻的输出作为输入,更适配序列预测逻辑。
- 增加LSTM隐藏层维度,提升状态的信息存储能力。
- 调整损失权重,给后期预测的损失更高权重,强制模型关注后期拟合。
内容的提问来源于stack exchange,提问作者jcm69
相关产品推荐
相关产品推荐

