赞
踩
在处理非线性分类问题时,往往需要使用多层神经网络。然而,多层神经网络的损失函数是一种复杂的不规则函数(即 不是凸函数),难于计算解析解(根据严格的推导和计算得到是方程的精确解)求解极值问题。这时,便需要梯度下降法通过不断迭代来求解极值。
梯度下降法:是一种常用的求函数极值的方法,其结果是数值解。
· 求解函数在某一点的梯度
· 梯度的方向:函数值变化最快的方向
· 沿着损失函数梯度方向更新权值
· 梯度为0时,停止迭代
(数值解:就是通过某种近似计算得到的解,在给定的精度下满足方程。)
三种梯度下降方法:
· 批量梯度下降法
· 随机梯度下降法
· 小批量梯度下降法
下面以便于理解的一元线性回归的损失函数来介绍这三种方法,这是一元线性回归的平方损失函数。
批量梯度下降法的特点:
· 每一次迭代都是用所有的样本来计算偏导数
· 由所有样本确定梯度方向
· 每一步都是准确地向着极值点趋近,迭代次数少
· 如果损失函数是凸函数,必定收敛于全局极小值
· 如果损失函数是非凸函数,则收敛于局部极小值点
· 可以利用向量运算进行并行计算
· 计算量大,训练时间长,不适合大规模数据集
在大规模的数据集中,通常会有很多大量冗余的数据,没有必要使用整个数据集计算梯度。
批量梯度下降法的适用范围:小规模数据集
随机梯度下降法:
· 每次迭代只选择一个样本训练模型,使网络的输出尽可能逼近这个样本的标签值
· 一轮:将所有样本都训练一遍称为一轮
· 反复训练多轮,直到网络对所有样本的误差足够小
· 参数更新非常频繁,无法快速收敛
· 不易于实现并行计算
举个例子,将10万个样本使用随机梯度下降法来训练模型,要将这10万个样本都训练一遍称为一轮(即迭代10万次)。由于每一次只使用一个样本训练模型,一个样本往往不具有整个样本特征的通用性,所以使用前面一个样本训练出的模型参数,不一定会使得后一个样本的误差更小,所以后一个样本需要重新训练网络。
可以推想到,虽然每一次迭代速度非常的快,但训练完一轮后,只是对最后一个训练的样本损失最小,后面的样本调整的模型参数很有可能会使得前面的样本损失加大,所以使用随机梯度下降法,并不具备很强的泛化能力(即对所有的样本的损失都足够小)。
因此,随机梯度下降法适用范围:很少采用。
小批量梯度下降法兼顾了前两种梯度下降法的特点,也可以称为小批量随机梯度下降算法(Mini-Batch SGD)
· 它是把数据分为多个小批量,每次迭代使用一个小批量来训练模型。
· 每个小批量中的所有样本共同决定了本次迭代中的梯度方向
· 一轮:使用所有小批量训练一遍
· 需要训练多轮,使网络对所有样本的误差足够小
· 每次迭代的训练样本数固定,与整个训练集的样本数量无关
· 可以实现并行运算
· 训练大规模数据集
小批量梯度下降法适用范围:大规模数据集。
这是小批量梯度下降法的模型参数更新迭代公式,如图所示。
若使用小批量梯度下降法需要注意,每一批量样本都要从数据集中随机抽取出来,使得它们的特征可以在一定程度上代表完整数据集的特征。
也就是说,要尽量保证每一批量的样本特点:
· 独立同分布:小批量样本能够代表整个样本集的特征
· 随机抽取:小批量样本的特征和整体样本的特征存在差别
至今也没有一个明确的标准每一批量需要多少个样本,在实际应用往往根据经验类比对比,从而找到一个相对合适的批量样本数量。但为了充分利用处理资源,经常使用2的幂数作为批量大小:32、64、128、256…
小批量梯度下降法与批量梯度下降法相比:小批量样本计算出的梯度和使用全体样本计算出的标准梯度之间存在偏差,但总体向最优化的方向前进。有趣的是,小批量样本计算出的梯度与标准梯度之间存在的这种偏差,相当于在样本中增加了噪声,小批量梯度下降法训练出的模型具备更好的泛化能力。
三种梯度下降法在损失函数上迭代的过程,如图所示。
叠在一起的圆圈是损失函数的等高线,红线是梯度下降的过程(从等高线最外⚪向损失函数极值点中心移动)
从图中我们可以看出,批量梯度下降法的每一步都是沿着函数值下降最快的方向迭代,该种方法更适合小规模数据集;随机批量下降法虽然总体走向是对的,但会走很多弯路,需要迭代很多很多次;小批量梯度下降法虽然没有第一个图的表现那么好,但也没有像第二个图偏离的太离谱,该种方法更适合大规模数据集。
对于非凸函数,会有局部极小值点和鞍点(驻点),如图所示。
使用前面所讲的传统的梯度下降法在非凸函数上面求极值点时,往往会陷入局部极小值点/鞍点。也就是说,在局部极小值点/鞍点上,梯度接近于0,迭代就停止了,或者在靠近局部极小值点/鞍点附近反复震荡。
所以,对于多层神经网络,使用传统的梯度下降法,从理论上就无法保证一定收敛到最小值点。
我们依然以一元线性回归为例,来介绍小批量梯度下降算法的优化。如下图所示,使用小批量梯度下降法参数更新迭代公式,从公式中我们可以找到影响小批量梯度下降法的因素。
影响小批量梯度下降法的主要因素:
· 小批量样本的选择xi,yi
· 批量大小t
· 学习率η
· 梯度
下面我们就根据这几种影响因素,来优化梯度算法。
·在每轮训练之前,打乱样本顺序(保证随机性和独立同分布)
· 批量中的样本数量越多,梯度方向越准确,迭代次数越少
· 批量中的样本数量越少,随机性越大,迭代次数越多
· 充分利用处理器资源,进行并行计算
使用2的幂数作为批量大小:32、64、128、256
在之前的梯度下降发中,学习率都是固定的,学习率设置过小,收敛速度慢; 学习率设置过大,震荡,无法收敛。但是如果在训练过程中,动态的调整学习率,就可以加快收敛。
学习率衰减算法又称为学习率退火算法(Learning Rate Annealing)。
对于凸函数,可以使用学习率退火算法,开始时,学习率较大,收敛速度快;随着迭代次数的增加,学习率逐渐减小,避免震荡,最终收敛于最小值点。
弊端:对于多层神经网络的非凸函数,由于函数过于复杂,仅使用学习率衰减算法仍然不能逃脱局部极小值点和鞍点。
所以,学习率退火算法适用范围:损失函数为凸函数的情况。
为解决非凸函数的学习率的调整问题,非凸函数的学习率要具有以下特性:
· 自适应调整每个参数的学习率
有以下几种自适应学习率算法
首先定义全局学习率η,每个模型参数自适应更新学习率η:
从公式中我们可以看出,每个参数学习率的变化是和当前点的梯度大小相关的,梯度越大,分母越大,学习率η衰减幅度越大,衰减速度越快。
AdaGrad算法在整体上,学习率随着迭代次数的增加而单调减少。
RMSprop和AdaDelta算法是对AdaGrad算法的改进,各参数的学习率不是单调递减的。
梯度下降法是沿着损失函数的梯度方向更新权值,在小批量梯度下降法中,完全依赖于当前批中样本的梯度,如果样本批量中含有比较大的噪声,就不能很好的反应全体样本的真实梯度,导致更新不稳定。
因此我们需要从梯度估计的方法入手,对算法进行改进和优化。
动量梯度下降法引入了物理学中我们熟知的动量的概念,使用动量梯度下降法在更新参数时可以一定程度的保留之前的更新方向。也就是说,利用当前小批量的梯度和积攒的历史梯度信息来共同决定最终更新方向,这样可以减少更新参数的随机性,增加稳定性,加快训练速度,摆脱局部极小值/鞍点区域。
动量梯度下降法的参数迭代公式:
从式中我们可以看出,参数更新的影响因素又增加了之前累积的动量项,使得之前参数的更新方向不会立刻消失,而是像物体的惯性一样保留了一部分之前的速度方向。这就使得如果梯度方向不变,步长会更大,收敛速度加快;如果梯度方向改变,步长变小,更新速度变慢,使网络更加稳定的收敛。
弊端:如果在接近最小值点时,梯度方向一直不变,就会积累很大的速度,冲出最小值区域,当然也会越过局部极小值点/鞍点。
牛顿梯度下降法可以根据当前更新方向,估算下一步的梯度方向,在新位置计算梯度,修正梯度方向,这种算法会更具有前瞻性,在走每一步时,都会看看下一步的梯度方向是什么样,从而修正自己的梯度方向。
牛顿加速梯度算法的参数更新公式:
牛顿加速梯度算法利用超前提梯度模型参数来校正当前梯度。
可以将两种算法组合使用,既可以自适调整学习率,又可以自适应调整梯度,使得参数收敛的更快更好。
需要注意的是,朋友们往往都喜欢采用最先进的算法,但是并不一定是越先进的算法优化效果就越好,这和数据集、模型超参数的选择…等都有关系,需要通过实践来总结和对比。
<注:本文主要参考了西安科技大学——《神经网络与深度学习 Tensorflow2.0实战》的内容>
<后续还会继续整理【神经网络与深度学习】相关内容,如果需要,可持续关注我哦~> |
<整理不易,留个赞或评论支持一下我吧^^>
如有疑问,欢迎批评指正^^
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。