Machine learning LSTM训练模式

Machine learning LSTM训练模式,machine-learning,tensorflow,keras,lstm,adam,Machine Learning,Tensorflow,Keras,Lstm,Adam,我是NNs的新手,我正在用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个隐藏单元

我是NNs的新手,我正在用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个时代后,该方法返回了100%的准确率

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

这是我的全部代码:

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 2.0.3中Adam的默认学习率为0.001。Adam使用基于初始学习率(0.001)和当前时间步长的动态学习率,定义为

lr_t = lr * (sqrt(1. - beta_2**t) / (1. - beta_1**t)) .
beta_2
beta_1
的值通常分别保持默认值
0.999
0.9
。如果你画出这个学习率,你会得到这样的画面:

这可能只是因为这是更新权重以找到局部(可能是全局)最小值的最佳时机。太高的学习率通常没有什么区别,只是“跳过”了那些会降低错误的区域,而较低的学习率会在错误领域迈出较小的一步,让你找到错误较低的区域


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

您使用的是哪种版本的KERA?你能发布培训日志吗?我使用Keras 2.0.3