基于Keras的多参数LSTM时间序列模型训练出现Loss Nan求助
LSTM时间序列模型高维输入触发loss为nan问题
场景说明
作为TensorFlow与Keras使用新手,在训练时间序列LSTM模型时发现:仅使用少量参数做测试时模型运行状态正常,但一旦将输入参数提升至完整的17010个,模型几乎立刻出现 loss: nan 异常。
输入数据已完成归一化处理,取值范围落在0到1之间,几乎不存在显著异常值,各参数的时序曲线形态可参考附图。
注意:输入数据集存在大量缺失值,由于模型的预测目标是相对前一时间步(1天)的涨跌幅百分比,即 y[i] > 0.5 对应上涨、y[i] < 0.5 对应下跌,因此将所有缺失值统一填充为 0.5。
网络配置规格
当前网络核心参数配置如下:
- 训练样本(对应时间步总数):9835
- 输入参数维度:17010
- 输入序列长度:30
- 输出参数维度:1
- 输出序列长度:1
整体来看,通过TimeseriesGenerator生成的输入序列整体shape为 (30, 17010, 9835),已在32到256区间内调整不同batch size开展测试。
已尝试的排查与调整操作
- 降低dropout率
- 梯度裁剪(考虑到所有输入值均落在0-1区间,原本认为该操作对当前场景没有必要)
- 排查所有输入数据是否存在NaN或Inf值
- 增大batch size
- 降低学习率
- 将输入参数数量缩减至3406
查阅到的关于网络合适层数与单元数的参考信息存在冲突,也已在32到2000区间内调整不同的隐藏单元数开展测试。
当前实现代码
使用 keras.preprocessing.sequence.TimeseriesGenerator 分别构建训练集与验证集,核心实现逻辑如下:
dataset_train = keras.preprocessing.sequence.TimeseriesGenerator( x_train, y_train, length=past, batch_size=batch_size, )
model = Sequential() model.add(LSTM(hidden_units, return_sequences=False, activation='relu', input_shape=(past, dataset_train.data.shape[1]))) model.add(Dropout(0.2)) model.add(Dense(hidden_units)) model.compile(optimizer=keras.optimizers.Adam(learning_rate=learning_rate), loss="mse") path_checkpoint = "model_checkpoint.h5" es_callback = keras.callbacks.EarlyStopping(monitor="val_loss", min_delta=0, patience=5) model.summary() modelckpt_callback = keras.callbacks.ModelCheckpoint( monitor="val_loss", filepath=path_checkpoint, verbose=1, save_weights_only=True, save_best_only=True, ) history = model.fit( dataset_train, epochs=epochs, validation_data=dataset_val, callbacks=[es_callback, modelckpt_callback, PlotLossesKeras()], )
现存疑问
目前无法确定当前异常是因训练样本量较少、无法支撑高维输入参数的模型训练所致,还是其他诱因引发,希望获得针对性的优化指导。
内容的提问来源于stack exchange,提问作者Kyle Dixon
相关产品推荐
相关产品推荐

