超参数总结

183 阅读9分钟

超参数

机器学习这东西一直都用,但是对里面的一些超参数的影响却并没有搞得很清楚,今天趁这个机会总结一下。

Batch Size

要说Batch size就要涉及到批量随机梯度下降,因为神经网络最后也是要求损失函数的最优值的,要求最优值就需要优化,批量随机梯度下降就是常用的一个优化方法

wt+1=wtη1nxBl(x,wt)w_{t+1}=w_t-\eta \frac{1}{n} \sum_{x \in \mathcal{B}} \nabla l\left(x, w_t\right)

n是批量大小(batchsize),η是学习率(learning rate)。可知道除了梯度本身,这两个因子直接决定了模型的权重更新,从优化本身来看它们是影响模型性能收敛最重要的参数。

学习率直接影响模型的收敛状态,batchsize则影响模型的泛化性能,两者又是分子分母的直接关系,相互也可影响

大的batchsize减少训练时间,提高稳定性

大的batchsize导致模型泛化能力下降

内存利用率提高了,大矩阵乘法的并行化效率提高。

跑完一次epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。

在一定范围内,一般来说Batch Size越大,其确定的下降方向越准,引起训练震荡越小。

随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多

设置过大的批次(batch)大小,可能会对训练时网络的准确性产生负面影响,因为它降低了梯度下降的随机性

研究表明大的batchsize收敛到sharp minimum,而小的batchsize收敛到flat minimum,后者具有更好的泛化能力。 两者的区别就在于变化的趋势,一个快一个慢,如下图,造成这个现象的主要原因是小的batchsize带来的噪声有助于逃离sharp minimum。

学习率

学习率一般要满足的条件

i=1ϵi=i=1ϵi2<\begin{aligned} & \sum_{i=1}^{\infty} \epsilon_i=\infty \\ & \sum_{i=1}^{\infty} \epsilon_i^2<\infty\end{aligned}

第一个式子决定了不管初始状态离最优状态多远,总是可以收敛。第二个式子约束了学习率随着训练进行有效地降低,保证收敛稳定性,各种自适应学习率算法本质上就是不断在调整各个时刻的学习率。

初始的学习率肯定是有一个最优值的,过大则导致模型不收敛,过小则导致模型收敛特别慢或者无法学习

学习率大则收敛的快,但如果过大则可能收敛到局部最优

学习率小收敛的慢,如果过小可能无法收敛

训练集与测试集的比例

激活函数

如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)

激活函数就是为了引入非线性因素

sigmoid

σ(x)=11+ex\sigma(x)=\frac{1}{1+e^{-x}}

优点: 1.Sigmoid函数的输出在(0,1)之间,输出范围有限,优化稳定,可以用作输出层。

2.连续函数,便于求导。

缺点:

1.sigmoid函数在变量取绝对值非常大的正值或负值时会出现饱和现象,意味着函数会变得很平,并且对输入的微小改变会变得不敏感。

2.在反向传播时,当梯度接近于0,权重基本不会更新,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。

3. sigmoid函数的输出不是0均值的,会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。

4. 计算复杂度高,因为sigmoid函数是指数形式

Tanh函数

f(x)=Tanhx=sinhxcoshx=exexex+exf(x)=\operatorname{Tanh} x=\frac{\sinh x}{\cosh x}=\frac{e^x-e^{-x}}{e^x+e^{-x}}

Tanh函数是 0 均值的,因此实际应用中 Tanh 会比 sigmoid 更好。但是仍然存在梯度饱和exp计算的问题。

RELU函数

f(x)=max(0,x)f(x) = max(0,x)

优点:

  1. 使用ReLU的SGD算法的收敛速度比 sigmoid 和 tanh 快。

  2. 在x>0区域上,不会出现梯度饱和、梯度消失的问题。

  3. 计算复杂度低,不需要进行指数运算,只要一个阈值就可以得到激活值。

缺点:

  1. ReLU的输出不是0均值的。

2. Dead ReLU Problem(神经元坏死现象) :ReLU在负数区域被kill的现象叫做dead relu。ReLU在训练的时很“脆弱”。在x<0时,梯度为0。这个神经元及之后的神经元梯度永远为0,不再对任何数据有所响应,导致相应参数永远不会被更新。

