zoukankan      html  css  js  c++  java
  • 【零基础】神经网络优化之Adam

    一、序言

      Adam是神经网络优化的另一种方法,有点类似上一篇中的“动量梯度下降”,实际上是先提出了RMSprop(类似动量梯度下降的优化算法),而后结合RMSprop和动量梯度下降整出了Adam,所以这里我们先由动量梯度下降引申出RMSprop,最后再介绍Adam。不过,由于RMSprop、Adam什么的,真的太难理解了,我就只说实现不说原理了。

    二、RMSprop

      先回顾一下动量梯度下降中的“指数加权平均”公式:

      vDW1 = beta*vDW0 + (1-beta)*dw1

      vDb1 = beta*vDb0 + (1-beta)*db1

      动量梯度下降:

      W = W - learning_rate*vDW

      b = b - learning_rate*vDb

      简而言之就是在更新W和b时不使用dw和db,而是使用其“指数加权平均”的值。

      RMSprop只是做了一点微小的改变,为了便于区分将v改成s:

      sDW1= beta*sDW0 + (1-beta)*dw1^2

      sDb1 = beta*sDb0 + (1-beta)*db1^2

      RMSprop梯度下降,其中sqrt是开平方根的意思:

      W = W - learning_rate*(dw/sqrt(sDW))

      b = b - learning_rate*(db/sqrt(sDb))

      需要注意的是,无论是dw^2还是sqrt(sDW)都是矩阵内部元素的平方或开根。

    三、Adam

      Adam是结合动量梯度下降和RMSprop的混合体,先按动量梯度下降算出vDW、vDb

      vDW1 = betaV*vDW0 + (1-beta)*dw1

      vDb1 = betaV*vDb0 + (1-beta)*db1

      然后按RMSprop算出sDW、sDb:

      sDW1= betaS*sDW0 + (1-beta)*dw1^2

      sDb1 = betaS*sDb0 + (1-beta)*db1^2

      最后Adam的梯度下降是结合了v和s:

      W = W - learning_rate*( vDW/sqrt(sDW) )

      b = b - learning_rate*( vDb/sqrt(sDb) )

      我们来看下最终实现后的效果:

       是的,你没有看错。。。只需要100次训练,就比以前2000次训练的效果还要好!看到这个结果其实我也很震惊,反复查了几遍。

      不过使用Adam优化后的神经网络一定要注意learning_rate的设置,我这里改成了0.01(之前一直是0.1,多次试错后才发现是这个问题)否则会发生梯度消失(表现为dw等于0)。

    四、回顾

      本篇是在mini_batch的基础上,结合动量梯度下降、RMSprop做的Adam梯度下降,其目的与mini_batch、动量梯度下降一样,都是使神经网络可以更快找到最优解,不得不说Adam实在太给力了。完整的实现代码请关注公众号“零基础爱学习”回复“AI13”获取。

      

  • 相关阅读:
    SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSIS 系列
    微软BI 之SSAS 系列
    微软BI 之SSRS 系列
    微软BI 之SSRS 系列
    配置 SQL Server Email 发送以及 Job 的 Notification通知功能
  • 原文地址:https://www.cnblogs.com/cation/p/11760001.html
Copyright © 2011-2022 走看看