深度学习教程 | 神经网络优化算法

简介: 本节介绍深度神经网络中的一些优化算法,使用这些技巧和方法来提高神经网络的训练速度和精度:mini-batch,随机梯度下降,指数加权平均,动量梯度下降、RMSprop和Adam算法,学习率衰减法等。

ShowMeAI研究中心

作者:韩信子 @ShowMeAI
教程地址http://www.showmeai.tech/tutorials/35
本文地址http://www.showmeai.tech/article-detail/217
声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI 查看更多精彩内容


第2门课 改善深层神经网络:超参数调试、正则化以及优化,第2周:优化算法
本系列为吴恩达老师《深度学习专项课程 (Deep Learning Specialization) 》学习与总结整理所得,对应的课程视频可以在 这里 查看。


引言

ShowMeAI 前一篇文章 深度学习的实用层面 中我们对以下内容进行了介绍:

  • Train / Dev / Test sets 的切分和比例选择
  • Bias 和 Variance 的相关知识
  • 防止过拟合的方法:L2 正则化和 Dropout
  • 规范化输入以加快梯度下降速度和精度
  • 梯度消失和梯度爆炸的原因及处理方法
  • 梯度检查

本篇内容展开介绍深度神经网络中的一些优化算法,通过使用这些技巧和方法来提高神经网络的训练速度和精度。

1.Batch梯度下降法

Mini-batch梯度下降 Mini-batch Gradient Descent

Batch梯度下降法 (批梯度下降法) 是最常用的梯度下降形式,它是基于整个训练集的梯度下降算法,在更新参数时使用所有的样本来进行更新。

对整个训练集进行梯度下降法的时候,我们必须处理整个训练数据集,然后才能进行一步梯度下降,即每一步梯度下降法需要对整个训练集进行一次处理,如果训练数据集很大的时候,处理速度就会比较慢。

但是如果每次处理训练数据的一部分,基于这个子集进行梯度下降法,算法迭代速度会更快。而处理的这些一小部分训练子集即称为 Mini-Batch,这个算法也就是我们说的 Mini-Batch 梯度下降法

2.Mini-Batch梯度下降法

理解 Mini-batch 梯度下降 Understanding Mini-batch Gradient Descent

Mini-Batch梯度下降法 (小批量梯度下降法) 每次同时处理单个的 Mini-Batch,其他与 Batch 梯度下降法一致。

使用 Batch 梯度下降法,对整个训练集的一次遍历只能做一个梯度下降;而使用 Mini-Batch 梯度下降法,对整个训练集的一次遍历 (称为一个 epoch) 能做 Mini-Batch 个数个梯度下降。之后,可以一直遍历训练集,直到最后收敛到一个合适的精度。

Batch vs Mini-Batch 梯度下降法

Batch 梯度下降法和 Mini-Batch 梯度下降法代价函数的变化趋势如上图所示:

  • 使用 Batch gradient descent,随着迭代次数增加,cost 是不断减小的。
  • 使用 Mini-batch gradient descent,随着在不同的 mini-batch 上迭代训练,cost 并不是单调下降,而是振荡下降的,最终也能得到较低的 cost 值。出现细微振荡的原因是不同的 mini-batch 之间是有差异的。例如可能第一个子集 equation?tex=%28X%5E%7B%5C%7B1%5C%7D%7D%2CY%5E%7B%5C%7B1%5C%7D%7D%29 是好的子集,而第二个子集 equation?tex=%28X%5E%7B%5C%7B2%5C%7D%7D%2CY%5E%7B%5C%7B2%5C%7D%7D%29 包含了一些噪声noise。出现细微振荡是正常的。

2.1 Batch大小及影响

我们在训练神经网络的时候,使用mini-batch gradient descent,经常要指定一个batch批次的样本数量。而不同的batch大小会影响训练的过程,其中有2个特例,mini-batch gradient descent会退化为不同的算法:

  • Mini-Batch的大小为1,即是随机梯度下降法 (stochastic gradient descent) ,每个样本都是独立的 Mini-Batch。
  • Mini-Batch的大小为 equation?tex=m (数据集大小) ,即是 Batch 梯度下降法。

Batch vs Mini-Batch 梯度下降法

如上图,我们对比一下Batch gradient descentStachastic gradient descent的梯度下降曲线。

  • 图中蓝色的线代表Batch gradient descent。Batch gradient descent会比较平稳地接近全局最小值,但是因为使用了所有m个样本,每次前进的速度有些慢。
  • 图中紫色的线代表Stochastic gradient descent。Stochastic gradient descent每次前进速度很快,但是路线曲折,有较大的振荡,最终会在最小值附近来回波动,难以真正达到最小值处。而且在数值处理上就不能使用向量化的方法来提高运算速度。

