博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DeepLearning.ai笔记:(2-2)-- 优化算法(Optimization algorithms)
阅读量:4100 次
发布时间:2019-05-25

本文共 6104 字,大约阅读时间需要 20 分钟。


title: ‘DeepLearning.ai笔记:(2-2)-- 优化算法(Optimization algorithms)’

id: 2018091621
tags:

  • categories:
  • AI
  • Deep Learning
    date: 2018-09-16 21:42:33

首发于个人博客:,欢迎来访

这周学习了优化算法,可以让神经网络运行的更快。

主要有:

  • mini-batch
  • 动量梯度下降(momentum)
  • RMSprop
  • Adam优化算法
  • 学习率衰减

mini-batch(小批量)

原本的梯度下降算法,在每一次的迭代中,要把所有的数据都进行计算再取平均,那如果你的数据量特别大的话,每进行一次迭代就会耗费大量的时间。

所以就有了mini-batch,做小批量的计算迭代。也就是把训练集划分成n等分,比如数据量有500万个的时候,以1000为单位,将数据集划分为5000份,

x = x { 1 } , x { 2 } , x { 3 } , . . . . . , x { 5000 } x = {x^{\lbrace 1 \rbrace},x^{\lbrace 2 \rbrace},x^{\lbrace 3 \rbrace},.....,x^{\lbrace 5000 \rbrace}} x=x{
1}
,x{
2}
,x{
3}
,.....,x{
5000}

用大括弧表示每一份的mini-batch,其中每一份 x { t } x^{\lbrace t \rbrace} x{

t}都是1000个样本。

这个时候引入epoch的概念,1个epoch相当于是遍历了一次数据集,比如用mini-batch,1个epoch就可以进行5000次迭代,而传统的batch把数据集都一起计算,相当于1个epoch只进行了1次迭代。

具体计算步骤是:

  • 先划分好每一个mini-batch
  • for t in range(5000),循环每次迭代
    • 循环里面和之前的计算过程一样,前向传播,但每次计算量是1000个样本
    • 计算损失函数
    • 反向传播
    • 更新参数

batch和mini-batch的对比如图:

  • 如果mini-batch的样本为m的话,其实就是batch gradient descent,缺点是如果样本量太大的话,每一次迭代的时间会比较长,但是优点是每一次迭代的损失函数都是下降的,比较平稳。
  • mini-batch样本为1的话,那就是随机梯度下降(Stochastic gradient descent),也就是每次迭代只选择其中一个样本进行迭代,但是这样会失去了样本向量化带来的计算加速效果,损失函数总体是下降的,但是局部会很抖动,很可能无法达到全局最小点。
  • 所以选择一个合适的size很重要, 1 &lt; s i z e &lt; m 1 &lt; size &lt; m 1<size<m,可以实现快速的计算效果,也能够享受向量化带来的加速。

三种下降对比,蓝色为batch,紫色为Stochastic,绿色为mini-batch

mini-batch size的选择

因为电脑的内存和使用方式都是二进制的,而且是2的n次方,所以之前选1000也不太合理,可以选1024,但是1024也比较少见,一般是从64到512。也就是 64 、 128 、 256 、 512 64、128、256、512 64128256512

指数加权平均(Exponentially weighted averages )

蓝色的点是每一天的气温,可以看到是非常抖动的,那如果可以把它平均一下,比如把10天内的气温平均一下,就可以得到如红色的曲线。

但是如果是单纯的把前面的10天气温一起平均的话,那么这样你就需要把前10天的气温全部储存记录下来,这样子虽然会更准一点,但是很浪费储存空间,所以就有了指数加权平均这样的概念。方法如下:

V 0 = 0 V_0 = 0 V0=0

V 1 = β ∗ V 0 + ( 1 − β ) θ 1 V_1 = \beta * V_0 + (1 - \beta) \theta_1 V1=βV0+(1β)θ1

… … ……

V t = β ∗ V t − 1 + ( 1 − β ) θ t V_t = \beta * V_{t-1} + (1 - \beta) \theta_t Vt=βVt1+(1β)θt

其中, θ t \theta_t θt表示第t天的温度,而 V t V_t Vt表示指数加权平均后的第t天温度, β \beta β这个参数表示 1 1 − β \frac{1}{1-\beta} 1β1天的平均,也就是, β = 0.9 \beta = 0.9 β=0.9,表示10天内的平均, β = 0.98 \beta = 0.98 β=0.98,表示50天内的平均。

黄、红、绿线依次表示

理解指数加权平均

我们再来看一下公式:

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

假设 β = 0.9 \beta = 0.9 β=0.9,那么

v 100 = 0.9 v 99 + 0.1 θ 100 v_{100} = 0.9v_{99} + 0.1\theta_{100} v100=0.9v99+0.1θ100

