一篇文章带你搞懂深度学习中各种【梯度下降法】

1、前言

学完吴恩达老师的深度学习后,对深度学习也有有了较为基础而全面的认识,但是还是没有形成肌肉记忆,有些时候反应不过来,索性开一个专题将自己不太熟悉的部分重新再梳理一遍。整理一些比较容易搞混的地方的,如有疏漏或者错误也欢迎大家批评指正,我们的目标是一起学习进步。

  • 我们都知道反向传播计算梯度,再通过梯度下降法更新参数,也知道有各种梯度下降法,但是学到头也没把它们之间关系搞懂,这篇文章将详细介绍各种梯度下降法。
  • 保证文章逻辑清晰,全篇读完相信你会收获颇深。

2、前向传播和反向传播 ( Forward and backward propagation)

一、前向传播

(第l层)
在这里插入图片描述
传播过程:A[0](即X) —> Z[1] —>A[1] —> Z[2] —>A[2]······

二、反向传播

第l层
在这里插入图片描述

  • 从后往前计算,与前向传播计算方向相反(理解为从结果推过程),计算参数的梯度。

在这里插入图片描述

3、优化算法

使用快速的优化算法,能够大大提高你和团队的效率。优化算法就是不同的梯度下降法,目的都是通过多次迭代优化参数,找到对应的最优的损失函数
在这里插入图片描述
按照每次更新参数所使用的训练数据集范围分为:

  1. batch梯度下降法(对整个训练集)
  2. mini-batch梯度下降法(对数据集中不同的mini-batch)
  3. 随机梯度下降法(对随机一个样本)

优化的梯度下降法(几乎是基于mini-batch梯度下降法):

  1. momentum梯度下降法
  2. RMSprop梯度下降法
  3. Adam梯度下降法

一、batch 梯度下降法(batch gradient descent)

  1. 把训练样本放大巨大的矩阵𝑋当中去(m是样本数量,X是向量化结果)
    𝑋 = [𝑥(1) 𝑥(2) 𝑥(3) … … 𝑥(𝑚)]
    𝑌 = [𝑦(1) 𝑦(2) 𝑦(3) … … 𝑦(𝑚)]
  2. 对于每一层的参数进行反向传播后再更新参数(相当于此时网络层数是一个循环,在这个循环中求每一层的参数的梯度)
    在这里插入图片描述
  3. 进行新一轮的反向传播,直到收敛

二、mini-batch 梯度下降法

  • 每次同时处理的单个的 mini-batch 𝑋{𝑡}和𝑌{𝑡},而不是同时处理全部的𝑋和𝑌训练在这里插入图片描述
  1. 设mini-batch-size = B
    𝑋{1} = [𝑥(1) 𝑥(2) 𝑥(3) … … 𝑥(B)]
    𝑋{2} = [𝑥(B+1) 𝑥(B+2) 𝑥(B+3) … … 𝑥(2*B)]
    ······
    𝑋{t} = [𝑥((t-1)*B+1) 𝑥((t-1)*B+2) 𝑥((t-1)*B+3) … … 𝑥(t * B)]
    ······
    𝑌{𝑡}同理
  2. 训练集被分为 #mini-batch = m/B个小批量,在每个批量上都进行反向传播并更新参数(遍历所有个mini-batch的循环)
  3. 进行新一轮的反向传播(一轮是指遍历所有batch,包含所有的数据)
  • batch和 mini-batch 梯度下降的区别:batch gradient descent更新所有层的参数是同时处理训练集所有数据,二mini-batch gradient descent更新所有层的参数只需要处理训练集中单个的 mini-batch 𝑋{𝑡}和𝑌{𝑡}。
    在这里插入图片描述
  • mini-batch 梯度下降法(绿色线)不会总朝向最小值靠近,最后可能在很小的范围内收敛或者波动,这个时候可以慢慢减少学习率。
    在这里插入图片描述
  • mini-batch 大小为 一般是是 2 的𝑛次方(符合 CPU/GPU 内存),运行更快

三、随机梯度下降法(stochastic gradient descent,SGD)

