Hyper Parameter Tuning

Hyper Parameter Tuning

Hand Tuning

Good Code Style

  • 将各个参数的设置部分集中在⼀起。 如果参数的设置分布在代码的各个地⽅, 那么修改的过程想必会⾮常痛苦。
  • 可以输出模型的损失函数值以及训练集和验证集上的准确率。
  • 可以考虑设计⼀个⼦程序,可以根据给定的参数, 启动训练并监控和周期性保存评估结果。 再由⼀个主程序,分配参数以及并⾏启动⼀系列⼦程序。

General to Specific

  • 建议先参考相关论⽂,以论⽂中给出的参数作为初始参数。 ⾄少论⽂中的参数,是个不差的结果。
  • 如果找不到参考,那么只能⾃⼰尝试了。 可以先从⽐较重要,对实验结果影响⽐较⼤的参数开始, 同时固定其他参数,得到⼀个差不多的结果以后,在这个结果的基础上,再调其他参数。 例如学习率⼀般就⽐正则值,dropout值重要的话,学习率设置的不合适, 不仅结果可能变差,模型甚⾄会⽆法收敛。
  • 如果实在找不到⼀组参数让模型收敛。那么就需要检查, 是不是其他地⽅出了问题,例如模型实现,数据等等。

Speed up Experiment

  • 对训练数据进⾏采样。例如原来100W条数据,先采样成1W,进⾏实验看看。
  • 减少训练类别。例如⼿写数字识别任务,原来是10个类别, 那么我们可以先在2个类别上训练,看看结果如何。

HP Range

  • 建议优先在对数尺度上进⾏超参数搜索。⽐较典型的是学习率和正则化项, 我们可以从诸如0.001 0.01 0.1 1 10,以10为阶数进⾏尝试。 因为他们对训练的影响是相乘的效果。
  • 不过有些参数,还是建议在原始尺度上进⾏搜索,例如dropout值: 0.3 0.5 0.7)

Experiment Number

  • learning rate: 1 0.1 0.01 0.001, ⼀般从1开始尝试。很少见learning rate⼤于10的。 学习率⼀般要随着训练进⾏衰减。 衰减系数⼀般是0.5。 衰减时机,可以是验证集准确率不再上升时,或固定训练多少个周期以后。 不过更建议使⽤⾃适应梯度的办法,例如adam,adadelta,rmsprop等,这些⼀般使⽤相关论⽂提供的默认值即可,可以避免再费劲调节学习率。 对RNN来说,有个经验,如果RNN要处理的序列⽐较长,或者RNN层数⽐较多,那么learning rate⼀般⼩⼀些⽐较好,否则有可能出现结果不收敛,甚⾄Nan等问题。
  • ⽹络层数: 先从1层开始。
  • 每层结点数: 16 32 128,超过1000的情况⽐较少见。超过1W的从来没有见过。
  • batch size: 128上下开始。batch size值增加,的确能提⾼训练速度。但是有可能收敛结果变差。如果显存⼤⼩允许,可以考虑从⼀个⽐较⼤的值开始尝试。因为batch size太⼤,⼀般不会对结果有太 ⼤的影响,⽽batch size太⼩的话,结果有可能很差。
  • clip c(梯度裁剪): 限制最⼤梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算⼀个衰减系系数,让value的值等于阈值: 5,10,15
  • dropout: 0.5
  • L2正则:1.0,超过10的很少见。
  • 词向量embedding⼤⼩:128,256
  • 正负样本⽐例: 这个是⾮常容易忽视,但是在很多分类问题上,又⾮常重要的参数。很多⼈往往习惯使⽤训练数据中默认的正负类别⽐例,当训练数据⾮常不平衡的时候,模型很有可能会偏向数⽬较 ⼤的类别,从⽽影响最终训练结果。除了尝试训练数据默认的正负类别⽐例之外,建议对数⽬较⼩的样本做过采样,例如进⾏复制。提⾼他们的⽐例,看看效果如何,这个对多分类问题同样适⽤。
  • 在使⽤mini-batch⽅法进⾏训练的时候,尽量让⼀个batch内,各类别的⽐例平衡,这个在图像识别等多分类任务上⾮常重要。

Loss don’t Decrease

  • train loss 不断下降,test loss不断下降,说明⽹络仍在学习;
  • train loss 不断下降,test loss趋于不变,说明⽹络过拟合;
  • train loss 趋于不变,test loss不断下降,说明数据集100%有问题;
  • train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减⼩学习率或批量数⽬;
  • train loss 不断上升,test loss不断上升,说明⽹络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。