zoukankan      html  css  js  c++  java
  • 使用动量的梯度下降法

    整理自吴恩达深度学习系列视频:
    https://mooc.study.163.com/learn/2001281003?tid=2001391036#/learn/content?type=detail&id=2001702123
    In one sentence, the basic idea is to compute an exponentially weighted average of your gradients, and then use that gradient to update your weights instead

    指数加权平均参考前一篇博客:https://blog.csdn.net/Solo95/article/details/84837217

    使用动量的梯度下降法

    在这里插入图片描述

    如图所示,普通的梯度下降法如图中蓝色画线所示,它在接近最优值红点时,会上下摆动,导致不能很快的收敛到红点,而且如果摆动的幅度过大还会导致发散(紫色画线所示),这也是为什么不能采用很大的learning_rate来加快学习速度。

    所以我们引入了指数加权平均来计算梯度的平均值,这会抵消大部分梯度的垂直方向上的摆动,同时保留水平方向上的前进速度,使其更快收敛。使用动量的梯度下降法,“动量”,来自对它的物理上的解释,相当于在一个碗里丢一个小球,通过赋予小球动量,使其减少在碗壁上的左右摆动,让它更快到达碗底,。

    使用动量的梯度下降法计算方法

    在这里插入图片描述
    在每次迭代中,我们计算:
    v d w = β v d w + ( 1 − β ) d W v_{dw}=eta v_{dw}+(1-eta)dW vdw=βvdw+(1β)dW 即指数加权平均,下同。
    v d b = β v d b + ( 1 − β ) d b v_{db}=eta v_{db}+(1-eta)db vdb=βvdb+(1β)db

    注意 β = 0 eta=0 β=0时,就退化成了普通的梯度下降。

    起始bias修正:
    因为我们取 v d w v_{dw} vdw v d b v_{db} vdb为零,所以一开始计算出的 v d w v_{dw} vdw v d b v_{db} vdb将会小于实际值,为了修正起始阶段这个偏差,使用以下计算方法:
    v d w = v d w 1 − β t v_{dw}=frac{v_{dw}}{1-eta^t} vdw=1βtvdw
    v d b = v d b 1 − β t v_{db}=frac{v_{db}}{1-eta^t} vdb=1βtvdb

    注意随着t增大 1 − β t 1-eta^t 1βt越来越接近1,也就是说修正起的作用越来越小,它只在warm up阶段有效。

    更新parameters的过程变为:
    W = W − α v d w W = W-alpha v_{dw} W=Wαvdw b = b − α v d b b = b-alpha v_{db} b=bαvdb

    现在,除了超参数 α alpha α,我们又多出了一个 β eta β,但 β eta β一般取0.9,所以你不用担心它的取值问题,你也可以尝试取其他值,但0.9已经被证明很健壮。

  • 相关阅读:
    hive 三种启动方式及用途
    Nodejs根据字符串调用对象方法
    Hive原理与不足
    [置顶] 面向领域概念:流的思考
    curl的使用
    mysql知识点总结
    中文字符串反转
    《c陷阱与缺陷》之贪心法
    静态数据成员和静态成员函数
    常成员函数 int fun() const;
  • 原文地址:https://www.cnblogs.com/wanghongze95/p/13842534.html
Copyright © 2011-2022 走看看