mini-batch = 1。每个样本都是独立的 mini-batch,一次只处理一个训练样本,𝑋{t} = x(i) (x(i)是训练集中随机一个样本)

  • 在随机梯度下降法中(下图中紫色线),大部分时候你着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此随机梯度下降法是有很多噪声的。平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动,但它并不会在达到最小值并停留在此
    在这里插入图片描述
  • 随机梯度下降法的一大缺点:会失去所有向量化加速,因为一次性只处理了一个训练样本,所以实践中最好选择不大不小的 mini-batch 尺寸,实际上学习率最快。

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

计算梯度的指数加权平均数,并利用该梯度更新你的权重。

  • 指数加权平均数可以参考吴恩达老师的讲解,简单说就是利用之前的数据来更新这一次的数据,由事件从远到近,权重逐渐变大。
  • 公式:𝑣: = 𝛽𝑣𝜃 + (1 − 𝛽)𝜃t,其中𝜃t是当前时刻的值,𝑣𝜃为过去时间的指数加权平均
    在这里插入图片描述

梯度下降时会慢慢摆动到最小值,但是上下波动减慢了梯度下降法的速度,无法使用更大的学习率,如果用较大的学习率(上图中紫色箭头),结果可能会偏离函数的范围,为了避免摆动过大,只能用一个较小的学习率。

直观上来看,在纵轴上,希望学习慢一点,不想要这些摆动,但是在横轴上,希望加快学习,你希望快速从左向右移,移向最小值,移向红点。

动量梯度下降法步骤(对于每个batch中的每一层):

  1. 计算梯度𝑑𝑊、𝑑𝑏
  2. 计算𝑣𝑑𝑊、𝑣𝑑𝑏
  • 𝑑𝑊的移动平均数:𝑣𝑑𝑊 =𝛽𝑣𝑑𝑊 + (1 − 𝛽)𝑑𝑊 (指数加权平均)
  • 𝑑𝑊的移动平均数:𝑣𝑑𝑏 = 𝛽𝑣𝑑𝑏 + (1 − 𝛽)𝑑𝑏
  1. 重新赋值权重:
  • 𝑊: = 𝑊 −𝑎𝑣𝑑𝑊
  • 𝑏: = 𝑏 − 𝑎𝑣𝑑𝑏
    在这里插入图片描述
    其中,β一般设为0.9,学习率α会有所调整。

why it makes sense?

  • 由图可知,梯度在纵轴上的摆动平均值接近于零,指数加权平均过程中,正负数相互抵消,所以平均值接近于零。但在横轴方向,所有的微分都指向横轴方向,因此横轴方向的平均值仍然较大。迭代几次后,纵轴方向的摆动变小了,横轴方向运动更快。算法走了一条更加直接的路径,在抵达最小值的路上减少了摆动。

五、RMSprop

  1. 照常计算当下 mini-batch 的微分𝑑𝑊,𝑑𝑏
  2. 计算𝑆𝑑𝑊、𝑆𝑑𝑏
  • 𝑆𝑑𝑊 = 𝛽𝑆𝑑𝑊 + (1 − 𝛽)𝑑𝑊2
  • 𝑆𝑑𝑏 = 𝛽𝑆𝑑𝑏 + (1 − 𝛽)𝑑𝑏2
  1. 更新参数
    𝑊: = 𝑊 − 𝑎 * 𝑑𝑊/√𝑆𝑑𝑊
    𝑏: = 𝑏 − 𝛼 * 𝑑𝑏/√𝑆𝑑𝑏

在这里插入图片描述

在例子中的𝑊方向,我们希望学习速度快,所以𝑑𝑊除以一个较小的数√𝑆𝑑𝑊(𝑆𝑑𝑊比较小因为在𝑊方向是平稳的),而在垂直的𝑏方向,𝑑𝑏除以一个较大的数√𝑆𝑑𝑏(𝑆𝑑𝑊比较大因为在b方向是震荡的),这样就可以减缓纵轴上的变化。RMSprop后参数走势如上图中绿色线。此时可以用一个更大学习率𝑎,然后加快学习,也不会导致在纵轴上垂直方向偏离。

  • 如果𝑆𝑑𝑊的平方根趋近于 0 时,导致无穷大,为确保数值稳定,在分母上加上一个很小很小的𝜀(一般选择10−8)。