(1) Batch梯度下降法 (Batch gradient descent)

  • 对所有 m 个训练样本执行一次梯度下降,每一次迭代时间较长,训练过程慢
  • 相对噪声低一些,幅度也大一些。
  • 成本函数总是向减小的方向下降。

(2) 随机梯度下降法 (Stochastic gradient descent)

  • 对每一个训练样本执行一次梯度下降,训练速度快,但丢失了向量化带来的计算加速
  • 有很多噪声,减小学习率可以适当。
  • 成本函数总体趋势向全局最小值靠近,但永远不会收敛,而是一直在最小值附近波动。

(3) Mini-Batch gradient descent

实际使用中,batch size 不能设置得太大 (会倾向于Batch gradient descent) ,也不能设置得太小 (倾向于Stochastic gradient descent)。

选择一个【1<size<m】的合适的大小进行 Mini-Batch 梯度下降,可以实现快速学习,也应用了向量化带来的好处,且成本函数的下降处于前两者之间。

Batch vs Mini-Batch 梯度下降法

mini-batch gradient descent 的梯度下降曲线如图绿色曲线所示,每次前进速度较快,且振荡较小,基本能接近全局最小值

2.2 Batch大小的选择

吴恩达老师也给出了一些关于 batch 大小选择的经验:

  • 训练样本量小 (如 equation?tex=m%20%5Cle%20%202000) ,选择Batch梯度下降法。
  • 训练样本量大,选择 Mini-Batch 梯度下降法。
  • 与计算机的信息存储方式相适应,代码在Batch大小为2的幂次时运行要快一些,典型的大小为 equation?tex=2%5E6equation?tex=2%5E7、…、 equation?tex=2%5E9
  • Batch 的大小要匹配 CPU/GPU 内存。

Batch vs Mini-Batch 梯度下降法

Batch 的大小是重要的超参数,需要根据经验快速尝试,找到能够最有效地减少成本函数的值。

2.3 获得Mini-Batch的步骤

前面提到了 batch 大小的选择方法,当我们确定 batch 大小后,在应用 mini-batch 梯度下降算法时,可以通过以下方式获得 1 个 Batch 的数据:

  • 将数据集打乱
  • 按照既定的大小分割数据集

其中打乱数据集的代码:

Mini-Batch梯度下降法

# 获得样本数量
m = X.shape[1] 
# 对m个样本进行乱序
permutation = list(np.random.permutation(m))
# 取出洗牌之后的样本特征和标签
shuffled_X = X[:, permutation]
shuffled_Y = Y[:, permutation].reshape((1,m))

(上述python代码使用到numpy工具库,想了解更多的同学可以查看ShowMeAI图解数据分析 系列中的numpy教程,也可以通过ShowMeAI 制作的 numpy速查手册 快速了解其使用方法)

代码解读

np.random.permutationnp.random.shuffle 有两处不同:

  • 如果传给 permutation 一个矩阵,它会返回一个洗牌后的矩阵副本;而 shuffle 只是对一个矩阵进行洗牌,没有返回值。
  • 如果传入一个整数,它会返回一个洗牌后的 arange

2.4 符号表示

在进一步讲解优化算法之前,我们来对数学标记做一个统一和说明:

  • 我们使用小括号上标 equation?tex=i 表示训练集里的值,equation?tex=x%5E%7B%28i%29%7D 是第 equation?tex=i 个训练样本。
  • 我们使用中括号上标 equation?tex=l 表示神经网络的层数,equation?tex=z%5E%7B%5Bl%5D%7D 表示神经网络中第 equation?tex=l 层的 equation?tex=z 值。
  • 我们使用上标 equation?tex=t 来代表不同的Batch数据,即 equation?tex=X%5E%7Bt%7Dequation?tex=Y%5E%7Bt%7D

3.指数加权平均

指数加权平均 Exponentially Weighted Averages

下面我们将介绍指数加权平均 (Exponentially weighted averages) 的概念。

举个例子,记录半年内伦敦市的气温变化,并在二维平面上绘制出来,如下图所示:

指数加权平均数

看上去,温度数据似乎有noise,而且抖动较大。如果我们希望看到半年内气温的整体变化趋势,可以通过「移动平均」 (moving average) 的方法来对每天气温进行平滑处理。

例如我们可以设 equation?tex=V_0%3D0,当成第0天的气温值。

第一天的气温与第0天的气温有关:

equation?tex=V_1%3D0.9V_0%2B0.1%5Ctheta_1

