「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。
前言
本文为我之前在CSDN平台上的一篇博客记录。原链接为:吴恩达深度学习优化算法部分复习
Mini-batch梯度下降
深度学习中,训练数据有时会很多。在进行梯度下降优化时,直接使用所有数据进行梯度下降称为Batch梯度下降法(BGD)。它的优缺点如下:
- 优点
- 使用全部数据的优点是梯度是在全部数据集上计算出的,因此每次迭代都是向着整体的最优化方向。
- 缺点
- 每次更新一次模型参数就需要遍历整个数据集,对内存和计算需求量大
- 容易陷入极小值点或鞍点(某个方向上的大批量数据计算的梯度“中和”即导致模型困在了鞍点)
当然,我们也完全可以每次只使用一条训练数据来进行梯度下降,这种训练方式称为随机梯度下降法(SGD)。SGD的优缺点如下:
- 优点
- 更新计算快
- 不会陷入极小值点和鞍点(每一步都会有不同方向的跳跃)
- 缺点
- 随机性大,收敛缓慢
- 无法利用计算机的向量化计算性能
以上两种方式是梯度更新时使用数据规模的两种极端情况,一种使用全部数据,另一种只用一条数据。那么,一种折中的方式就是采用一部分数据,这种方式就称之为mini-batch(MBGD)。
Mini-batch的方式可以有效的结合两种方法的优点,既能充分利用计算机的向量化计算性能,又能尽量减少SGD的随机性。对于batch_size的选取,使用2的次方项更有利于计算机加速计算。
指数加权平均数
在了解剩下几个优化算法之前,我们先对指数加权平均数做一个简要的介绍。 如图为伦敦一年中每天的气温值。从左到右为1.1到12.31的日期。我们来计算指数加权平均:
这里,代表第t天的气温值,代表第t天的指数加权平均值。如果把这些值画出来图像如下。 我们把0.9换成一个参数,那么公式即
越高,曲线越平坦,即平均了10天的,即平均了50天的。
理解指数加权平均数
对于这个公式,假设我们要求, 将v值用带入得, 所以这是一个加和并平均。我们构建一个指数衰减函数:
那么计算这个指数加权值就变为了
计算是通过,把两个函数对应的元素,然后求和,用这个数值100 号数据值乘以0.1,99 号数据值乘以0.1 乘以,这是第二项,以此类推,所以选取的是每日温度,将其与指数衰减函数相乘,然后求和,就得到了。
所有的这些系数(0.1 + 0.1 × 0.9 + 0.1 × (0.9)^2 + 0.1 × (0.9)^3 …),相加起来为1 或者逼近1,我们称之为偏差修正。
最后,我们要确定到底需要平均多少天的温度。一般,当指数衰减至峰值的后,我们就认为比较小了。由于,而这里的。所以当天后,我们就不在考虑。
指数加权平均数公式的好处之一在于,它占用极少内存,基本上只占用一行代码,计算指数加权平均数也只占用单行数字的存储和内存,当然它并不是最好的,也不是最精准的计算平均数的方法。
指数加权平均的偏差修正
由于我们一开始令,就会导致指数加权平均的最初的几个数值太小,偏差比较大。 如上图中的紫色线展示的那样,我们需要使用一个偏差修正项来避免这个问题。 在估测初期,我们不用而是使用,随着t增加,接近于0,所以当t很大的时候,偏差修正几乎没有作用。在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人并不关心初期的效果,训练很多步后,偏差就不在存在了。
动量梯度下降法(Gradient descent with Momentum)
动量梯度下降法,基本思想就是计算梯度的指数加权平均数,并利用该梯度 更新权重。
假设我们要优化的损失函数如图所示,红点代表最小值的位置。 假设我们从一个点开始学习, 我们看到在纵轴上是左右来回摆动的,但是横轴上前进却非常缓慢。当我们增大学习率时,纵轴上的梯度甚至会偏离出去。但学习率太小,又会导致收敛缓慢。在纵轴上,我们希望学习慢一点,因为不想要这些摆动,但是在横轴上,希望加快学习,能够快速从左向右移,移向最小值,移向红点。
使用动量梯度下降法,在每次迭代中,确切来说在第t次迭代的过程中,你会计 算微分𝑑𝑊,𝑑𝑏,用现有的mini-batch 计算𝑑𝑊,𝑑𝑏。然后计算
然后重新赋值权重
这样就可以减缓梯度下降的幅度。
这里有两个超参数,学习率以及参数,控制着指数加权平均数。最常用的值是0.9,关于偏差修正,实际上人们不这么做,因为10 次迭代之后,因为你的移动平均已经过了初始阶段。实际中,在使用梯度下降法或动量梯度下降法时,人们不会受到偏差修正的困扰。
有时,这个公式也被写作
但本质没有太大区别(相当于第二组公式里的新)。一般,两组公式里的都可以取0.9,但使用后一组会影响到学习率的设定,一般更多使用前一组。
RMSprop
RMSprop 的算法,全称是root mean square prop 算法,它也可以加速梯度下降。其更新过程如下: 如果你执行梯度下降,虽然横轴方向正在推进,但纵轴方向会有大幅度摆动,为了分析这个例子,假设纵轴代表参数𝑏,横轴代表参数𝑊,可能有,或者其它重要的参数,为了便于理解,被称为𝑏和𝑊。 我们要减缓𝑏方向的学习,即纵轴方向,同时加快,至少不是减缓横轴方向的学习。 在第𝑡次迭代中,该算法会照常计算当下mini-batch 的微分𝑑𝑊,𝑑𝑏。
以上式子理解如下:由于b方向来回震荡幅度大,那么我们计算的值就比较大,那么值就比较大,则该项更新时作为分母就使得db方向更新幅度减小。同理,我们计算的值就比较小,那么值就比较小,则该项更新时作为分母就使得dW方向更新幅度增大。当然,为了确保分母不为0,有时也会让根号下的项多加一个,一般可设置为1e-8。
这种方式使得变化幅度大的进行了“减小”,变化幅度小的进行了“增大”。可以消除梯度下降中的摆动。
Adam 优化算法(Adam optimization algorithm)
Adam 优化算法基本上就是将Momentum 和RMSprop 结合在一起。其计算过程如下,首先我们令
假设在第t次迭代中,我们计算得到原始梯度dW、db。然后,我们计算:
Adam 算法结合了Momentum 和RMSprop 梯度下降法,并且是一种极其常用的学习算法,被证明能有效适用于不同神经网络,适用于广泛的结构。
对于这些超参数,一般建议这是dW 的移动平均数,也就是𝑑𝑊的加权平均数,这是Momentum 涉及的项。超参数,Adam 论文作者,也就是Adam 算法的发明者,推荐使用0.999,这是在计算以及的移动加权平均值。建议为1e-8。实际应用时只需要调整学习率即可。
Adam 代表的是Adaptive Moment Estimation。用于计算微分dW,叫做第一矩;用于计算平方数的指数加权平均数(),叫做第二矩。
学习资料来源
- 第二门课 改善深层神经网络:超参数调试、正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)-第二周:优化算法 (Optimization algorithms) link