吴恩达深度学习优化算法部分复习

601 阅读7分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。

前言

本文为我之前在CSDN平台上的一篇博客记录。原链接为:吴恩达深度学习优化算法部分复习

Mini-batch梯度下降

深度学习中,训练数据有时会很多。在进行梯度下降优化时,直接使用所有数据进行梯度下降称为Batch梯度下降法(BGD)。它的优缺点如下:

  • 优点
    • 使用全部数据的优点是梯度是在全部数据集上计算出的,因此每次迭代都是向着整体的最优化方向。
  • 缺点
    • 每次更新一次模型参数就需要遍历整个数据集,对内存和计算需求量大
    • 容易陷入极小值点或鞍点(某个方向上的大批量数据计算的梯度“中和”即导致模型困在了鞍点)

当然,我们也完全可以每次只使用一条训练数据来进行梯度下降,这种训练方式称为随机梯度下降法(SGD)。SGD的优缺点如下:

  • 优点
    • 更新计算快
    • 不会陷入极小值点和鞍点(每一步都会有不同方向的跳跃)
  • 缺点
    • 随机性大,收敛缓慢
    • 无法利用计算机的向量化计算性能

以上两种方式是梯度更新时使用数据规模的两种极端情况,一种使用全部数据,另一种只用一条数据。那么,一种折中的方式就是采用一部分数据,这种方式就称之为mini-batch(MBGD)。

Mini-batch的方式可以有效的结合两种方法的优点,既能充分利用计算机的向量化计算性能,又能尽量减少SGD的随机性。对于batch_size的选取,使用2的次方项更有利于计算机加速计算。

指数加权平均数

在了解剩下几个优化算法之前,我们先对指数加权平均数做一个简要的介绍。 在这里插入图片描述 如图为伦敦一年中每天的气温值。从左到右为1.1到12.31的日期。我们来计算指数加权平均:

v0=0v1=0.9v0+0.1θ1v2=0.9v1+0.1θ2vt=0.9vt1+0.1θt1v_0 = 0\\ v_1=0.9v_0+0.1\theta_1\\ v_2=0.9v_1+0.1\theta_2\\ \cdots \\ v_t=0.9v_{t-1}+0.1\theta_{t-1}

这里,θt\theta_t代表第t天的气温值,vtv_t代表第t天的指数加权平均值。如果把这些值画出来图像如下。 在这里插入图片描述 我们把0.9换成一个参数β\beta,那么公式即

vt=βvt1+(1β)θtv_t=\beta v_{t-1}+(1-\beta) \theta_t

β\beta越高,曲线越平坦,β=0.9\beta=0.9即平均了10天的,β=0.98\beta=0.98即平均了50天的。

理解指数加权平均数

对于这个公式,假设我们要求v100v_{100}在这里插入图片描述 将v值用θ\theta带入得, 在这里插入图片描述 所以这是一个加和并平均。我们构建一个指数衰减函数:

g(n)=(1β)βng(n) = (1-\beta) \beta^{n}

那么计算这个指数加权值就变为了

vt=g(0)θt+g(1)θt1+v_t = g(0)*\theta_t+g(1)*\theta_{t-1}+\cdots

计算v100v_{100}是通过,把两个函数对应的元素,然后求和,用这个数值100 号数据值乘以0.1,99 号数据值乘以0.1 乘以(0.9)1(0.9)^1,这是第二项,以此类推,所以选取的是每日温度,将其与指数衰减函数相乘,然后求和,就得到了v100v_{100}

所有的这些系数(0.1 + 0.1 × 0.9 + 0.1 × (0.9)^2 + 0.1 × (0.9)^3 …),相加起来为1 或者逼近1,我们称之为偏差修正。

最后,我们要确定到底需要平均多少天的温度。一般,当指数衰减至峰值的1/e1/e后,我们就认为比较小了。由于(1μ)1μ1e(1-\mu)^{\frac{1}{\mu}} \approx \frac{1}{e},而这里的μ=1β\mu=1-\beta。所以当11β\frac{1}{1-\beta}天后,我们就不在考虑。

