1.好的实验环境是成功的一半
(b)可以输出模型的损失函数值以及训练集验证集上的准确率
(c)可以考虑设计一个子程序,可以根据给定的参数,启动训练并监调和周期性保存评估结果。再由一个主程序,分配参数以及并行启动一系列子程序。
2.画图
(b)如果训练到最后,训练集、验证集的准确率都很低,那么说明模型有可能欠拟合。需要增强模型拟合能力:1.增加网络的层数,增加节点数、减少dropout的值、减少l2正则值等等。
(c)如果训练集的准确率很高,但是测试集的准确率很低,那么模型有可能过拟合,这个时候需要提高模型的泛化能力,调节参数。
3.从粗到细分阶段调参
(a)建议参考论文,以论文中给出的参数作为初始参数
(b)如果找不到参考,只能自己尝试了,先从比较重要,对实验结果影响比较大的参数开始,同时固定其他的参数,得到一个差不多的结果之后,在这个结果的基础上,在调其他的参数。例如:学习速率一般比正则值、dropout值重要
(c)如果实在找不到一组参数可以让模型收敛,那么需要检查,是不是其他地方出问题。例如模型的实现、数据等等
4.提高速度
调参是为了寻找合适的参数,而不是产出最终模型,一般在小的数据集上合适的参数,在大的数据集上的效果也不会太差,因此可以尝试对数据进行精简,以提高速度,在有限的时间内尝试更多的参数。
(a)对训练数据集进行采样
(b)减少训练类别,例如:首先数字识别任务,10个类别,我们先可以在2个类别上训练,看看效果如何
5.经验参数
(a)learning rate:1,0.1,0.01,0.001, 学习速率一般随着训练进行衰减,衰减系数一般是0.5。
衰减时机:验证集准确率不在上升时,或固定训练多少个周期后,一般建议自适应梯度的方法:adam、adadelta、rmsprop
对于rnn来说,如果rnn要处理的序列比较长,或者rnn的层数比较多,那么学习速率一般小一些比较好。
(b)网络层数:先从1层开始
(c)每层节点数:16,32,128
(d)batch_size:128上下开始。batch_size的值增加,的确能够提高训练速度,但是有可能收敛的效果变差。如果显存允许的话,可以考虑从一个比较大的值开始尝试,因为batchsize太大,一般不会对结果产生太大的影响,而太小的话,结果有可能变差。
(e)dropout: 0.5,0.3,0.7
(g)正负样本比例:除了尝试选择默认的正负样本比例之外,建议对数目较少的样本做过采样,例如进行复制。在minibatch方法进行训练的时候,尽量让一个batch内,各类别的比例平衡,这个在图像识别等多分类任务上非常重要。
总结
1.合理性的检查,确定模型数据和其他地方没有问题
2.训练数据时,跟踪损失函数值,训练集和验证集的准确率
3.一定要用dropout。有两种方法可以不用。1.数据量特别小2.使用了更好的正则方法bn
4.fine-tuning是必然的。尤其在nlp中,如果只是使用word2vec训练的词向量作为特征表示,很产生很大的损失值
5.类目不均衡问题。如果你的损失值被一部分类别dominate,对总体而言大多是负向的。建议可以尝试类似于booststrap方法调整loss中样本权重的方式解决。
6.避免训练震荡。默认一定要增加随机采样因素尽可能使得数据的分布随机。默认的shuffle机制能使得训练的结果更加稳定。如果训练的模型仍然很震荡,可以考虑调整学习速率或mini_batch_size。