momentum和RMSprop都减缓了参数更新时某个方向上的震荡,梯度下降曲线更平缓,所以都可以使用一个更大的学习率𝑎,加快算法学习速度。

六、Adam 优化算法

Adam 优化算法基本上就是将 Momentum 和 RMSprop 结合在一起。
在这里插入图片描述

  1. 首先初始化,𝑣𝑑𝑊 = 0,𝑆𝑑𝑊 = 0,𝑣𝑑𝑏 = 0,𝑆𝑑𝑏 = 0
  2. 第𝑡次迭代中,用当前的 mini-batch 计算𝑑𝑊,𝑑𝑏(一般使用mini-batch梯度下降法)
  3. 计算 Momentum 指数加权平均数
  • 𝑣𝑑𝑊 = 𝛽1𝑣𝑑𝑊 + (1 − 𝛽1)𝑑𝑊
  • 𝑣𝑑𝑏 = 𝛽1𝑣𝑑𝑏 + (1 − 𝛽1)𝑑𝑏
  1. 用 RMSprop 进行更新
  • 𝑆𝑑𝑊 = 𝛽2𝑆𝑑𝑊 + (1 − 𝛽2)(𝑑𝑊)2
  • 𝑆𝑑𝑏 = 𝛽2𝑆𝑑𝑏 + (1 − 𝛽2)(𝑑𝑏)2
  1. 计算偏差修正(计算指数加权平均时会产生偏差)
  • 𝑣𝑑𝑊corrected =𝑣𝑑𝑊/(1-𝛽1𝑡)
    𝑣𝑑𝑏corrected =𝑣𝑑𝑏/(1-𝛽1𝑡)
  • 𝑆𝑑𝑊corrected =𝑆𝑑𝑊/(1-𝛽2𝑡)
    𝑆𝑑𝑏corrected =𝑆𝑑𝑏/(1-𝛽2𝑡)
  1. 更新参数
    在这里插入图片描述在这里插入图片描述

选择参数时:
在这里插入图片描述

4、局部最优的问题(The problem of local optima)

  • 不太可能困在极差的局部最优中,而是遇到鞍点,条件是在训练较大的神经网络,存在大量参数,并且成本函数𝐽被定义在较高的维度空间
  • 平稳段是一个问题,学习十分缓慢,也是Momentum 和RMSprop,Adam能够加速学习算法的地方。在这些情况下,更成熟的优化算法,如 Adam 算法,能够加快速度,让你尽早往下走出平稳段。在这里插入图片描述

5、总结

  • 梯度下降法其实就是通过反向传播得到dW、db,然后进行参数更新,使得损失函数一步一步达到最优
  • 每次参数更新时,按照对多少样本进行反向传播,可以分为batch gradient descent(all)、mini-batch gradient descent(mini-batch)、随机梯度下降法(one)
  • 而想要在梯度下降时,加快收敛速度(使用更大的学习率),又提出了momentum、RMSprop、Adam。这些方法可以避免在梯度下降时,在某一个维度偏移大,收敛方向更快朝目标前进(下图中从蓝色线到绿色)。而这些方法一般都是基于mini-batch gradient descent
    在这里插入图片描述
  • momentum、RMSprop、Adam都采用了指数加权平均的思想,在更新参数时,不再使用一般的梯度下降法𝑊: = 𝑊 −𝑎𝑑𝑊
    1. momentum:将𝑑𝑊替换为𝑣𝑑𝑊—>𝑊: = 𝑊 −𝑎 * 𝑣𝑑𝑊
    2. RMSprop:𝑑𝑊除以一个√𝑆𝑑𝑊 —>𝑊: = 𝑊 − 𝑎 * 𝑑𝑊/√𝑆𝑑𝑊
    3. Adma:
      在这里插入图片描述

6、参考

吴恩达老师的机器学习和深度学习笔记更新了!(附PDF下载)

  • 33
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值