【问题标题】:LSTM training patternLSTM 训练模式
【发布时间】:2023-03-03 08:40:21
【问题描述】:

我对 NN 还很陌生,我正在用 LSTM 做我自己的“Hello World”,而不是复制一些东西。我选择了一个简单的逻辑如下:

输入 3 个时间步长。第一个是 1 或 0,其他 2 个是随机数。预期输出与输入的第一个时间步相同。数据馈送如下所示:

_X0=[1,5,9] _Y0=[1] _X1=[0,5,9] _Y1=[0] ... 200 more records like this. 

这个简单的(?)逻辑可以被训练成 100% 的准确率。我进行了许多测试,发现最有效的模型是 3 个 LSTM 层,每个层都有 15 个隐藏单元。这在 22 个 epoch 后返回了 100% 的准确率。

但是,我注意到一些我难以理解的事情:在前 12 个时期,按照准确度衡量,模型根本没有取得任何进展(acc。保持 0.5),并且只有通过分类交叉熵衡量的边际进步(从 0.69 到 0.65) .然后从 epoch 12 到 epoch 22,它训练得非常快,准确率达到 1.0。问题是:为什么训练会这样?为什么前 12 个 epoch 没有进展,为什么 12-22 个 epoch 效率更高?

这是我的完整代码:

from keras.models import Sequential
from keras.layers import Input, Dense, Dropout, LSTM
from keras.models import Model
import helper
from keras.utils.np_utils import to_categorical

x_,y_ = helper.rnn_csv_toXY("LSTM_hello.csv",3,"target")
y_binary = to_categorical(y_)

model = Sequential()
model.add(LSTM(15, input_shape=(3,1),return_sequences=True))
model.add(LSTM(15,return_sequences=True))
model.add(LSTM(15, return_sequences=False))
model.add(Dense(2, activation='softmax', kernel_initializer='RandomUniform'))

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['acc'])
model.fit(x_, y_binary, epochs=100)

【问题讨论】:

  • 您使用的是哪个版本的 Keras?可以发一下训练日志吗?
  • 我使用 Keras 2.0.3

标签: machine-learning tensorflow keras lstm adam


【解决方案1】:

这个问题很难给出具体的答案,因为它取决于许多因素。训练神经网络时发挥作用的一个主要因素是您选择的优化器的学习率。

在您的代码中,您没有设置特定的学习率。 Keras 2.0.3 中 Adam 的默认学习率为 0.001。 Adam 使用基于初始学习率 (0.001) 和当前时间步长的动态学习率 lr_t,定义为

lr_t = lr * (sqrt(1. - beta_2**t) / (1. - beta_1**t)) .

beta_2 和 beta_1 的值通常分别保留为默认值 0.999 和 0.9。如果你绘制这个学习率,你会得到这样的图片:

这可能只是更新权重以找到局部(可能是全局)最小值的最佳位置。过高的学习率通常不会产生任何影响,它只是“跳过”会降低错误的区域,而较低的学习率会在错误范围内采取较小的步骤,让您找到错误较低的区域。

我建议您使用做出较少假设的优化器,例如随机梯度下降 (SGD),并使用较低的学习率来测试这个假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 2018-01-30
    • 1970-01-01
    • 2018-01-08
    • 2016-01-25
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多