v 99 = 0.9 v 98 + 0.1 θ 99 v_{99} = 0.9v_{98} + 0.1\theta_{99} v99=0.9v98+0.1θ99

v 98 = 0.9 v 97 + 0.1 θ 98 v_{98} = 0.9v_{97} + 0.1\theta_{98} v98=0.9v97+0.1θ98

展开一下,得到:

v 100 = 0.1 θ 100 + 0.1 × 0.9 × θ 99 + 0.1 × 0. 9 2 × θ 98 + . . . . . . v_{100} = 0.1 \theta_{100} + 0.1 \times 0.9 \times \theta_{99} + 0.1 \times 0.9^2 \times \theta_{98} + ...... v100=0.1θ100+0.1×0.9×θ99+0.1×0.92×θ98+......

看到没有,每一项都会乘以0.9,这样就是指数加权的意思了,那么为什么表示的是10天内的平均值呢?明明是10天以前的数据都有加进去的才对,其实是因为 0. 9 10 ≈ 0.35 ≈ 1 e 0.9^{10} \approx 0.35 \approx \frac{1}{e} 0.9100.35e1,也就是10天以前的权重只占了三分之一左右,已经很小了,所以我们就可以认为这个权重就是10天内的温度平均,其实有详细的数学证明的,这里就不要证明了,反正理解了 ( 1 − ϵ ) 1 ϵ ≈ 1 e (1-\epsilon)^{\frac{1}{\epsilon}} \approx \frac{1}{e} (1ϵ)ϵ1e1 ϵ \epsilon ϵ为0.02的时候,就代表了50天内的数据。

因为指数加权平均不需要知道前面n个数据,只要一步一步进行迭代,知道当前的数据就行,所以非常节省空间。

指数加权平均的偏差修正

如果你细心一点,你就会发现其实这个公式有问题,

V 0 = 0 V_0 = 0 V0=0

V 1 = β ∗ V 0 + ( 1 − β ) θ 1 V_1 = \beta * V_0 + (1 - \beta) \theta_1 V1=βV0+(1β)θ1

… … ……

V t = β ∗ V t − 1 + ( 1 − β ) θ t V_t = \beta * V_{t-1} + (1 - \beta) \theta_t Vt=βVt1+(1β)θt

如果第一天的温度是40摄氏度,那么 V 1 = 0.1 ∗ 40 = 4 V_1 = 0.1 * 40 = 4 V1=0.140=4,显然是不合理的。因为初始值 V 0 = 0 V_0 = 0 V0=0,也就是前面几天的数据都会普遍偏低。所以特别是在估测初期,需要进行一些修正,这个时候就不要用 v t v_t vt了,而是用 v t 1 − β t \frac{v_t}{1-\beta^t} 1βtvt来代表第t天的温度平均,你会发现随着t的增加, β t \beta^t βt接近于0,所以偏差修正几乎就没有用了,而t比较小的时候,就非常有效果。

紫色线为修正前,绿色线为修正后的效果

不过在大部分机器学习中,一般也不需要修正,因为只是前面的初始时期比较有偏差而已,到后面就基本不会有偏差了,所以也不太用。

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

用动量梯度下降法运行速度总是比标准的梯度下降法要来的快。它的基本思想是计算梯度的指数加权平均数,然后用该梯度来更新权重。

效果如图:

使用动量梯度下降法后,在竖直方向上的抖动减少了,而在水平方向上的运动反而加速了。

算法公式:

可以发现,就是根据指数平均计算出了 v d W v_{dW} vdW,然后更新参数时把 d W dW dW换成了 v d w v_{dw} vdw β \beta β一般的取值是0.9。可以发现,在纵向的波动经过平均以后,变得非常小了,而因为在横向上,每一次的微分分量都是指向低点,所以平均后的值一直朝着低点前进。

物理意义:

  • 个人的理解是大概这个公式也很像动量的公式 m v = m 1 v 1 + m 2 v 2 m v = m_1 v_1 + m_2 v_2 mv=m1v1+m2v2,也就是把两个物体合并了得到新物体的质量和速度的意思
  • 理解成速度和加速度,把 v d W v_{dW} vdW看成速度, d W dW dW看成加速度,这样每次因为有速度的存在,加速度只能影响到速度的大小而不能够立刻改变速度的方向。

RMSprop(root mean square prop)

均方根传播。这是另一种梯度下降的优化算法。

顾名思义,先平方再开根号。

其实和动量梯度下降法公式差不多:

在更新参数的分母项加了一项 ϵ = 1 0 − 8 \epsilon = 10^{-8} ϵ=108,来确保算法不会除以0

Adam算法

