关于我正在使用的 LSTM 超参数调整过程的意见

数据挖掘 喀拉斯 lstm 超参数调整 贝叶斯 时代
2022-02-18 10:20:43

我正在训练 LSTM 来预测价格图表。我正在使用贝叶斯优化来稍微加快速度,因为我有大量的超参数并且只有我的 CPU 作为资源。

从超参数空间进行 100 次迭代,每次迭代 100 次,而训练仍然需要太多时间才能找到一组合适的超参数。

我的想法是这样的。如果我在贝叶斯优化期间只训练一个 epoch,那仍然是一个足够好的指标来衡量整体的最佳损失吗?这将大大加快超参数优化的速度,然后我可以负担得起用 100 个 epoch 重新训练最好的 2 或 3 个超参数集。这是一个好方法吗?

另一种选择是为每次训练保留 100 个 epoch,但减少数量。的迭代。即减少使用不同超参数的训练次数。

关于上述两种解决方案的任何意见和/或提示?

(我keras用于训练和hyperopt贝叶斯优化)

2个回答

首先,您可能想知道有一个“新的”Keras Tuner,其中包括 BayesianOptimization,因此使用 keras 构建 LSTM 并优化其超参数完全是 keras Tuner 的插件任务:) 您可以找到最近的答案 I在此处发布了有关使用 keras 调谐器为时间序列调整 LSTM 的信息

所以,我会考虑两点:

  • 我不会只在您的数据集上循环一次,听起来似乎没有足够的时间来找到正确的权重。正如你所说,我宁愿控制可能的超参数配置的数量,这可以通过max_trials参数在 keras Tuner 中指示

  • 关于将 keras 调谐器与贝叶斯调谐器一起使用,您可以在下面找到一些代码作为调整隐藏层中的单元(节点)和学习率的示例:

    from tensorflow import keras
    from kerastuner.tuners import BayesianOptimization
    
    n_input = 6
    def build_model(hp):
        model = Sequential()
        model.add(LSTM(units=hp.Int('units',min_value=32,
                                        max_value=512,
                                        step=32), 
                   activation='relu', input_shape=(n_input, 1)))
        model.add(Dense(units=hp.Int('units',min_value=32,
                                        max_value=512,
                                        step=32), activation='relu'))
        model.add(Dense(1))
        model.compile(loss='mse', metrics=['mse'], optimizer=keras.optimizers.Adam(
            hp.Choice('learning_rate',
                      values=[1e-2, 1e-3, 1e-4])))
    
    return model
    
    bayesian_opt_tuner = BayesianOptimization(
        build_model,
        objective='mse',
        max_trials=3,
        executions_per_trial=1,
        directory=os.path.normpath('C:/keras_tuning'),
        project_name='kerastuner_bayesian_poc',
        overwrite=True)
    
    bayesian_opt_tuner.search(train_x, train_y,epochs=n_epochs,
         #validation_data=(X_test, y_test)
         validation_split=0.2,verbose=1)
    
    
    bayes_opt_model_best_model = bayesian_opt_tuner.get_best_models(num_models=1)
    model = bayes_opt_model_best_model[0]
    

您会得到类似这样的信息,通知您搜索到的配置和评估指标:

在此处输入图像描述

在这里,您可以找到通过 keras 训练 LSTM 并通过 keras 调谐器、贝叶斯选项对其进行调整的代码:

#2 epoch con 20 max_trials
from kerastuner import BayesianOptimization

def build_model(hp):
    model = keras.Sequential()
    model.add(keras.layers.LSTM(units=hp.Int('units',min_value=8,
                                        max_value=64,
                                        step=8), 
                   activation='relu', input_shape=x_train_uni.shape[-2:]))
    model.add(keras.layers.Dense(1))

    model.compile(loss='mae', optimizer=keras.optimizers.Adam(
            hp.Choice('learning_rate',
                      values=[1e-2, 1e-3, 1e-4])),
                   metrics=['mae'])
    return model

# define model
bayesian_opt_tuner = BayesianOptimization(
    build_model,
    objective='mae',
    max_trials=20,
    executions_per_trial=1,
    directory=os.path.normpath('C:/keras_tuning'),
    project_name='timeseries_temp_ts_test_from_TF_ex',
    overwrite=True)

EVALUATION_INTERVAL = 200
EPOCHS = 2

bayesian_opt_tuner.search(train_univariate, #X_train, y_train,
             epochs=EPOCHS,
             validation_data=val_univariate,
             validation_steps=50,
             steps_per_epoch=EVALUATION_INTERVAL
             #batch_size=int(len(X_train)/2)
             #validation_split=0.2,verbose=1)
             )

我使用温度数据集完成了它,同时更改了时期和超参数组合。我认为这也取决于您正在使用的数据集,对于我快速尝试过的数据集(没有代表性结果,因为它应该重复足够多次以获得每种情况的结果分布),我没有发现太大差异(我们应该检查一下通过假设检验器得出可靠的结论),但您可以在那里玩它。我的快速结果:

20 个 epoch,2 个超参数组合在此处输入图像描述

2 个 epoch,20 个超参数组合在此处输入图像描述