吴恩达深度学习笔记02——改善深层神经网络2优化算法

深度学习难以在大数据领域发挥最大效果的一个原因是,在巨大的数据集基础上进行训练速度很慢。而优化算法能够帮助快速训练模型,大大提高效率。

一、batch 梯度下降法

batch 梯度下降法(批梯度下降法,我们之前一直使用的梯度下降法)是最常用的梯度下降形式,即同时处理整个训练集。其在更新参数时使用所有的样本来进行更新。

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

但是如果每次处理训练数据的一部分即进行梯度下降法,则我们的算法速度会执行的更快。而处理的这些一小部分训练子集即称为 mini-batch。




二、Mini-Batch 梯度下降法

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

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

batch 梯度下降法和 Mini-batch 梯度下降法代价函数的变化趋势如下:
在这里插入图片描述

1、batch 的不同大小(size)带来的影响

  • mini-batch 的大小为 1,即是随机梯度下降法(stochastic gradient descent),每个样本都是独立的 mini-batch;

  • mini-batch 的大小为 m(数据集大小),即是 batch 梯度下降法;
    -在这里插入图片描述

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

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

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

2、mini-batch 大小的选择

  • 如果训练样本的大小比较小,如 m ⩽ 2000 时,选择 batch 梯度下降法;
  • 如果训练样本的大小比较大,选择 Mini-Batch 梯度下降法。为了和计算机的信息存储方式相适应,代码在 mini-batch 大小为 2 的幂次时运行要快一些。典型的大小为 64,128, 256,512;
  • mini-batch 的大小要符合 CPU/GPU 内存

mini-batch 的大小也是一个重要的超变量,需要根据经验快速尝试,找到能够最有效地减少成本函数的值。

3、获得 mini-batch 的步骤

(1)、将数据集打乱;
(2)、按照既定的大小分割数据集;

其中打乱数据集的代码:

m = X.shape[1] 
permutation = list(np.random.permutation(m))
shuffled_X = X[:, permutation]
shuffled_Y = Y[:, permutation].reshape((1,m))

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

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

4、符号表示

  • 使用上角小括号 i 表示训练集里的值,x(i) 是第 i 个训练样本;
  • 使用上角中括号 l 表示神经网络的层数,z[l] 表示神经网络中第 l 层的 z 值;
  • 现在引入大括号 t 来代表不同的 mini-batch,因此有 X{t}、Y{t}。



三、指数平均加权

指数加权平均(Exponentially Weight Average)是一种常用的序列数据处理方式,计算公式为:
在这里插入图片描述
其中 Yt 为 t 下的实际值,St 为 t 下加权平均后的值,β 为权重值。

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

在这里插入图片描述
给定一个时间序列,例如伦敦一年每天的气温值,图中蓝色的点代表真实数据。对于一个即时的气温值,取权重值 β 为 0.9,根据求得的值可以得到图中的红色曲线,它反映了平均了1/1-β,即10天的温度。

当取权重值 β=0.98 时,可以得到图中更为平滑的绿色曲线,即为平均了50天的温度。而当取权重值 β=0.5 时,得到图中噪点更多的黄色曲线,平均了2天的温度。β 越大相当于求取平均利用的天数越多,曲线自然就会越平滑而且越滞后。β越小越容易出现异常值,但是更能反映曲线的变化。

1、理解指数平均加权

在这里插入图片描述
其中 θi 指第 i 天的实际数据。所有 θ 前面的系数(不包括 0.1)相加起来为 1 或者接近于 1,这些系数被称作偏差修正(Bias Correction)。

根据函数极限的一条定理:
在这里插入图片描述
当 β 为 0.9 时,可以当作把过去 10 天的气温指数加权平均作为当日的气温,因为 10 天后权重已经下降到了当天的 1/3 左右。同理,当 β 为 0.98 时,可以把过去 50 天的气温指数加权平均作为当日的气温。

因此,在计算当前时刻的平均值时,只需要前一天的平均值和当前时刻的值。
在这里插入图片描述
考虑到代码,只需要不断更新 v 即可:
在这里插入图片描述
指数平均加权并不是最精准的计算平均数的方法,你可以直接计算过去 10 天或 50 天的平均值来得到更好的估计,但缺点是保存数据需要占用更多内存,执行更加复杂,计算成本更加高昂。

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

2、指数平均加权的偏差修正

我们通常有:
在这里插入图片描述
因此,v1 仅为第一个数据的 0.02(或者说 1-β),显然不准确。往后递推同理。

