zoukankan      html  css  js  c++  java
  • 深度学习——优化算法[6]

    目录

    • mini-batch
    • 指数加权平均
    • 优化梯度下降法:momentum、RMSprop、Adam
    • 学习率衰减
    • 局部最优问题

    一、mini-batch

    mini-batch:把训练集划分成小点的子集

    表示法 $x^{{1}}$ $x^{(1)}$ $x^{[1]}$
    意义 第一个mini-batch 第一个样本 第一层的输入
    • 为什么用mini-batch:当数据集样本数较多时,需要对整个数据计算完成后才能进行梯度下降,速度较慢
    • epoch:一代,表示遍历了整个数据集(而不是一个子集)
    • 使用mini-batch的梯度下降方法过程:每次以当前的一个mini-batch作为输入数据

    for $t = 1,...,5000$

      //forward prop on 第t个minibatch,输入为$X^{{t}}$

      for $i=1...l$ //正向计算,共l层

        $Z^{[i]}=W^iA^{[i-1]}+b^{[i]}$

        $A^{[i]}=g^{[i]}(Z^{[i]}$

          //$A^{l}$为最后的输出结果

         计算该mini-batch的cost $J^{{t}}=frac{1}{1000}sum mathcal{L}(widehat{y}^{j},y^{j})$

      反向计算求导$J^{{t}}$

      更新参数$W$$b$,$W^{[l]}:=W^{[l]}-alpha dW^{[l]}$ $b^{[l]}:=b^{[l]}-alpha db^{[l]}$

    •  使用mini-batch的成本函数变化趋势:并不是每一次都下降,但是整体趋势是下降

    • 选择min-batch的大小

    太大的话每次迭代耗时太长,太小的话每次只处理少量效率低(失去了向量加速的优势)

    当数据集比较小(小于2000)时,可以直接使用batch

    当数据集比较大时,一般可以用的mini-batch大小:64,128,256, 512...(与CPU/GPU内存相匹配)

    二、指数加权平均(指数加权移动平均)exponentially weighted average

    例:伦敦的温度变化

    $ heta_{1}=40^{circ}F$

    $ heta_{2}=49^{circ}F$

    $ heta_{3}=45^{circ}F$

     ...

    求解$v_{t}$:前$t$天的温度加权平均值。虽然$v_{t}$包含1~$t$天的温度,但是越接近第$t$天的权重会更大一点,而较前的就会接近0

    $v_{0}=0$

    $v_{1}=eta v_{0} + (1-eta ) heta_{1}$

    $v_{2}=eta v_{1} + (1-eta ) heta_{2}$

    ...

    $v_{t}=eta v_{t-1} + (1-eta ) heta_{t}$

      $=eta^{t} heta_{0}+eta^{t-1}(1-eta) heta_{1}$

        $+eta^{t-2}(1-eta) heta_{2}+...+(1-eta) heta_{t}$

    蓝色点为原始数据,其它为不同的$eta$取值时,加权平均结果

    • 应该平均多少天的温度?当某天温度的权重很低时就不用再考虑

    $y=(1-varepsilon)^{frac{1}{varepsilon}}$单调递减。当$varepsilon=0.9$时,$y approx frac{1}{e}$。所以,当计算到第$frac{1}{e}approx 0.3$天时,温度会下降到当天的1/3以下,可忽略。因此,可以认为$v_{t}$是$frac{1}{1-eta}$天的温度加权平均值

    • 做偏差修正bias correct

    为什么需要:开始的时候设置$v_0=0$,容易导致前期的预测会比较实际的小很多,估计不准确

    修正方法:$v'_{t}=frac{v_{t}}{1-eta^{t}}$,用$v'_{t}$来代替$v_{t}$。前期的值可以变大一些,而后期时$t$较大时,$eta^{t}$趋于0,$v'_{t}$也就趋于$v_{t}$

    下图中紫线为$v_{t}$,绿色为$v'_{t}$

    三、优化梯度下降算法

    • 标准梯度下降的问题(下图蓝线效果):从一个随机的点开始进行梯度下降,可能会像蓝色部分波动比较大,下降速度慢;无法使用更大的学习率,因为可能会偏离函数范围

      • 优化手段:减少纵向的浮动,加快横向的移动,以及增大学习率
    • 动量梯度下降法momentum
      • 优化:利用对梯度求指数加权平均的方法以加快训练的速度(上图红线效果)

           通过求平均,可以把纵向的浮动抵消,而横向的变化依旧,从而加快下降速度

      • 具体实现:用加权平均值来代替当前的求导结果;实际中一般不用做偏差修正,大概10次迭代就过了初始期,不再是有偏差的结果;$eta$取值为0.9

        for $t = 1...,$

          计算当前mini-batch的$dW, db$

          $v_{dW}=eta v_{dW}+(1-eta)dW$
          $v_{db}=eta v_{db}+(1-eta)db$

          $W:=W-alpha v_{dW}$, $b:=b-alpha v_{db}$

    • RMSprop : root mean square prop
      • 均方根:先对$dW$求平方,更新时又除以它的根方
      • 为什么有效果

        假设$W$和$b$分别表示横向和纵向变化。

                 如果要让纵向也就是$b$的变化慢一点(浮动小一些),也就是更新时减去的值小一些。可以发现原来纵向的变化较大($db$较大),所以$frac{1}{sqrt{S_{db}}}$会小一点,由此可让$db$变化慢点

      • 具体实现:为了避免除数为0,一般可以加上$varepsilon=10^{-8}$

    for $t = 1,...$

      计算当前mini-batch的$dW,db$

      $S_{dW}=eta_{2}S_{dW}+(1-eta_{2})dW^{2}$

      $S_{db}=eta_{2}S_{db}+(1-eta_{2})db^{2}$

      $W:=W-alpha frac{dW}{sqrt{S_{dW}}+varepsilon}$, $b:=b-alpha frac{db}{sqrt{S_{db}}+varepsilon}$

    • Adam算法 :momentum与RMSprop的结合,常用的方法
      • 具体实现

    $for t = 1,...$

      计算当前mini-batch人$dW,db$

      //momentum部分

      $v_{dW}=eta_{1} v_{dW}+(1-eta_{1})dW$, $v_{db}=eta_{1} v_{db}+(1-eta_{1})db$

      //RMSprop部分

      $S_{dW}=eta_{2}S_{dW}+(1-eta_{2})dW^{2}$, $S_{db}=eta_{2}S_{db}+(1-eta_{2})db^{2}$

      //偏差修正

      $v^{corrected}_{dW}=frac{v_{dW}}{1-eta_{1}^{t}}$,$v^{corrected}_{db}=frac{v_{db}}{1-eta_{1}^{t}}$

      $S^{corrected}_{dW}=frac{S_{dW}}{1-eta_{2}^{t}}$, $S^{corrected}_{db}=frac{S_{db}}{1-eta_{2}^{t}}$

      //更新

      $W:=W-alpha frac{v_{dW}^{corrected}}{sqrt{S_{dw}{corrected}}+varepsilon}$, $b:=W-alpha frac{v_{db}^{corrected}}{sqrt{S_{db}{corrected}}+varepsilon}$

      • 超参数选择
    $alpha$学习率 $eta_{1}$用于momentum $eta_{2}$用于RMSprop $varepsilon$
    需要调 0.9 0.999 $10^{-8}$

    四、学习率衰减:随时间逐渐减少学习率

    为什么:如果一直用比较大的学习率,当靠近最小值时,结果可能会在较大范围内进行浮动(不易收敛),而不是在很接近最小值的小范围内变化

    重要性:不是最开始的重点,可以先设置一个固定的,先调整其它的,后期再进行调整

    学习率衰减的方式

    • $alpha = frac{1}{1+decay-rate*epoch-num}alpha_{0}$
    • $alpha=0.95^{epoch-num}alpha_{0}$   指数衰减
    • $alpha=frac{k}{sqrt{epoch-num}}alpha_{0}$
    • 每过一段时间,对学习率减半(离散下降discrete staircase)

    五、局部最优问题

    • 局部最优问题:在做梯度下降时,会不会最后是趋于局部最优的解,而非最优解?
    • 答:这不是一个大问题,要找到一个局部最优点,需要它在各个维度都是最优的(比如都是凹/凸)。当维度比较大时,这种情况很难遇到。不过,鞍点还是比较容易遇到的
    • 鞍点:在某个位置,各维导数均为0,但是凹凸性不是完全一致的。如下图右侧

    • 应该考虑的问题:存在平滑导致梯度下降变化慢的问题
    • 解决方法:利用上面提到的几种优化方法来加快

  • 相关阅读:
    hadoop 2.7 添加或删除datanode节点
    hadoop HA集群的安装
    Linux-PAM认证
    [Notice]博客地址转移 vitostack.com
    WPF 自定义 MessageBox (相对完善版 v1.0.0.6)
    python2.7 倒计时
    Hadoop Streaming框架使用(二)
    Hadoop错误码速查
    Hadoop Streaming框架使用(一)
    python清空列表的方法
  • 原文地址:https://www.cnblogs.com/coolqiyu/p/8573056.html
Copyright © 2011-2022 走看看