LSTM训练模式

问题描述:

我对神经网络相当陌生,我正在用LSTM做我自己的“Hello World”,而不是复制一些东西。我选择了一个简单的逻辑如下:LSTM训练模式

输入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) 
+0

您正在使用哪种版本的Keras?你可以发布培训日志吗? – nemo

+0

我使用Keras 2.0.3 – Manngo

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

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

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

beta_2beta_1的值通常在0.9990.9它们的默认值分别向左。如果您绘制这种学习速度你得到的东西的图片是这样的:

Adam dynamic learning rate for epoch 1 to 22

这可能仅仅是因为这是甜蜜点更新权在当地找一家(可能是一个全球性的)最低。过高的学习率通常不会影响它,只会“跳过”会降低误差的区域,而较低的学习率会在误差范围内采取较小的步骤,并让您找到误差较低的区域。

我建议您使用一个优化程序,它可以减少假设,如随机梯度下降(SGD),并且您可以使用较低的学习率来测试此假设。