大话深度学习(五)优化神经网络的方法

大话深度学习(五)优化神经网络的方法

前言

一般的神经网络的训练过程大致分为两个阶段:
第一阶段:先通过前向传播算法得到预测值,将预测值与真实值做比较,得到二者之间的差别
第二阶段:通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习旅使用梯度下降算法更新每一个参数

梯度下降算法

梯度下降算法(gradient descent)是一个最优化算法,常用于机器学习和人工智能当中用来递归性地逼近最小偏差模型。
对于一个函数J(θ)J\left(\theta \right ),其在参数θ\theta的的梯度为J(θ)θ\frac{\partial J\left(\theta \right )}{\partial \theta}.有了梯度,还需要通过学习率α\alpha,学习率是一个很小的数,就是该函数,朝着导数的方向进行细微的减少。大话深度学习(五)优化神经网络的方法
如下图,函数 J(x)=x2的初始位置在蓝色的点x=10,经过上面公式的一次次迭代,x逐渐的逐渐减小,直到趋近于0,当x趋近于0,x在零的导数也为0,此时改点称为J(x)的局部极小点。但导数为零的点不一定就一定是取得极大值或者极小值,例如鞍点。大话深度学习(五)优化神经网络的方法
如下图,如果J(x)如下图函数图像复杂,我们通常寻找一个极小值做为近似于最小值,对于深度学习,即使不能寻找到损失函数的最小值,只要我们能够找到一点,只要它显著低于损失函数的绝大部分,我们就能接受这样的解。
大话深度学习(五)优化神经网络的方法
其次就是需要注意到,当学习率太低,梯度下降算法计算的时间过长,特别在复杂的神经网络结构中,更会增加了训练数据的时间,所以为了加快每一轮参数的更新速度,可以使用随机梯度下降算法(SGD)

随机梯度下降算法

相比于梯度下降算法,随机梯度下降算法不会对全部的训练数据上的损失函数进行优化,而是在每一轮的迭代中随机的选择一个或者多个训练数据上的损失函数进行梯度下降优化。
随机梯度下降算法的核心思想就是通过部分的样本近似的去估计梯度。例如在十几万个数据样本中,我们可以随机抽取几百个样本进行梯度下降优化。
由于这种思想,也可以很明显看出SGD的一个明显的缺点在某些数据上的损失函数更小,但这并不能代表全体数据损失函数更小。(部分样本的损失函数不能代表整体样本损失函数)。
为平衡两种梯度下将算法的性能,通常会计算一小部分训练数据的总损失函数,这一小部分数据就是一个batch。使用每次在一个batch上优化神经网络参数的方法并不会比每次优化单个数据慢太多,大门可以大大减少收敛所需要的迭代次数,最终的结果更加接近于梯度下降的结果。

自适应学习率算法

在使用基本的梯度下降优化算法会出现一个问题:
对于一些参数,通过梯度下降算法已经优化到极小值附近,但参数的梯度却很大,这就是使用全局学习率(学习率不变)出现的问题。学习率太小,收敛速度慢,学习率大,已经优化好的参数出现不稳定的情况
由此为了更加有效的训练模型,提出了一个比较合理的做法:
1.不同的参数设置不同的学习率
2.通过算法,每个参数的学习率在学习的过程中会做出适当的改变
在早期,Delta-ba_delta算法实现了在训练时适应模型参数各自的学习率,该算法的核心思想就是:如果损失与某个指定参数的偏导数符号相同,学习率应该增加;符号不同,学习率就应该减少。

1.AdaGrad

AdaGrad 算法,如下图所示,独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平方值总和的平方根 (Duchi et al., 2011)。具有损失最大偏导的参数相应地有一个快速下降的学习率,而具有小偏导的参数在学习率上有相对较小的下降。净效果是在参数空间中更为平缓的倾斜方向会取得更大的进步。在凸优化背景中, AdaGrad 算法具有一些令人满意的理论性质。然而,经验上已经发现,对于训练深度神经网络模型而言, 从训练开始时积累梯度平方会导致有效学习率过早和过量的减小。 AdaGrad 在某些深度学习模型上效果不错,但不是全部。大话深度学习(五)优化神经网络的方法
AdaGrad算法在训练来时就对梯度平方进行积累,在一些实验中,会发现这种做法容易导致学习率过早和过量的减少

2.RMSProp

RMSProp 算法 (Hinton, 2012) 修改 AdaGrad 以在非凸设定下效果更好,改
变梯度积累为指数加权的移动平均。 AdaGrad 旨在应用于凸问题时快速收敛。当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。 AdaGrad 根据平方梯度的整个收缩学习率,可能使得学习率在达到这样的凸结构前就变得太小了。 RMSProp 使用指数衰减平均以丢弃遥远过去的历史,使其能够在找到凸碗状结构后快速收敛,它就像一个初始化于该碗状结构的 AdaGrad 算法实例。RMSProp 的标准形式如算法 8.5 所示,结合 Nesterov 动量的形式如算法 8.6 所示。相比于 AdaGrad,使用移动平均引入了一个新的超参数ρ,用来控制移动平均的长度范围。经验上, RMSProp 已被证明是一种有效且实用的深度神经网络优化算法。目前它是深度学习从业者经常采用的优化方法之一。
大话深度学习(五)优化神经网络的方法
大话深度学习(五)优化神经网络的方法

3.Adam

Adam (Kingma and Ba, 2014) 是另一种学习率自适应的优化算法,如算法 8.7 所示。 “Adam’’ 这个名字派生自短语 “adaptive moments’’。早期算法背景下,它也许最好被看作结合 RMSProp 和具有一些重要区别的动量的变种。首先,在 Adam 中,动量直接并入了梯度一阶矩(指数加权)的估计。将动量加入 RMSProp 最直观的方法是将动量应用于缩放后的梯度。结合缩放的动量使用没有明确的理论动机。其次, Adam 包括偏置修正,修正从原点初始化的一阶矩(动量项)和(非中心的)二阶矩的估计(算法 8.7 )。 RMSProp 也采用了(非中心的)二阶矩估计,然而缺失了修正因子。因此,不像 Adam,RMSProp 二阶矩估计可能在训练初期有很高的偏置。Adam 通常被认为对超参数的选择相当鲁棒,尽管学习率有时需要从建议的默认修改。

大话深度学习(五)优化神经网络的方法
参考资料
Tensorflow 深度学习算法原理与编程实战
简单粗暴 TensorFlow 2.0
Tensorflow官网
深度学习之自适应学习率算法