第二天的气温与第一天的气温有关:

equation?tex=%5Cbegin%7Baligned%7D%20V_2%20%26%3D0.9V_1%2B0.1%5Ctheta_2%5C%5C%20%26%3D0.9%280.9V_0%2B0.1%5Ctheta_1%29%2B0.1%5Ctheta_2%5C%5C%20%26%3D0.9%5E2V_0%2B0.9%5Ccdot0.1%5Ctheta_1%2B0.1%5Ctheta_2%20%20%5Cend%7Baligned%7D

第三天的气温与第二天的气温有关:

equation?tex=%5Cbegin%7Baligned%7D%20V_3%20%26%3D%200.9V_2%2B0.1%5Ctheta_3%5C%5C%20%20%26%3D%200.9%280.9%5E2V_0%2B0.9%5Ccdot0.1%5Ctheta_1%2B0.1%5Ctheta_2%29%2B0.1%5Ctheta_3%5C%5C%20%20%26%3D%200.9%5E3V_0%2B0.9%5E2%5Ccdot%200.1%5Ctheta_1%2B0.9%5Ccdot%200.1%5Ctheta_2%2B0.1%5Ctheta_3%20%20%5Cend%7Baligned%7D

即第 equation?tex=t 天与第 equation?tex=t-1 天的气温迭代关系为:

指数加权平均数


经过「移动平均」 (moving average) 处理得到的气温如下图红色曲线所示:

指数加权平均数

这种滑动平均算法称为指数加权平均 (exponentially weighted average)。根据前面的例子,我们可以看到它的推导公式一般形式为:equation?tex=V_t%3D%5Cbeta%20V_%7Bt-1%7D%2B%281-%5Cbeta%29%5Ctheta_t

其中指数加权平均的天数由 equation?tex=%5Cbeta 值决定,近似表示为 equation?tex=%5Cfrac%7B1%7D%7B1-%5Cbeta%7D。上面的例子中:

  • equation?tex=%5Cbeta%3D0.9,则 equation?tex=%5Cfrac%7B1%7D%7B1-%5Cbeta%7D%3D10,表示将前10天进行指数加权平均。
  • equation?tex=%5Cbeta%3D0.98,则 equation?tex=%5Cfrac%7B1%7D%7B1-%5Cbeta%7D%3D50,表示将前50天进行指数加权平均。

指数加权平均数

equation?tex=%5Cbeta 值越大,则指数加权平均的天数越多,平均后的趋势线就越平缓,但是同时也会向右平移。上图中绿色曲线和橙色曲线分别表示了 equation?tex=%5Cbeta%3D0.98equation?tex=%5Cbeta%3D0.5 时,指数加权平均的结果。

公式解释

这里的 equation?tex=%5Cfrac%7B1%7D%7B1-%5Cbeta%7D 是怎么来的呢?就标准数学公式来说,指数加权平均算法跟之前所有天的数值都有关系。

但是指数是衰减的,一般认为衰减到 equation?tex=%5Cfrac1e 就可以忽略不计了。因此,根据之前的推导公式,我们只要证明 equation?tex=%5Cbeta%5E%7B%5Cfrac%7B1%7D%7B1-%5Cbeta%7D%7D%3D%5Cfrac1e 就好了。

equation?tex=%5Cfrac%7B1%7D%7B1-%5Cbeta%7D%3DNequation?tex=N%3E0,则 equation?tex=%5Cbeta%3D1-%5Cfrac%7B1%7D%7BN%7Dequation?tex=%5Cfrac1N%3C1。即证明转化为 equation?tex=%281-%5Cfrac1N%29%5EN%3D%5Cfrac1e

显然,当 equation?tex=N%3E%3E0 时,上述等式是近似成立的。这就简单解释了为什么指数加权平均的天数的计算公式为 equation?tex=%5Cfrac%7B1%7D%7B1-%5Cbeta%7D


综上,指数加权平均 (Exponentially Weight Average)是一种常用的序列数据处理方式,计算公式为:

equation?tex=S_t%20%3D%20%20%5Cbegin%7Bcases%7D%20%20Y_1%2C%20%26t%20%3D%201%20%5C%5C%20%20%5Cbeta%20S_%7Bt-1%7D%20%2B%20%281-%5Cbeta%29Y_t%2C%20%26t%20%3E%201%20%20%5Cend%7Bcases%7D

其中 equation?tex=Y_tequation?tex=t 下的实际值,equation?tex=S_tequation?tex=t 下加权平均后的值,equation?tex=%5Cbeta 为权重值。

指数加权平均数在统计学中被称为“指数加权移动平均值”。

3.1 理解指数平均加权