指数加权平均数公式的好处之一在于,它占用极少内存,基本上只占用一行代码,计算指数加权平均数也只占用单行数字的存储和内存,当然它并不是最好的,也不是最精准的计算平均数的方法。

指数加权平均的偏差修正

由于我们一开始令v0=0v_0=0,就会导致指数加权平均的最初的几个数值太小,偏差比较大。 在这里插入图片描述 如上图中的紫色线展示的那样,我们需要使用一个偏差修正项来避免这个问题。 在估测初期,我们不用vtv_t而是使用vt1βt\frac{v_t}{1-\beta^{t}},随着t增加,βt\beta^t接近于0,所以当t很大的时候,偏差修正几乎没有作用。在机器学习中,在计算指数加权平均数的大部分时候,大家不在乎执行偏差修正,因为大部分人并不关心初期的效果,训练很多步后,偏差就不在存在了。

动量梯度下降法(Gradient descent with Momentum)

动量梯度下降法,基本思想就是计算梯度的指数加权平均数,并利用该梯度 更新权重。

假设我们要优化的损失函数如图所示,红点代表最小值的位置。 在这里插入图片描述 假设我们从一个点开始学习, 在这里插入图片描述 我们看到在纵轴上是左右来回摆动的,但是横轴上前进却非常缓慢。当我们增大学习率时,纵轴上的梯度甚至会偏离出去。但学习率太小,又会导致收敛缓慢。在纵轴上,我们希望学习慢一点,因为不想要这些摆动,但是在横轴上,希望加快学习,能够快速从左向右移,移向最小值,移向红点。

使用动量梯度下降法,在每次迭代中,确切来说在第t次迭代的过程中,你会计 算微分𝑑𝑊,𝑑𝑏,用现有的mini-batch 计算𝑑𝑊,𝑑𝑏。然后计算

VdW,t=βVdW,t1+(1β)dWVdb,t=βVdb,t1+(1β)dbV_{dW,t}=\beta V_{dW,t-1}+(1-\beta)dW\\ V_{db,t}=\beta V_{db,t-1}+(1-\beta)db

然后重新赋值权重

W:=WαVdW,tb:=bαVdb,tW:=W-\alpha V_{dW,t}\\ b:=b-\alpha V_{db,t}

这样就可以减缓梯度下降的幅度。

这里有两个超参数,学习率α\alpha以及参数β\betaβ\beta控制着指数加权平均数。最常用的值是0.9,关于偏差修正,实际上人们不这么做,因为10 次迭代之后,因为你的移动平均已经过了初始阶段。实际中,在使用梯度下降法或动量梯度下降法时,人们不会受到偏差修正的困扰。

有时,这个公式也被写作

VdW,t=βVdW,t1+dWVdb,t=βVdb,t1+dbV_{dW,t}=\beta V_{dW,t-1}+dW\\ V_{db,t}=\beta V_{db,t-1}+db

