深度学习中的超参数调节(learning rate、epochs、batch-size...)

微信公众号:数学建模与人工智能

GitHub - QInzhengk/Math-Model-and-Machine-Learning

一、参数(Parameter)和超参数(HyperParameter)

参数是我们训练神经网络 最终要学习的目标,最基本的就是神经网络的权重 W和b,我们训练的目的,就是要找到一套好的模型参数,用于预测未知的结果。这些参数我们是不用调的,是模型来训练的过程中自动更新生成的。
超参数是我们控制我们模型结构、功能、效率等的 调节旋钮,常见超参数:

  • learning rate
  • epochs(迭代次数,也可称为 num of iterations)
  • num of hidden layers(隐层数目)
  • num of hidden layer units(隐层的单元数/神经元数)
  • activation function(激活函数)
  • batch-size(用mini-batch SGD的时候每个批量的大小)
  • optimizer(选择什么优化器,如SGD、RMSProp、Adam)
  • 用诸如RMSProp、Adam优化器的时候涉及到的β1,β2等等
  • ......

二、选择“(超)参数组合”的方法

hyperparameters众多,每一个hyperparameter有多种取法,变成一个组合问题。
比如需要对两个超参数进行调节,可能会想到用 “网格法”:这种方法有个很大的缺陷,主要是由 “不同的超参数的重要性/作用效果有区别”导致的。
比如,假设在某个问题中,上面的Hyper1的作用其实微乎其微,而Hyper2的改变对模型的效果很明显。那么,由网格法可知,H1和H2的组合有25种,需要试验25次。但是实际上呢,由于H1基本不起作用,相当于只进行了5次试验。即花了25次试验的时间,只做了5次试验。所以用网格法会浪费时间和资源。

因此,最好在两个参数构成的矩形内,随机取样理想状态下,任何两点都不同行不同列

随机取样法具体方法为:

  1. 在大范围内随机取样
  2. 在效果较好的几个点的附近,再划分较小区域,在其中再进行随机取样
  3. 重复上述过程

这样做的好处是,可以保证没有浪费的试验,同时可以迅速锁定最优区域,更快地找到最佳的超参数组合。

三、用合适的尺度来选择超参数

对于每一个超参数,应该在怎样的一个尺度上进行划分呢?
一般从经验上讲,可能会直接 “均匀采样(uniformly)”,就是用均匀分布去选择各个候选的超参数。但可能意义不大! 因为像这种超参数,我们在调节的时候,更关注的不是实际的数值,而是变化的程度。
例如,learning rate 从0.001到0.1,扩大了100倍,实际梯度下降中每一步都比之前增大了100倍。但是,从0.1到1虽然实际的数值差比0.001到0.1的距离要大的多,但是实际的变化量最多就10倍
因此,我们做实验就可以发现,0.001到0.1这个范围内,learning rate极为敏感,也许一个小小的改变就可以让我们的梯度下降cost曲线大有不同,但是从0.1到1,cost曲线也许基本没有变化。
更好的办法,是 在对数尺度上随机取样。为啥是对数尺度呢?
不妨将取样的区间定义为[10a,10b],但是,learning rate不是在上述区间均匀取样,而是令 learning rate=10r,让r在[a,b]内均匀取样。而r=log(learning rate),因此称这种取样为log尺度取样。
通常,像learning rate这种连续性的超参数,都会在某一端特别敏感,learning rate本身在 靠近0的区间会非常敏感,因此我们一般在靠近0的区间会多采样。类似的,动量法梯度下降中(SGD with Momentum)有一个重要的超参数 β,β越大,动量越大,因此 β在靠近1的时候非常敏感,因此一般取值在0.9~0.999。

主要超参数解释:

1:优化器。机器学习训练的目的在于更新参数,优化目标函数,常见优化器有SGD,Adagrad,Adadelta,RMSprop,Adam等。其中SGD和Adam优化器是最为常用的两种优化器,SGD根据每个batch的数据计算一次局部的估计,最小化代价函数。

学习速率决定了每次步进的大小,因此我们需要选择一个合适的学习速率进行调优。学习速率太大会导致不收敛,速率太小收敛速度慢。因此SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠。

Adam优化器结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点,能够自动调整学习速率,收敛速度更快,在复杂网络中表现更优。

2:学习速率。学习速率的设置第一次可以设置大一点的学习率加快收敛,后续慢慢调整;也可以采用动态变化学习速率的方式(比如,每一轮乘以一个衰减系数或者根据损失的变化动态调整学习速率)。

3:dropout。数据第一次跑模型的时候可以不加dropout,后期调优的时候dropout用于防止过拟合有比较明显的效果,特别是数据量相对较小的时候。

4:变量初始化。常见的变量初始化有随机初始化、均匀分布初始值、正态分布初始值等。

5:训练轮数。模型收敛即可停止迭代,一般可采用验证集作为停止迭代的条件。如果连续几轮模型损失都没有相应减少,则停止迭代。

6:正则化。为了防止过拟合,可通过加入l1、l2正则化。从公式可以看出,加入l1正则化的目的是为了加强权值的稀疏性,让更多值接近于零。而l2正则化则是为了减小每次权重的调整幅度,避免模型训练过程中出现较大抖动。

7:激活函数。常用的激活函数为sigmoid、tanh、relu、leaky relu、elu等。采用sigmoid激活函数计算量较大,而且sigmoid饱和区变换缓慢,求导趋近于0,导致梯度消失。sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。

tanh它解决了zero-centered的输出问题,然而,gradient vanishing的问题和幂运算的问题仍然存在。

relu从公式上可以看出,解决了gradient vanishing问题并且计算简单更容易优化,但是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新(Dead ReLU Problem);leaky relu有relu的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明leaky relu总是好于relu。

elu也是为解决relu存在的问题而提出,elu有relu的基本所有优点,但计算量稍大,并且没有完全证明elu总是好于relu。

8:特征学习函数。常用的特征学习函数有cnn、rnn、lstm、gru。cnn注重词位置上的特征,而具有时序关系的词采用rnn、lstm、gru抽取特征会更有效。gru是简化版的lstm,具有更少的参数,训练速度更快。但是对于足够的训练数据,为了追求更好的性能可以采用lstm模型。

9:特征抽取。max-pooling、avg-pooling是深度学习中最常用的特征抽取方式。max-pooling是抽取最大的信息向量,然而当存在多个有用的信息向量时,这样的操作会丢失大量有用的信息。

avg-pooling是对所有信息向量求平均,当仅仅部分向量相关而大部分向量无关时,会导致有用信息向量被噪声淹没。针对这样的情况,在有多个有用向量的情形下尽量在最终的代表向量中保留这些有用的向量信息,又想在只有一个显著相关向量的情形下直接提取该向量做代表向量,避免其被噪声淹没。那么解决方案只有:加权平均,即Attention。

10:batch_size选择。对于小数据量的模型,可以全量训练,这样能更准确的朝着极值所在的方向更新。但是对于大数据,全量训练将会导致内存溢出,因此需要选择一个较小的batch_size。

如果这时选择batch_size为1,则此时为在线学习,每次修正方向为各自样本的梯度方向修正,难以达到收敛。batch_size增大,处理相同数据量的时间减少,但是达到相同精度的轮数增多。实际中可以逐步增大batch_size,随着batch_size增大,模型达到收敛,并且训练时间最为合适。

深度学习中的超参数调节(learning rate、epochs、batch-size...)_第1张图片

深度学习中的超参数调节(learning rate、epochs、batch-size...)_第2张图片

参考:

你可能感兴趣的:(Python,数学建模,算法,python,神经网络,机器学习,人工智能)