理解指数加权平均 Understanding Exponentially Weighted Averages

我们将指数加权平均公式的一般形式写下来:

equation?tex=%5Cbegin%7Baligned%7D%20V_t%20%26%3D%5Cbeta%20V_%7Bt-1%7D%2B%281-%5Cbeta%29%5Ctheta_t%5C%5C%20%26%20%3D%281-%5Cbeta%29%5Ctheta_t%2B%281-%5Cbeta%29%5Ccdot%5Cbeta%5Ccdot%5Ctheta_%7Bt-1%7D%2B%281-%5Cbeta%29%5Ccdot%20%5Cbeta%5E2%5Ccdot%5Ctheta_%7Bt-2%7D%2B%5Ccdots%2B%281-%5Cbeta%29%5Ccdot%20%5Cbeta%5E%7Bt-1%7D%5Ccdot%20%5Ctheta_1%2B%5Cbeta%5Et%5Ccdot%20V_0%20%5Cend%7Baligned%7D


观察上述推导得到的计算公式,其中:

  • equation?tex=%5Ctheta_t , equation?tex=%5Ctheta_%7Bt-1%7D , equation?tex=%5Ctheta_%7Bt-2%7D ,..., equation?tex=%5Ctheta_1 是原始数据值。
  • equation?tex=%281-%5Cbeta%29 , equation?tex=%281-%5Cbeta%29%5Cbeta , equation?tex=%281-%5Cbeta%29%5Cbeta%5E2 ,..., equation?tex=%281-%5Cbeta%29%5Cbeta%5E%7Bt-1%7D 是类似指数曲线,从右向左,呈指数下降的。


如果我们把每个时间点的 equation?tex=%5Ctheta 和衰减指数写成向量形式,则最终指数加权平均结果 equation?tex=V_t 相当于两者的点乘。将原始数据值与衰减指数点乘,相当于做了指数衰减,随距离越远衰减越厉害 (注意到 equation?tex=%5Cbeta 小于1) ,有如下结论:

  • 离得越近的数据点,影响越大,离得越远的数据点,影响越小。

指数加权平均数

equation?tex=%5Cbeta%20%3D%200.9 时,

equation?tex=v_%7B100%7D%20%3D%200.9v_%7B99%7D%20%2B%200.1%20%5Ctheta_%7B100%7D

equation?tex=v_%7B99%7D%20%3D%200.9v_%7B98%7D%20%2B%200.1%20%5Ctheta_%7B99%7D

equation?tex=v_%7B98%7D%20%3D%200.9v_%7B97%7D%20%2B%200.1%20%5Ctheta_%7B98%7D

展开:

equation?tex=v_%7B100%7D%20%3D%200.1%20%5Ctheta_%7B100%7D%20%2B%200.1%20%2A%200.9%20%5Ctheta_%7B99%7D%20%2B%200.1%20%2A%20%7B%280.9%29%7D%5E2%20%5Ctheta_%7B98%7D%20%2B%20%5Cdots

其中,equation?tex=%5Ctheta_i 指第 equation?tex=i 天的实际数据。所有 equation?tex=%5Ctheta 前面的系数 (不包括0.1) 相加起来为1或者接近于1,这些系数被称作偏差修正 (Bias Correction)


根据函数极限的一条定理

equation?tex=%7B%5Clim_%7B%5Cbeta%5Cto%200%7D%7D%281%20-%20%5Cbeta%29%5E%7B%5Cfrac%7B1%7D%7B%5Cbeta%7D%7D%20%3D%20%5Cfrac%7B1%7D%7Be%7D%20%5Capprox%200.368

equation?tex=%5Cbeta%20%3D%200.9 时,可以当作把过去10天的气温指数加权平均作为当日的气温,因为10天后权重已经下降到了当天的1/3左右。同理,当 equation?tex=%5Cbeta%20%3D%200.98 时,可以把过去50天的气温指数加权平均作为当日的气温。

因此,在计算当前时刻的平均值时,只需要前一天的平均值和当前时刻的值。

equation?tex=v_t%20%3D%20%5Cbeta%20v_%7Bt-1%7D%20%2B%20%281%20-%20%5Cbeta%29%5Ctheta_t

在实际代码中,只需要不断迭代赋值更新 equation?tex=v 即可:

equation?tex=v%20%3A%3D%20%5Cbeta%20v%20%2B%20%281%20-%20%5Cbeta%29%5Ctheta_t

指数平均加权并不是最精准的计算平均数的方法,你可以直接计算过去10天或50天的平均值来得到更好的估计,但缺点是保存数据需要占用更多内存,执行更加复杂,计算成本更加高昂。