Leaky Relu

f(x)=max(0.01x,x)f(x)=max(0.01x,x)

渗漏整流线性单元(Leaky ReLU),为了解决dead ReLU现象。用一个类似0.01的小值来初始化神经元,从而使得ReLU在负数区域更偏向于激活而不是死掉。这里的斜率都是确定的

PRelu

f(x)=max(αx,x)f(x) = max(\alpha x,x)

MaxOut

hi(x)=maxj[1,k]zijh_i(x)=\max _{j \in[1, k]} z_{i j}

zij=xTW..ij+bijz_{i j}={x^T} W_{..ij} + b_{ij}

损失函数

损失率

当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能

Dropout说的简单一点就是:我们在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征、

为什么说Dropout可以解决过拟合?

(1)取平均的作用:  先回到标准的模型即没有dropout,我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。例如3个网络判断结果为数字9,那么很有可能真正的结果就是数字9,其它两个网络给出了错误结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。dropout掉不同的隐藏神经元就类似在训练不同的网络,随机删掉一半隐藏神经元导致网络结构已经不同,整个dropout过程就相当于对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

(2)减少神经元之间复杂的共适应关系:  因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况 。迫使网络去学习更加鲁棒的特征 ,这些特征在其它的神经元的随机子集中也存在。换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的特征。从这个角度看dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高。

隐藏层个数

epoch

所有训练集训练一次就是epoch

一般模型复杂度大的话epoch会大一些

过大有可能过拟合,取决于测试集的准确度

池化层大小

CNN kernel大小

优化算法

Momentum

SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum,加速 SGD 在正确方向的下降并抑制震荡。

mt=γmt1+ηgtm_t=\gamma m_{t-1}+\eta g_t

SGD-M 在原步长之上,增加了与上一时刻步长相关的mt1m_{t-1},� 通常取 0.9 左右。这意味着参数更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果

Adagrad

SGD、SGD-M 和 NAG 均是以相同的学习率去更新 � 的各个分量。而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有所区别。对于更新不频繁的参数(典型例子:更新 word embedding 中的低频词),我们希望单次步长更大,多学习一些知识;对于更新频繁的参数,我们则希望步长较小,使得学习到的参数更稳定,不至于被单个样本影响太多。

Adagrad[4] 算法即可达到此效果。其引入了二阶动量:

��=diag(∑�=1���,12,∑�=1���,22,⋯,∑�=1���,�2)

其中, ��∈��×� 是对角矩阵,其元素 ��,�� 为参数第 � 维从初始时刻到时刻 � 的梯度平方和。

此时,可以这样理解:学习率等效为 �/��+� 。对于此前频繁更新过的参数,其二阶动量的对应分量较大,学习率就较小。这一方法在稀疏数据的场景下表现很好。

RMSprop

在 Adagrad 中, �� 是单调递增的,使得学习率逐渐递减至 0,可能导致训练过程提前结束。为了改进这一缺点,可以考虑在计算二阶动量时不累积全部历史梯度,而只关注最近某一时间窗口内的下降梯度。根据此思想有了 RMSprop[5]。记 ��⊙�� 为 ��2 ,有

��=���−1+(1−�)⋅diag(��2)

其二阶动量采用指数移动平均公式计算,这样即可避免二阶动量持续累积的问题。和 SGD-M 中的参数类似,� 通常取 0.9 左右。

Adam

vtβ1vt1+(1β1)gtstβ2st1+(1β2)gt2\begin{aligned} & \mathbf{v}_t \leftarrow \beta_1 \mathbf{v}_{t-1}+\left(1-\beta_1\right) \mathbf{g}_t \\ & \mathbf{s}_t \leftarrow \beta_2 \mathbf{s}_{t-1}+\left(1-\beta_2\right) \mathbf{g}_t^2\end{aligned}

两种算法集合起来的优点

  • 适应性梯度算法(AdaGrad)为每一个参数保留一个学习率以提升在稀疏梯度(即自然语言和计算机视觉问题)上的性能。

  • 均方根传播(RMSProp)基于权重梯度最近量级的均值为每一个参数适应性地保留学习率。这意味着算法在非稳态和在线问题上有很有优秀的性能