神经网络与深度学习(八)—如何调参

神经网络中有大量的参数需要我们设置与调节,比如说神经网络的层数以及隐藏层神经元个数,学习率η,规范化参数 λ,mini_batch大小等等。除此之外,还有算法的选择,如:选sigmoid的函数激励还是tanh函数激励?选quadratic函数还是cost-entropy函数?规范化方式的选择?等等问题。令人更头疼的是,我们应该先调节哪个参数呢?调完第一个参数再调节哪个参数呢?调完后面的参数后,第一个参数还是最佳的参数吗?因此我们需要一套调参流程来调节我们的参数。

1)提高调参效率

我们在调参之前首先要考虑到一个问题,如果每验证一次参数都需要好长时间的话,那么我们就不用干别的了,只能慢慢等着了。理想的状态是,每次设定一个参数后,我们希望在几秒内就能知道这个参数的优劣。决定这个参数是要继续调节,还是保留。这就涉及到提高调参效率了。以下有三种方法,能使我们获得快速反馈。

(1)缩小分类范围

以识别手写数字举例,我们可以只保留minst数据集中的‘0’和‘1’图像,只专注于对这两个数字分类,这样我们的效率就提高了5倍。

(2)简化网络结构

减小神经网络隐藏层的数目也是一个极好的办法。通常情况下,隐藏层数目越大,网络越难训练。所以,我们一般先选择从低层开始训练。比如,先从[784,30,10]开始训练,然后逐渐加层。也可以极端点,去掉隐藏层,直接先从[784,10]开始训练。

(3)提高监控频率

之前,我们每轮训练50000个数据,测试10000个数据,每训练一轮监控器反馈一次结果。现在,我们可以每轮训练1000个数据,测试100个数据。这样我们都训练效率提高了50*10倍!!!这种方法同方法(1)一样也是通过减少数据量来缩短训练时间。

2)开始调参

有了上面的准备,我们可以开始调参了。

(1)学习速率

我们首先调节学习速率。先回忆一下,学习速率代表什么呢?学习速率代表的是梯度下降的步长,过大的步长可能导致我们在到达'谷底'的时候,又跨了过去。这类似于PID参数调节中的P参数过大。但是,如果选择过小的学习速率的话,这意味着权重和偏置更新变慢。最佳的方法是,刚开始选择比较大的学习率,随后再切换成小学习率。但是什么时候切换,这又是个问题。下面给出一种通常的做法,如图我们分别选择2.5,0.25,0.025的学习速率训练:

我们先找到一个代价函数开始下降,若干轮过后开始震荡的学习率阈值,如η=0.25,我们这里确定了大概量级为0.1。如果这里选择学习率是2.5开始就震荡,那么选择下一个量级0.25。如果继续震荡,继续向下选择。

接下来,取该量级的一半(即0.05)和下一个量级(0.01)之间调节参数,直到达到最优值(η=0.025)。

(2)规范化参数

这里,规范化参数λ应该首先设为0。等确定好学习率η后,再使用验证数据选择好的λ。从尝试λ=1.0开始,然后根据验证集上的性能10倍增加或减少其值。确定量级后,再改进λ的值。之后,再返回去优化η。

(3)mini_bacth大小

我们先回忆一下,mini_batch的大小有什么作用。先列出公式:

如果m过大的话,很明显学习的速率不可避免的下降了。但是如果m特别小,甚至是1呢?我们根据之前知道,m如果是1的话,那么就是在线学习。如下:

这里在线学习的效率是mini_batch更新的m倍,但是如果太小的话,那么更新就太频繁了。这样,我们就无法充分利用numpy等矩阵库和硬件融合计算了。那么如何选择m的大小呢?

其实,m参数是一个相对独立的参数,调节该参数对其他参数没有什么影响。这是一个好消息,这意味我们无需担心调节完m后,再回头去调节之前调好的参数了。既然如此,我们就可以先调节好学习率η和规范化参数λ后,再去调节m的大小。我们可以先选择一个普遍适用的经验值,如10(这里我一般是与分类输出的数目是一致的)。而后,再选择不同的参数m,画出验证准确率的值随时间变化的图,再决定最佳参数。

3)提前终止

如果我们在验证参数的时候,发现其准确率在一定轮数后就不再增加了,我们可以就在此时终止程序,选择下一个参数。这看起来似乎有些武断,但是在某种情况下这个方法是提高调参效率很有效的方法。

今天就到这里。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180414G1014H00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券