基础参数
model = Sequential()
model.add(GRU(1000,input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss='mse', optimizer=Adam(learning_rate=0.001),metrics=['mae', 'acc'])
history = model.fit(train_X, train_y, epochs=400, batch_size=300, validation_data=(test_X, test_y),verbose=2,
shuffle=False)
print("model train end")
# 输出 plot history
pyplot.plot(history.history['loss'], label='train_loss')
pyplot.plot(history.history['val_loss'], label='test_loss')
pyplot.legend()
pyplot.show()
1、在确保了数据与网络的正确性之后,使用默认的超参数设置,观察loss的变化,初步定下各个超参数的范围,再进行调参。对于每个超参数,我们在每次的调整时,只去调整一个参数,然后观察loss变化,千万不要在一次改变多个超参数的值去观察loss。
2、对于loss的变化情况,主要有以下几种可能性:上升、下降、不变,对应的数据集有train与val(validation),那么进行组合有如下的可能:
train loss 不断下降,val loss 不断下降——网络仍在学习;
train loss 不断下降,val loss 不断上升——网络过拟合;
train loss 不断下降,val loss 趋于不变——网络欠拟合;
train loss 趋于不变,val loss 趋于不变——网络陷入瓶颈;
train loss 不断上升,val loss 不断上升——网络结构问题;
train loss 不断上升,val loss 不断下降——数据集有问题;
其余的情况,也是归于网络结构问题与数据集问题中。
有许多LSTM架构可供选择。有些体系结构适合于某些序列预测问题,尽管大多数体系结构具有足够的灵活性,可以适应您的序列预测问题,但仍要测试您对架构适用性的假设。
对于给定的序列预测问题或LSTM体系结构,我们无法知道最佳记忆单元数。必须在LSTM隐藏层中测试一组不同的存储单元,以查看最有效的方法。
与存储单元的数量一样,对于给定的序列预测问题或LSTM体系结构,我们无法知道LSTM隐藏层的最佳数量。当有很多数据的时候,深度越深往往更好。
尝试网格搜索的层数和记忆单元。
尝试使用在研究论文中引用的堆叠LSTM层的模式。
尝试随机地搜索层和记忆细胞的数量。
默认情况下,Keras LSTM层使用glorot_uniform权重初始化。一般而言,这种权重初始化效果很好,但是在LSTM中使用普通类型的权重初始化非常成功。评估不同权重初始化方案对模型性能的影响。Keras提供了一个很好的权重初始化方案列表:
random uniform
random normal
glorot uniform
glorot normal
激活函数(从技术上讲是传递函数,它传递神经元的加权激活)通常由输入或输出层的框架和比例固定。例如,LSTM对输入使用sigmoid激活函数,因此输入的比例通常为0-1。序列预测问题的分类或回归性质决定了在输出层中使用的激活函数的类型。可以尝试其他的激活函数:
sigmoid
tanh
relu
此外,堆叠的LSTM中的所有LSTM层是否需要使用相同的激活函数。在实践中,很少看到模型比使用Sigmoid做得更好,但是这一假设应该得到证实。
1、当网络过拟合时,可以采用的方式是正则化(regularization)与丢弃法(dropout)以及BN层(batch normalization),正则化中包括L1正则化与L2正则化,在LSTM中采用L2正则化。另外在使用dropout与BN层时,需要主要注意训练集和测试集上的设置方式不同,例如在训练集上dropout设置为0.5,在验证集和测试集上dropout要去除。
2、当网络欠拟合时,可以采用的方式是:去除 / 降低 正则化;增加网络深度(层数);增加神经元个数;增加训练集的数据量。
3、设置early stopping,根据验证集上的性能去评估何时应该提早停止。
4、可使用softsign(而非softmax)激活函数替代tanh(更快且更不容易出现饱和(约0梯度))
5、尝试使用不同优化算法,合适的优化器可以是网络训练的更快,Adam,SGD,RMSProp、AdaGrad或momentum(Nesterovs)通常都是较好的选择。
6、使用梯度裁剪(gradient clipping),归一化梯度后将梯度限制在5或者15。
7、学习率(learning rate)是一个相当重要的超参数,对于学习率可以尝试使用余弦退火或者衰减学习率等方法。学习率这个一般初值对于不同的优化器设置是不一样的,据说有一些经典的配置,像Adam :lr = 0.001
8、可以进行网络的融合(网络快照)或者不同模型之间的融合。
9、batch size:batch size这个还是需要去适当调整的,看相关的blogs,一般设置不会超过128,有可能也很小,在我目前的任务中,batch size =16有不错的效果。
10、迭代次数(epoch):根据自己的task、model、收敛速度、拟合效果设置不同的值
11、LSTM中的hidden size:LSTM中的隐藏层维度大小也对结果有一定的影响,如果使用300dim的外部词向量的话,可以考虑hidden size =150或者是300,对于hidden size我最大设置过600,因为硬件设备的原因,600训练起来已经是很慢了,如果硬件资源ok的话,可以尝试更多的hidden size值,但是尝试的过程中还是要考虑一下hidden size 与词向量维度的关系(自认为其是有一定的关系影响的)
12、调试GRU存储单元数据,一般为100或1000