指数加权平均数公式的好处之一在于它只需要一行代码,且占用极少内存,因此效率极高,且节省成本。

3.2 指数平均加权的偏差修正

指数加权平均的偏差修正 Bias Correction in Exponentially Weighted Averages

equation?tex=%5Cbeta%3D0.98 时,前面提到的气温示例,指数加权平均结果如绿色曲线。但实际上真实曲线如紫色曲线所示:

指数加权平均数

紫色曲线与绿色曲线的区别是,紫色曲线开始的时候相对较低一些。因为开始时设置 equation?tex=v_0%20%3D%200,所以初始值会相对小一些,直到后面受前面的影响渐渐变小,趋于正常。


修正这种问题的方法是进行偏移校正 (bias correction),即在每次计算完 equation?tex=v_t 后,对 equation?tex=v_t 进行下式处理:

equation?tex=%7BV_t%7D%3D%5Cfrac%7BV_t%7D%7B1-%5Cbeta%5Et%7D

换算到迭代公式中,即有 equation?tex=v_t%20%3D%20%5Cfrac%7B%5Cbeta%20v_%7Bt-1%7D%20%2B%20%281%20-%20%5Cbeta%29%5Ctheta_t%7D%7B%7B1-%5Cbeta%5Et%7D%7D


观察上式:随着 equation?tex=t 的增大,equation?tex=%5Cbetaequation?tex=t 次方趋近于0。因此当 equation?tex=t 很大的时候,偏差修正几乎没有作用,但是在前期学习可以帮助更好的预测数据。

4.动量梯度下降法

Momentum梯度下降 Gradient Descent with Momentum

4.1 从指数加权平均到动量梯度下降

大家已经了解了指数加权平均,现在我们回到神经网络优化算法,介绍一下动量梯度下降算法,其速度要比传统的梯度下降算法快很多。做法是在每次训练时,计算梯度的指数加权平均数,并利用该值来更新权重 equation?tex=W 和常数项 equation?tex=b

具体过程为:for l = 1, .. , L

equation?tex=v_%7BdW%5E%7B%5Bl%5D%7D%7D%20%3D%20%5Cbeta%20v_%7BdW%5E%7B%5Bl%5D%7D%7D%20%2B%20%281%20-%20%5Cbeta%29%20dW%5E%7B%5Bl%5D%7D

equation?tex=v_%7Bdb%5E%7B%5Bl%5D%7D%7D%20%3D%20%5Cbeta%20v_%7Bdb%5E%7B%5Bl%5D%7D%7D%20%2B%20%281%20-%20%5Cbeta%29%20db%5E%7B%5Bl%5D%7D

equation?tex=W%5E%7B%5Bl%5D%7D%20%3A%3D%20W%5E%7B%5Bl%5D%7D%20-%20%5Calpha%20v_%7BdW%5E%7B%5Bl%5D%7D%7D

equation?tex=b%5E%7B%5Bl%5D%7D%20%3A%3D%20b%5E%7B%5Bl%5D%7D%20-%20%5Calpha%20v_%7Bdb%5E%7B%5Bl%5D%7D%7D

其中,将动量衰减参数 equation?tex=%5Cbeta 设置为0.9是超参数的一个常见且效果不错的选择。当 equation?tex=%5Cbeta 被设置为0时,显然就成了 Batch 梯度下降法。

4.2 梯度下降 vs 动量梯度下降

我们用下图来对比一下优化算法的优化过程

动量梯度下降法

图中:

  • 蓝色曲线:使用一般的梯度下降的优化过程,由于存在上下波动,减缓了梯度下降的速度,因此只能使用一个较小的学习率进行迭代。
  • 紫色曲线:使用一般梯度下降+较大的学习率,结果可能偏离函数的范围。
  • 红色曲线:使用动量梯度下降,通过累加过去的梯度值来减少抵达最小值路径上的波动,加速了收敛,因此在横轴方向下降得更快。

当前后梯度方向一致时,动量梯度下降能够加速学习;而前后梯度方向不一致时,动量梯度下降能够抑制震荡。


另外,在10次迭代之后,移动平均已经不再是一个具有偏差的预测。因此实际在使用梯度下降法或者动量梯度下降法时,不会同时进行偏差修正。

补充:在其它文献资料中,动量梯度下降还有另外一种写法:

equation?tex=V_%7BdW%7D%3D%5Cbeta%20V_%7BdW%7D%2BdW

equation?tex=V_%7Bdb%7D%3D%5Cbeta%20V_%7Bdb%7D%2Bdb

