Learning Rate
学习速率应通过训练成本来确定,如果训练成本一直在降低,且降得比较快,那么可适当调大学习速率。否则,应该取较小的学习速率避免“步长太大,越过谷底”。因为学习速率仅仅影响着最终的准确率,所以没必要选择验证集。
Hidden Units/Layers
隐藏层层数、隐藏节点个数等超参数应当通过验证集准确率来判断。因为这些超参数都是为了在测试集合上有一个好的表现,而验证集合是某种意义上在测试集合上的反映,所以用验证集合是合理的。
Early Stopping
所谓early stopping,即在每一个epoch结束时(一个epoch即对所有训练数据的一轮遍历)计算 validation data的accuracy,当accuracy不再提高时,就停止训练。这是很自然的做法,因为accuracy不再提高了,训练下去也没用。另外,这样做还能防止overfitting。
那么,怎么样才算是validation accuracy不再提高呢?并不是说validation accuracy一降下来,它就是“不再提高”,因为可能经过这个epoch后,accuracy降低了,但是随后的epoch又让accuracy升上去了,所以不能根据一两次的连续降低就判断“不再提高”。正确的做法是,在训练的过程中,记录最佳的validation accuracy,当连续10次epoch(或者更多次)没达到最佳accuracy时,你可以认为“不再提高”,此时使用early stopping。这个策略就叫“ no-improvement-in-n”,n即epoch的次数,可以根据实际情况取10、20、30….
Dynamic Learning Rate
在前面我们讲了怎么寻找比较好的learning rate,方法就是不断尝试。在一开始的时候,我们可以将其设大一点,这样就可以使weights快一点发生改变,从而让你看出cost曲线的走向(上升or下降),进一步地你就可以决定增大还是减小learning rate。
但是问题是,找出这个合适的learning rate之后,我们前面的做法是在训练这个网络的整个过程都使用这个learning rate。这显然不是好的方法,在优化的过程中,learning rate应该是逐步减小的,越接近“山谷”的时候,迈的“步伐”应该越小。
在讲前面那张cost曲线图时,我们说可以先将learning rate设置为0.25,到了第20个epoch时候设置为0.025。这是人工的调节,而且是在画出那张cost曲线图之后做出的决策。能不能让程序在训练过程中自动地决定在哪个时候减小learning rate?
答案是肯定的,而且做法很多。一个简单有效的做法就是,当validation accuracy满足 no-improvement-in-n规则时,本来我们是要early stopping的,但是我们可以不stop,而是让learning rate减半,之后让程序继续跑。下一次validation accuracy又满足no-improvement-in-n规则时,我们同样再将learning rate减半(此时变为原始learni rate的四分之一)…继续这个过程,直到learning rate变为原来的1/1024再终止程序。(1/1024还是1/512还是其他可以根据实际确定)。【PS:也可以选择每一次将learning rate除以10,而不是除以2.】
A readable recent paper which demonstrates the benefits of variable learning rates in attacking MNIST.《Deep Big Simple Neural Nets Excel on HandwrittenDigit Recognition》
regularization parameter, λ
正则项系数初始值应该设置为多少,好像也没有一个比较好的准则。建议一开始将正则项系数λ设置为0,先确定一个比较好的learning rate。然后固定该learning rate,给λ一个值(比如1.0),然后根据validation accuracy,将λ增大或者减小10倍(增减10倍是粗调节,当你确定了λ的合适的数量级后,比如λ = 0.01,再进一步地细调节,比如调节为0.02,0.03,0.009之类。)
在《Neural Networks:Tricks of the Trade》中的第三章『A Simple Trick for Estimating the Weight Decay Parameter』中,有关于如何估计权重衰减项系数的讨论,有基础的读者可以看一下。
Mini-batch size
首先说一下采用mini-batch时的权重更新规则。比如mini-batch size设为100,则权重更新的规则为:
技术分享
也就是将100个样本的梯度求均值,替代online learning方法中单个样本的梯度值:
技术分享
当采用mini-batch时,我们可以将一个batch里的所有样本放在一个矩阵里,利用线性代数库来加速梯度的计算,这是工程实现中的一个优化方法。
那么,size要多大?一个大的batch,可以充分利用矩阵、线性代数库来进行计算的加速,batch越小,则加速效果可能越不明显。当然batch也不是越大越好,太大了,权重的更新就会不那么频繁,导致优化过程太漫长。所以mini-batch size选多少,不是一成不变的,根据你的数据集规模、你的设备计算能力去选。
The way to go is therefore to use some acceptable (but not necessarily optimal) values for the other hyper-parameters, and then trial a number of different mini-batch sizes, scaling η as above. Plot the validation accuracy versus time (as in, real elapsed time, not epoch!), and choose whichever mini-batch size gives you the most rapid improvement in performance. With the mini-batch size chosen you can then proceed to optimize the other hyper-parameters.
更多资料
LeCun在1998年的论文《Efficient BackProp》
Bengio在2012年的论文《Practical recommendations for gradient-based training of deep architectures》,给出了一些建议,包括梯度下降、选取超参数的详细细节。
以上两篇论文都被收录在了2012年的书《Neural Networks: Tricks of the Trade》里面,这本书里还给出了很多其他的tricks。