因此,我们修改公式为
在这里插入图片描述
随着 t 的增大,β 的 t 次方趋近于 0。因此当 t 很大的时候,偏差修正几乎没有作用,但是在前期学习可以帮助更好的预测数据。在实际过程中,一般会忽略前期偏差的影响。




四、Momentum动量梯度下降法

动量梯度下降(Gradient Descent with Momentum)是计算梯度的指数加权平均数,并利用该值来更新参数值。具体过程为:
在这里插入图片描述
其中,将动量衰减参数 β 设置为 0.9 是超参数的一个常见且效果不错的选择。当 β 被设置为 0 时,显然就成了 batch 梯度下降法。
在这里插入图片描述
进行一般的梯度下降将会得到图中的蓝色曲线,由于存在上下波动,减缓了梯度下降的速度,因此只能使用一个较小的学习率进行迭代。如果用较大的学习率,结果可能会像紫色曲线一样偏离函数的范围。

而使用动量梯度下降时,通过累加过去的梯度值来减少抵达最小值路径上的波动,加速了收敛,因此在横轴方向下降得更快,从而得到图中红色的曲线。

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

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

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

将成本函数想象为一个碗状,从顶部开始运动的小球向下滚,其中 dw,db 想象成球的加速度;而 vdw、vdb 相当于速度。

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




五、RMSProp 算法

RMSProp(Root Mean Square Prop,均方根支)算法是在对梯度进行指数加权平均的基础上,引入平方和平方根。具体过程为(省略了 l):
在这里插入图片描述
在这里插入图片描述
较小,从而减小某些维度梯度更新波动较大的情况,使下降速度变得更快。
在这里插入图片描述
RMSProp 有助于减少抵达最小值路径上的摆动,并允许使用一个更大的学习率 α,从而加快算法学习速度。并且,它和 Adam 优化算法已被证明适用于不同的深度学习网络结构。

注意,β 也是一个超参数。




六、Adam 优化算法

Adam 优化算法(Adaptive Moment Estimation,自适应矩估计)基本上就是将 Momentum 和 RMSProp 算法结合在一起,通常有超越二者单独时的效果。具体过程如下(省略了 l):

首先进行初始化:
在这里插入图片描述
用每一个 mini-batch 计算 dW、db,第 t 次迭代时:
在这里插入图片描述
一般使用 Adam 算法时需要计算偏差修正:
在这里插入图片描述
所以,更新 W、b 时有:
在这里插入图片描述

超参数的选择

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

  • 学习率 α:需要尝试一系列的值,来寻找比较合适的;
  • β1:常用的缺省值为 0.9;
  • β2:Adam 算法的作者建议为 0.999;
  • ϵ:不重要,不会影响算法表现,Adam 算法的作者建议为 10−8;

β1、β2、ϵ 通常不需要调试。




七、学习率衰减

如果设置一个固定的学习率 α,在最小值点附近,由于不同的 batch 中存在一定的噪声,因此不会精确收敛,而是始终在最小值周围一个较大的范围内波动。

而如果随着时间慢慢减少学习率 α 的大小,在初期 α 较大时,下降的步长较大,能以较快的速度进行梯度下降;而后期逐步减小 α 的值,即减小步长,有助于算法的收敛,更容易接近最优解。
在这里插入图片描述
最常用的学习率衰减方法
在这里插入图片描述
其中,decay_rate为衰减率(超参数),epoch_num为将所有的训练样本完整过一遍的次数。

  • 指数衰减:
    在这里插入图片描述

  • 其他:
    在这里插入图片描述




八、局部最优问题

在这里插入图片描述
**鞍点(saddle)**是函数上的导数为零,但不是轴上局部极值的点。当我们建立一个神经网络时,通常梯度为零的点是上图所示的鞍点,而非局部最小值。减少损失的难度也来自误差曲面中的鞍点,而不是局部最低点。因为在一个具有高维度空间的成本函数中,如果梯度为 0,那么在每个方向,成本函数或是凸函数,或是凹函数。而所有维度均需要是凹函数的概率极小,因此在低维度的局部最优点的情况并不适用于高维度。

结论:

  • 在训练较大的神经网络、存在大量参数,并且成本函数被定义在较高的维度空间时,困在极差的局部最优中是不大可能的;
  • 鞍点附近的平稳段会使得学习非常缓慢,而这也是动量梯度下降法、RMSProp 以及 Adam 优化算法能够加速学习的原因,它们能帮助尽早走出平稳段。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C++&OPENCV 的全景图像拼接 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域中,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎中扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值