即消去了 equation?tex=dWequation?tex=db 前的系数 equation?tex=%281-%5Cbeta%29。这样简化了表达式,但是学习因子 equation?tex=%5Calpha 相当于变成了 equation?tex=%5Cfrac%7B%5Calpha%7D%7B1-%5Cbeta%7D,表示 equation?tex=%5Calpha 也受 equation?tex=%5Cbeta 的影响。从效果上来说,这种写法也是可以的,但是不够直观,且调参涉及到 equation?tex=%5Calpha,不够方便。所以,实际应用中,推荐第一种动量梯度下降的表达式。

动量梯度下降法的形象解释

将成本函数想象为一个碗状,从顶部开始运动的小球向下滚,其中 equation?tex=dwequation?tex=db 想象成球的加速度;而 equation?tex=v_%7Bdw%7Dequation?tex=v_%7Bdb%7D 相当于速度。

小球在向下滚动的过程中,因为加速度的存在速度会变快,但是由于 equation?tex=%5Cbeta 的存在,其值小于1,可以认为是摩擦力,所以球不会无限加速下去。

动量梯度下降法

5.RMSProp 算法

RMSprop—— Root Mean Square Prop

RMSProp (Root Mean Square Propagation,均方根传播) 是另外一种优化梯度下降速度的算法,它在对梯度进行指数加权平均的基础上,引入平方和平方根。具体过程为 (省略了 equation?tex=l ) :

equation?tex=s_%7Bdw%7D%20%3D%20%5Cbeta%20s_%7Bdw%7D%20%2B%20%281%20-%20%5Cbeta%29%28dw%29%5E2

equation?tex=s_%7Bdb%7D%20%3D%20%5Cbeta%20s_%7Bdb%7D%20%2B%20%281%20-%20%5Cbeta%29%28db%29%5E2

equation?tex=w%20%3A%3D%20w%20-%20%5Calpha%20%5Cfrac%7Bdw%7D%7B%5Csqrt%7Bs_%7Bdw%7D%20%2B%20%5Cepsilon%7D%7D

equation?tex=b%20%3A%3D%20b%20-%20%5Calpha%20%5Cfrac%7Bdb%7D%7B%5Csqrt%7Bs_%7Bdb%7D%20%2B%20%5Cepsilon%7D%7D

其中,equation?tex=%5Cvarepsilon 是一个实际操作时加上的较小数 (例如 equation?tex=10%5E%7B-8%7D ) ,为了防止分母太小而导致的数值不稳定。


RMSProp算法

如图所示,蓝色轨迹代表初始的移动,可以看到在 equation?tex=b 方向上走得比较陡峭 (即 equation?tex=db 较大) ,相比起来 equation?tex=dw 较小,这影响了优化速度。

因此,在采用RMSProp算法后,由于 equation?tex=%28dw%29%5E2 较小、 equation?tex=%28db%29%5E2 较大,进而 equation?tex=s_%7Bdw%7D 也会较小、 equation?tex=s_%7Bdb%7D 也会较大,最终使得 equation?tex=%5Cfrac%7Bdw%7D%7B%5Csqrt%7Bs_%7Bdw%7D%20%2B%20%5Cvarepsilon%7D%7D 较大,而 equation?tex=%5Cfrac%7Bdb%7D%7B%5Csqrt%7Bs_%7Bdb%7D%20%2B%20%5Cvarepsilon%7D%7D 较小。后面的更新就会像绿色轨迹一样,明显好于蓝色的更新曲线。RMSProp减小某些维度梯度更新波动较大的情况,使下降速度变得更快。


RMSProp有助于减少抵达最小值路径上的摆动,并允许使用一个更大的学习率 equation?tex=%5Calpha,从而加快算法学习速度。并且,它和Adam优化算法已被证明适用于不同的深度学习网络结构。

注意,equation?tex=%5Cbeta 也是一个超参数。

对比原始梯度下降与RMSProp算法优化过程,如下图所示 (上方为原始梯度下降,下方为RMSProp)

RMSProp算法

RMSProp算法

6.Adam 优化算法

Adam优化算法 Adam Optimization Algorithm

6.1 Adam算法介绍

Adam (Adaptive Moment Estimation,自适应矩估计)算法结合了动量梯度下降算法和RMSprop算法,通常有超越二者单独时的效果。具体过程如下 (省略了 equation?tex=l ) :


首先进行初始化

equation?tex=v_%7BdW%7D%20%3D%200%2C%20s_%7BdW%7D%20%3D%200%2C%20v_%7Bdb%7D%20%3D%200%2C%20s_%7Bdb%7D%20%3D%200

用每一个Mini-Batch计算 equation?tex=dWequation?tex=db,第 equation?tex=t 次迭代时:

equation?tex=v_%7BdW%7D%20%3D%20%5Cbeta_1%20v_%7BdW%7D%20%2B%20%281%20-%20%5Cbeta_1%29%20dW

equation?tex=v_%7Bdb%7D%20%3D%20%5Cbeta_1%20v_%7Bdb%7D%20%2B%20%281%20-%20%5Cbeta_1%29%20db

equation?tex=s_%7BdW%7D%20%3D%20%5Cbeta_2%20s_%7BdW%7D%20%2B%20%281%20-%20%5Cbeta_2%29%20%7B%28dW%29%7D%5E2

equation?tex=s_%7Bdb%7D%20%3D%20%5Cbeta_2%20s_%7Bdb%7D%20%2B%20%281%20-%20%5Cbeta_2%29%20%7B%28db%29%7D%5E2


一般使用Adam算法时需要计算偏差修正

equation?tex=v%5E%7Bcorrected%7D_%7BdW%7D%20%3D%20%5Cfrac%7Bv_%7BdW%7D%7D%7B1-%7B%5Cbeta_1%7D%5Et%7D

equation?tex=v%5E%7Bcorrected%7D_%7Bdb%7D%20%3D%20%5Cfrac%7Bv_%7Bdb%7D%7D%7B1-%7B%5Cbeta_1%7D%5Et%7D

equation?tex=s%5E%7Bcorrected%7D_%7BdW%7D%20%3D%20%5Cfrac%7Bs_%7BdW%7D%7D%7B1-%7B%5Cbeta_2%7D%5Et%7D

equation?tex=s%5E%7Bcorrected%7D_%7Bdb%7D%20%3D%20%5Cfrac%7Bs_%7Bdb%7D%7D%7B1-%7B%5Cbeta_2%7D%5Et%7D


所以,更新 equation?tex=Wequation?tex=b 时有:

equation?tex=W%20%3A%3D%20W%20-%20%5Calpha%20%5Cfrac%7Bv%5E%7Bcorrected%7D_%7BdW%7D%7D%7B%7B%5Csqrt%7Bs%5E%7Bcorrected%7D_%7BdW%7D%7D%20%2B%20%5Cvarepsilon%7D%7Dequation?tex=b%20%3A%3D%20b%20-%20%5Calpha%20%5Cfrac%7Bv%5E%7Bcorrected%7D_%7Bdb%7D%7D%7B%7B%5Csqrt%7Bs%5E%7Bcorrected%7D_%7Bdb%7D%7D%20%2B%20%5Cvarepsilon%7D%7D

6.2 Adam超参数的选择

Adam优化算法有很多的超参数,其中

  • 学习率 equation?tex=%5Calpha :需要尝试一系列的值,来寻找比较合适的
  • equation?tex=%5Cbeta_1 :常用的缺省值为0.9
  • equation?tex=%5Cbeta_2 :Adam算法的作者建议为0.999
  • equation?tex=%5Cvarepsilon :不重要,不会影响算法表现,Adam算法的作者建议为 equation?tex=10%5E%7B-8%7D

    equation?tex=%5Cbeta_1equation?tex=%5Cbeta_2equation?tex=%5Cvarepsilon 通常不需要调试。


对比原始梯度下降与RMSProp算法优化过程,如下图所示 (上方为原始梯度下降,下方为Adam)

Adam优化算法

Adam优化算法

7.学习率衰减

学习率衰减 Learning Rate Decay

减小学习率 equation?tex=%5Calpha 也能有效提高神经网络训练速度,这种方法被称为学习率衰减法 (learning rate decay)。

学习率衰减就是随着迭代次数增加,学习率 equation?tex=%5Calpha 逐渐减小。如下图示例。

学习率衰减

蓝色折线表示设置一个固定的学习率 equation?tex=%5Calpha

  • 在最小值点附近,由于不同的Batch中存在一定的噪声,因此不会精确收敛,而是始终在最小值周围一个较大的范围内波动。

绿色折线表示随着时间慢慢减少学习率 equation?tex=%5Calpha 的大小

  • 在初期 equation?tex=%5Calpha 较大时,下降的步长较大,能以较快的速度进行梯度下降;
  • 后期逐步减小 equation?tex=%5Calpha 的值,即减小步长,有助于算法的收敛,更容易接近最优解。


最常用的学习率衰减方法

equation?tex=%5Calpha%20%3D%20%5Cfrac%7B1%7D%7B1%20%2B%20decay%5C_rate%20%5Cast%20%20epoch%5C_num%7D%20%5Cast%20%20%5Calpha_0

