目录
1. 优化算法背景
传统的机器学习会小心设计目标函数和约束,以确保优化问题是凸的,从而避免一般优化问题的复杂度。在训练神经网络时,首先,会遇到大量的非凸优化情况;其次,由于巨大的数据量导致训练速度很慢,无法使深度学习发挥最大效果。本文总结了一些常见的梯度下降优化算法能够帮助我们快速训练模型,提高计算效率。
1.1 常见优化问题
1.1.1 梯度消失或梯度爆炸
- 目前神经网络中损失函数计算的误差是通过梯度反向传播的方式指导深度网络权值的更新优化
- 其中将误差从末层往前传递的过程需要链式法则(BP算法是GD在Chain Rule中的应用)
- 而链式法则是连乘的形式,所以当层数越深的时候,梯度将以指数形式传播,梯度消失和爆炸问题一般随着网络层数的增加变得越来越明显
- 假设(g为激活函数),对于目标输出有:
- 对于的情况,梯度值将以指数级递增。反之亦然。
1.1.2 局部最小值
- 对于非凸函数,如神经网络,有可能会存在多个局部极小值。事实上,几乎所有的深度模型基本上都会有非常多的局部极小值。
- 学者们猜想,对于足够大的神经网络而言,大部分局部最小值都有很小的代价函数,我们能不能找到真正的全局最小点并不重要,而是需要在参数空间中找到一个代价很小(但不是最小)的点。
- 实际上,对于很多高维非凸函数而言,局部极小值都远少于另一类梯度为零的点:鞍点。鞍点附近的某些点比鞍点有更大的代价,而其它点则有更小的代价。鞍点附近的平稳段会使得学习非常慢
- Momentum、RMSProp以及Adam优化算法能够帮助尽早走出平稳段,加速学习
1.2 常用解决办法
解决办法有很多种,可以从参数的初始化策略、获取梯度的训练集大小、学习率以及梯度下降算法等角度入手,本文主要针对梯度下降算法展开介绍
1.2.1 参数初始化策略
- 好的初始化可以让神经元各层激活值不会出现饱和现象,并且也不能为0
- 常用的初始化方法
- 随机初始化:搞一些很小的值进行初始化,实验表明大了就容易饱和,小的就激活不动
- 标准初始化:权重参数满足某一分布
- Xavier初始化:【首先有一个共识必须先提出:神经网络如果保持每层的信息流动是同一方差,那么会更加有利于优化】
- Xavier Glorot认为还不够,应该增强这个条件,好的初始化应该使得各层的激活值和梯度的方差在传播过程中保持一致,这个被称为Glorot条件
- 如果反向传播每层梯度保持近似的方差,则信息能反馈到各层。而前向传播激活值方差近似相等,有利于平稳地学习
- 这就要求激活函数满足:①线性;②激活值关于0对称。该初始化方法适合tanh函数
- He初始化:适用于ReLU激活函数
💡 实际考虑:①预训练;②从激活函数入手,让梯度流动起来不要进入饱和区;③归一化,BN让每一层的输入输出的分布比较一致,降低学习难度
参考来源:什么是深度学习成功的开始?参数初始化(xavier,he等) - 知乎 (zhihu.com)
1.2.2 小批量梯度下降
- 如果训练数据集很大的时候,每一步梯度下降法对整个训练集进行一次处理,速度比较慢
- 所以换一种方式,每次处理训练数据的一部分进行梯度下降法,则算法速度会执行的更快
- Mini-Batch 梯度下降法(小批量梯度下降法)每次同时处理固定大小的数据集
- mini-batch 的大小为 1,即随机梯度下降法(stochastic gradient descent)
- batch梯度下降法和Mini-batch 梯度下降法代价函数的变化趋势如下:
- 选择一个合适大小的BatchSize进行Mini-Batch GD,可以实现快速学习,也应用了向量化带来的好处,且成本函数的下降处于两者之间
- BatchSize的选择
- 如果训练样本的大小比较小,如时,选择 batch 梯度下降法
- 如果训练样本的大小比较大,选择 Mini-Batch 梯度下降法
- 为了和计算机的信息存储方式相适应,代码在 mini-batch 大小为 2 的幂次时运行要快一些。典型的大小为,mini-batch 的大小要符合 CPU/GPU 内存
- 需要根据经验快速尝试,找到能够最有效地减少成本函数的值
1.2.3 梯度下降算法优化(本文关注)
1.2.4 其他非算法优化方式
- 对网络输入的特征进行标准化,能够缓解梯度消失或爆炸问题。标准化公式
- 下图,左图为标准化输入,右图为原始输入
- 标准化前后损失函数对比如下。因此,对于梯度下降无论从哪个位置开始迭代,都能以相对较少的迭代次数找到全局最优解。加速网络的学习。
2. 梯度下降算法优化
2.1 动量梯度下降
- 计算梯度的指数加权平均值,并利用该值来更新参数值。动量梯度下降算法的整个过程如下:
- 使用动量梯度下降时,通过累加过去的梯度值来减少抵达最小值路径上的波动,加速了收敛,因此在横轴方向下降得更快,从而得到图中红色或者紫色的曲线。
- 当前后梯度方向一致时,动量梯度下降能够加速学习;而前后梯度方向不一致时,动量梯度下降能够抑制震荡。
- 我们可以这样形象的理解,小球在向下运动过程中会有加速度,导致越来越快,由于β的存在使得不会一直加速运行
2.2 RMSProp算法
- RMSProp(Root Mean Square Prop)算法是在对梯度进行指数加权平均的基础上,引入平方和平方根
- 其中是一个非常小的数,防止分母太小导致不稳定,当 或较大时,,会较大,进而也会较大,最终使等结果变得非常小
- 最终RMSProp 有助于减少抵达最小值路径上的摆动,并允许使用一个更大的学习率 α,从而加快算法学习速度
2.3 Adam算法
- Adam 优化算法(Adaptive Moment Estimation,自适应矩估计)将 Momentum 和 RMSProp 算法结合在一起
- 假设用每一个 mini-batch 计算 dW、db,第t次迭代时:
- 其中l为某一层,t为移动平均第次的值
- Adam 算法的参数更新:
- TensorFlow Adam算法API
tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999,
epsilon=1e-08,name='Adam')
Adam 优化算法有很多的超参数:
- 学习率α:需要尝试一系列的值,来寻找比较合适的
- β1:常用的缺省值为 0.9
- β2:Adam 算法的作者建议为 0.999
- ϵ:Adam 算法的作者建议为epsilon的默认值1e-8
注:β1、β2、ϵ 通常不需要调试
2.4 学习率衰减
- 如果设置一个固定的学习率 α,在最小值点附近,由于不同的 batch 中存在一定的噪声,因此不会精确收敛,而是始终在最小值周围一个较大的范围内波动。
- 如果随着时间慢慢减少学习率 α 的大小,在初期 α 较大时,下降的步长较大,能以较快的速度进行梯度下降;而后期逐步减小 α 的值,即减小步长,有助于算法的收敛,更容易接近最优解。
- 最常用的学习率衰减方法:
- 其中,decay_rate为衰减率(超参),epoch_num为将所有的训练样本完整过一遍的次数。
- 还有一种指数衰减:
- 对于大型的数据模型,需要使用这些方式去自动进行学习率衰减。而一些小型网络可以直接手动进行调整
- 最后来看一张动态图,表示不同优化的算法的效果图