但本质没有太大区别(相当于第二组公式里的新β=β1β\beta'=\frac{\beta}{1-\beta})。一般,两组公式里的β\beta都可以取0.9,但使用后一组会影响到学习率α\alpha的设定,一般更多使用前一组。

RMSprop

RMSprop 的算法,全称是root mean square prop 算法,它也可以加速梯度下降。其更新过程如下: 如果你执行梯度下降,虽然横轴方向正在推进,但纵轴方向会有大幅度摆动,为了分析这个例子,假设纵轴代表参数𝑏,横轴代表参数𝑊,可能有W1W_1W2W_2或者其它重要的参数,为了便于理解,被称为𝑏和𝑊。 在这里插入图片描述 我们要减缓𝑏方向的学习,即纵轴方向,同时加快,至少不是减缓横轴方向的学习。 在第𝑡次迭代中,该算法会照常计算当下mini-batch 的微分𝑑𝑊,𝑑𝑏。

SdW=βSdW+(1β)(dW)2Sdb=βSdb+(1β)(db)2W:=WαdWSdWb:=bαdbSdbS_{dW} = \beta S_{dW} + (1-\beta)(dW)^2\\ S_{db} = \beta S_{db} + (1-\beta)(db)^2\\ W:=W-\alpha \frac{dW}{\sqrt{S_{dW}}}\\ b:=b-\alpha \frac{db}{\sqrt{S_{db}}}

以上式子理解如下:由于b方向来回震荡幅度大,那么我们计算的(db)2(db)^2值就比较大,那么Sdb\sqrt{S_{db}}值就比较大,则该项更新时作为分母就使得db方向更新幅度减小。同理,我们计算的(dW)2(dW)^2值就比较小,那么SdW\sqrt{S_{dW}}值就比较小,则该项更新时作为分母就使得dW方向更新幅度增大。当然,为了确保分母不为0,有时也会让根号下的项多加一个ϵ\epsilon,一般可设置为1e-8。

这种方式使得变化幅度大的进行了“减小”,变化幅度小的进行了“增大”。可以消除梯度下降中的摆动。

Adam 优化算法(Adam optimization algorithm)

Adam 优化算法基本上就是将Momentum 和RMSprop 结合在一起。其计算过程如下,首先我们令

VdW=0,Vdb=0,SdW=0,Sdb=0V_{dW}=0, V_{db}=0, S_{dW}=0, S_{db}=0

假设在第t次迭代中,我们计算得到原始梯度dW、db。然后,我们计算:

VdW=β1VdW+(1β1)dWVdb=β1Vdb+(1β1)dbSdW=β2SdW+(1β2)(dW)2Sdb=β2Sdb+(1β2)(db)2VdWcorrected=VdW1βtVdbcorrected=Vdb1βtSdWcorrected=SdW1βtSdbcorrected=Sdb1βtW:=WαVdWcorrectedSdWcorrected+ϵb:=bαVdbcorrectedSdbcorrected+ϵV_{dW} = \beta_1 V_{dW} + (1-\beta_1)dW\\ V_{db} = \beta_1 V_{db} + (1-\beta_1)db\\ S_{dW} = \beta_2 S_{dW} + (1-\beta_2)(dW)^2\\ S_{db} = \beta_2 S_{db} + (1-\beta_2)(db)^2\\ V^{corrected}_{dW} = \frac{V_{dW}}{1-\beta^t}\\ V^{corrected}_{db} = \frac{V_{db}}{1-\beta^t}\\ S^{corrected}_{dW} = \frac{S_{dW}}{1-\beta^t}\\ S^{corrected}_{db} = \frac{S_{db}}{1-\beta^t}\\ W:=W-\alpha \frac{V^{corrected}_{dW}}{\sqrt{S^{corrected}_{dW}}+\epsilon}\\ b:=b-\alpha \frac{V^{corrected}_{db}}{\sqrt{S^{corrected}_{db}}+\epsilon}

Adam 算法结合了Momentum 和RMSprop 梯度下降法,并且是一种极其常用的学习算法,被证明能有效适用于不同神经网络,适用于广泛的结构。

对于这些超参数,一般建议β1=0.9\beta_1=0.9这是dW 的移动平均数,也就是𝑑𝑊的加权平均数,这是Momentum 涉及的项。超参数β2\beta_2,Adam 论文作者,也就是Adam 算法的发明者,推荐使用0.999,这是在计算(dW)2(dW)^2以及(db)2(db)^2的移动加权平均值。ϵ\epsilon建议为1e-8。实际应用时只需要调整学习率即可。

Adam 代表的是Adaptive Moment Estimation。β1\beta_1用于计算微分dW,叫做第一矩;β2\beta_2用于计算平方数的指数加权平均数((dW)2(dW)^2),叫做第二矩。

学习资料来源

  1. 第二门课 改善深层神经网络:超参数调试、正则化以及优化(Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)-第二周:优化算法 (Optimization algorithms) link