神经网络超参数选择

2019-10-11  本文已影响0人  大脸猫猫脸大

1. 学习率

1.1 是什么

深度学习模型通常由随机梯度下降算法进行训练。随机梯度下降算法有许多变形:例如 Adam、RMSProp、Adagrad 等等。这些算法都需要你设置学习率。学习率决定了在一个小批量(mini-batch)中权重在梯度方向要移动多远。

1.2 极端值的影响

如果学习率很低,训练会变得更加可靠,但是优化会耗费较长的时间,因为朝向损失函数最小值的每个步长很小。
如果学习率很高,训练可能根本不会收敛,损失函数一直处于波动中,甚至会发散。权重的改变量可能非常大,使得优化越过最小值,使得损失函数变得更糟。

1.3 如何设置

训练应当从相对较大的学习率开始。这是因为在开始时,初始的随机权重远离最优值。在训练过程中,学习率应当下降,以允许细粒度的权重更新。

参考:https://www.jiqizhixin.com/articles/2017-11-17-2

2. 批次大小batch_size

2.1 是什么

批次大小是每一次训练神经网络送入模型的样本数。在合理的范围之内,越大的 batch size 使下降方向越准确,震荡越小,通常取值为[16,32,64,128]。

2.2 极端值影响

Batch_Size=全部数据集缺点:
  1) 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
  2) 以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。
Batch_Size = 1缺点:
使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

2.3 如何设置

在合理范围内,增大 Batch_Size 有何好处?
1) 内存利用率提高了,大矩阵乘法的并行化效率提高。
2) 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
3) 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

盲目增大 Batch_Size 有何坏处?
  1) 内存利用率提高了,但是内存容量可能撑不住了。
 2) 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
  3) Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

参考:https://blog.csdn.net/juronghui/article/details/78612653

3. 迭代次数

迭代次数是指整个训练集输入到神经网络进行训练的次数,当测试错误率和训练错误率相差较小,且测试准确率趋于稳定时(达到最优),可认为当前迭代次数合适;当测试错误率先变小后变大时则说明迭代次数过大了,需要减小迭代次数,否则容易出现过拟合。

5. 激活函数

用激活函数给神经网络加入一些非线性因素,使得网络可以更好地解决较为复杂的问题。参考:https://blog.csdn.net/tyhj_sf/article/details/79932893

5.1 sigmoid

它能够把输入的连续实值变换为0和1之间的输出。
缺点:
 1) 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
 2) Sigmoid 的 output 不是0均值,使得收敛缓慢。batch的输入能缓解这个问题。

5.2 tanh

它解决了Sigmoid函数的不是zero-centered输出问题,然而梯度消失的问题和幂运算的问题仍然存在。
tanh函数具有中心对称性,适合于有对称性的二分类

5.3 relu

虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了梯度消散问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

5.4 relu改进版

为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx而非0,如PReLU

5.5 如何选择激活函数

1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.

3. 优化器optimizer

公式:https://www.cnblogs.com/xiaobingqianrui/p/10756046.html
优化器比较:https://blog.csdn.net/weixin_40170902/article/details/80092628

  1. SGD:计算一个batch内的loss均值,利用均值求梯度下降方向。训练速度较快。缺点在于SGD在随机选择梯度的同时会引入噪声,使得权值更新的方向不一定正确。此外,SGD也没能单独克服局部最优解的问题
  2. 动量优化-Momentum:主要思想是引入一个积攒历史梯度信息动量来加速SGD,将上一批次的梯度与当前梯度的加权作为新的梯度。
    动量主要解决SGD的两个问题:一是随机梯度的方法(引入的噪声);二是Hessian矩阵病态问题(可以理解为SGD在收敛过程中和正确梯度相比来回摆动比较大的问题)。
    理解策略为:由于当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上了惯性。
  3. 动量优化-NAG:牛顿加速梯度(NAG, Nesterov accelerated gradient)算法,是Momentum动量算法的变种,往标准动量中添加了一个校正因子。
    理解策略:先按照上次的梯度走两步,然后再停下来思考接下来行进的方向。
  4. 自适应-AdaGrad算法:具有代价函数最大梯度的参数相应地有个快速下降的学习率,而具有小梯度的参数在学习率上有相对较小的下降。相当于陡坡处慢点走,平地上迈大步。
    Adagrad 的主要优势在于不需要人为的调节学习率,它可以自动调节;缺点在于,随着迭代次数增多,学习率会越来越小,最终会趋近于0,所以训练神经网络时很少使用该优化器。
  5. 自适应-RMSProp算法:梯度积累为指数加权的移动平均,使得其在非凸设定下效果更好。是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。
  6. 自适应-AdaDelta:AdaGrad算法和RMSProp算法都需要指定全局学习率。AdaDelta不需要。
    在模型训练的初期和中期,AdaDelta表现很好,加速效果不错,训练速度快。
    在模型训练的后期,模型会反复地在局部最小值附近抖动。
  7. 比较
    ① 在运行速度方面
    两个动量优化器Momentum和NAG的速度最快,其次是三个自适应学习率优化器AdaGrad、AdaDelta以及RMSProp,最慢的则是SGD。
    ② 在收敛轨迹方面
    1) 两个动量优化器虽然运行速度很快,但是初中期走了很长的”岔路”。
    2) 三个自适应优化器中,Adagrad初期走了岔路,但后来迅速地调整了过来,但相比其他两个走的路最长;AdaDelta和RMSprop的运行轨迹差不多,但在快接近目标的时候,RMSProp会发生很明显的抖动。
    3) SGD相比于其他优化器,走的路径是最短的,路子也比较正。
上一篇下一篇

猜你喜欢

热点阅读