其中,decay_rate为衰减率 (超参数) ,epoch_num为将所有的训练样本完整过一遍的次数。

  • 指数衰减:equation?tex=%5Calpha%20%3D%200.95%5E%7Bepoch%5C_num%7D%20%5Cast%20%20%5Calpha_0
  • 其他:equation?tex=%5Calpha%20%3D%20%5Cfrac%7Bk%7D%7B%5Csqrt%7Bepoch%5C_num%7D%7D%20%5Cast%20%20%5Calpha_0
  • 离散下降

对于较小的模型,也有人会在训练时根据进度手动调小学习率。

8.局部最优问题

局部最优问题 the Problem of Local Optima

在使用梯度下降算法不断减小cost function时,可能会得到局部最优解 (local optima)而不是全局最优解 (global optima)

局部最优问题

之前我们对局部最优解的理解是形如碗状的凹槽,如图左边所示。但是在神经网络中,local optima 的概念发生了变化。准确来说,大部分梯度为零的“最优点”并不是这些凹槽处,而是形如右边所示的马鞍状,称为 saddle point。

所以在深度学习损失函数中,梯度为零并不能保证都是 convex (极小值),也有可能是 concave (极大值)。特别是在神经网络中参数很多的情况下,所有参数梯度为零的点很可能都是右边所示的马鞍状的 saddle point,而不是左边那样的 local optimum。

局部最优问题

类似马鞍状的 plateaus 会降低神经网络学习速度。Plateaus 是梯度接近于零的平缓区域,如图所示。在 plateaus 上梯度很小,前进缓慢,到达 saddle point 需要很长时间。到达 saddle point 后,由于随机扰动,梯度一般能够沿着图中绿色箭头,离开 saddle point,继续前进,只是在 plateaus 上花费了太多时间。


结论

  • 在训练较大的神经网络、存在大量参数,并且成本函数被定义在较高的维度空间时,困在极差的局部最优中是不大可能的;
  • 鞍点附近的平稳段会使得学习非常缓慢,而这也是动量梯度下降法、RMSProp 以及 Adam 优化算法能够加速学习的原因,它们能帮助尽早走出平稳段。

参考资料

ShowMeAI 系列教程推荐

推荐文章

ShowMeAI用知识加速每一次技术成长

目录
相关文章
|
10天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
74 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
9天前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
82 30
|
12天前
|
算法
基于GA遗传算法的PID控制器参数优化matlab建模与仿真
本项目基于遗传算法(GA)优化PID控制器参数,通过空间状态方程构建控制对象,自定义GA的选择、交叉、变异过程,以提高PID控制性能。与使用通用GA工具箱相比,此方法更灵活、针对性强。MATLAB2022A环境下测试,展示了GA优化前后PID控制效果的显著差异。核心代码实现了遗传算法的迭代优化过程,最终通过适应度函数评估并选择了最优PID参数,显著提升了系统响应速度和稳定性。
|
9天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
13天前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
9天前
|
算法
通过matlab对比遗传算法优化前后染色体的变化情况
该程序使用MATLAB2022A实现遗传算法优化染色体的过程,通过迭代选择、交叉和变异操作,提高染色体适应度,优化解的质量,同时保持种群多样性,避免局部最优。代码展示了算法的核心流程,包括适应度计算、选择、交叉、变异等步骤,并通过图表直观展示了优化前后染色体的变化情况。
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)##
在当今的人工智能领域,深度学习已成为推动技术革新的核心力量之一。其中,卷积神经网络(CNN)作为深度学习的一个重要分支,因其在图像和视频处理方面的卓越性能而备受关注。本文旨在深入探讨CNN的基本原理、结构及其在实际应用中的表现,为读者提供一个全面了解CNN的窗口。 ##
|
13天前
|
算法
基于大爆炸优化算法的PID控制器参数寻优matlab仿真
本研究基于大爆炸优化算法对PID控制器参数进行寻优,并通过Matlab仿真对比优化前后PID控制效果。使用MATLAB2022a实现核心程序,展示了算法迭代过程及最优PID参数的求解。大爆炸优化算法通过模拟宇宙大爆炸和大收缩过程,在搜索空间中迭代寻找全局最优解,特别适用于PID参数优化,提升控制系统性能。
|
10天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
33 3
|
13天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-GRU网络的数据分类识别算法matlab仿真
本项目展示了使用MATLAB2022a实现的贝叶斯优化、CNN和GRU算法优化效果。优化前后对比显著,完整代码附带中文注释及操作视频。贝叶斯优化适用于黑盒函数,CNN用于时间序列特征提取,GRU改进了RNN的长序列处理能力。

热门文章

最新文章