Adam算法其实就是结合了Momentum和RMSprop ,注意这个时候要加上偏差修正:

  • 初始化参数: v d W = 0 v_{dW} = 0 vdW=0 S d W = 0 S_{dW} =0 SdW=0 v d b = 0 v_{db} = 0 vdb=0 S d b = 0 S_{db} =0 Sdb=0
  • 在第 t t t次迭代中,
    • 计算mini-batch的dW,db
    • Momentum: v d W = β 1 v d W + ( 1 − β 1 ) d W v_{dW}= \beta_{1}v_{dW} + ( 1 - \beta_{1})dW vdW=β1vdW+(1β1)dW v d b = β 1 v d b + ( 1 − β 1 ) d b v_{db}= \beta_{1}v_{db} + ( 1 -\beta_{1} ){db} vdb=β1vdb+(1β1)db
    • RMSprop: S d W = β 2 S d W + ( 1 − β 2 ) ( d W ) 2 S_{dW}=\beta_{2}S_{dW} + ( 1 - \beta_{2}){(dW)}^{2} SdW=β2SdW+(1β2)(dW)2 S d b = β 2 S d b + ( 1 − β 2 ) ( d b ) 2 S_{db} =\beta_{2}S_{db} + \left( 1 - \beta_{2} \right){(db)}^{2} Sdb=β2Sdb+(1β2)(db)2
    • v d W corrected = v d W 1 − β 1 t v_{dW}^{\text{corrected}}= \frac{v_{dW}}{1 - \beta_{1}^{t}} vdWcorrected=1β1tvdW v d b corrected = v d b 1 − β 1 t v_{db}^{\text{corrected}} =\frac{v_{db}}{1 -\beta_{1}^{t}} vdbcorrected=1β1tvdb
    • S d W corrected = S d W 1 − β 2 t S_{dW}^{\text{corrected}} =\frac{S_{dW}}{1 - \beta_{2}^{t}} SdWcorrected=1β2tSdW S d b corrected = S d b 1 − β 2 t S_{db}^{\text{corrected}} =\frac{S_{db}}{1 - \beta_{2}^{t}} Sdbcorrected=1β2tSdb
    • W : = W − a v d W corrected S d W corrected + ε W:= W - \frac{a v_{dW}^{\text{corrected}}}{\sqrt{S_{dW}^{\text{corrected}}} +\varepsilon} W:=WSdWcorrected +εavdWcorrected

超参数有 α , β 1 , β 2 , ϵ \alpha,\beta_1,\beta_2,\epsilon α,β1,β2,ϵ,一般 β 1 = 0.9 , β 2 = 0.999 , ϵ = 1 0 − 8 \beta_1 = 0.9,\beta_2 = 0.999,\epsilon = 10^{-8} β1=0.9,β2=0.999,ϵ=108

学习率衰减

在梯度下降时,如果是固定的学习率 α \alpha α,在到达最小值附近的时候,可能不会精确收敛,会很抖动,因此很难达到最小值,所以可以考虑学习率衰减,在迭代过程中,逐渐减小 α \alpha α,这样一开始比较快,后来慢慢的变慢。

常用的是:

KaTeX parse error: Expected '}', got '_' at position 40: …e * \text{epoch_̲num}} a_{0}

KaTeX parse error: Expected '}', got '_' at position 30: …qrt{\text{epoch_̲num}}}a_{0}

a = k t a 0 a =\frac{k}{\sqrt{t}}a_{0} a=t ka0

转载地址:http://terii.baihongyu.com/

你可能感兴趣的文章
java中float和double的区别
查看>>
Statement与PreparedStatement区别
查看>>
Tomcat配置数据源步骤以及使用JNDI
查看>>
before start of result set 是什么错误
查看>>
(正则表达式)表单验证
查看>>
在JS中 onclick="save();return false;"return false是
查看>>
JSTL 常用标签总结
查看>>
内容里面带标签,在HTML显示问题,JSTL
查看>>
VS编译器运行后闪退,处理方法
查看>>
用div+css做下拉菜单,当鼠标移向2级菜单时,为什么1级菜单的a:hover背景色就不管用了?
查看>>
idea 有时提示找不到类或者符号
查看>>
JS遍历的多种方式
查看>>
ng-class的几种用法
查看>>
node入门demo-Ajax让前端angularjs/jquery与后台node.js交互,技术支持:mysql+html+angularjs/jquery
查看>>
神经网络--单层感知器
查看>>
注册表修改DOS的编码页为utf-8
查看>>
matplotlib.pyplot.plot()参数详解
查看>>
拉格朗日对偶问题详解
查看>>
MFC矩阵运算
查看>>
最小二乘法拟合:原理,python源码,C++源码
查看>>