Adam算法学习笔记

吴恩达老师的Adam算法学习笔记,记录一下理解过程

优化

Mini-Batch 梯度下降

将训练集排序打乱,然后分割成固定大小的子集n个(最后一个除外),然后遍历子集使用梯度下降更新参数。(这种方法主要运用在特别大的数据集中)
在固定学习率的情况下:

  • 优点:相比于batch梯度下降法,Mini-batch整个数据集的一次前反向传播就可以对参数进行n+1次更新,并且可以在数据集没有完全遍历完就拥有已经更新过的参数进行后续工作。相比于随机梯度下降法,Mini-batch利用了向量化的计算方法,使迭代速度更快。正因如此,我们应该为子集大小设定一个不大不小的数值
  • 弊端:由于每次训练用的都是一个小的子集,所以每次下降的方向不是很稳定,这将会导致损失出现振荡

指数加权平均

由于Mini-Batch梯度下降的不稳定,我们可以利用指数加权平均来平衡下降方向

  • 公式:v_{dW} = v_{dW} + (1- )dW
    根据的不同,v_{dW}值对于之前的子集数据训练时得出的v_{dW}依赖程度也不同,通常=0.9时,v_{dW}的值主要依赖之前10个子集得到的v_{dW},如果=0.98时,则依赖之前50项的值。
  • 偏差修正
    v_{dW}=\frac {v_{dW}}{1-^t}
    因为我们一般会设置起始项v_{dW}=0,导致后续几项依赖此项而产生较大偏差,使用此公式则可以消除。其中t=i+1,其中i表示当前子集的下标。

Momentum梯度下降法

在Mini-Batch梯度下降中加入指数加权平均得到的就是可以减少损失振荡的梯度,使用这个值带入参数更新中:
W=W-v_{dW} \\ b=b-v_{db}
这种梯度下降法就叫做Momentum梯度下降法

RMSprop算法 (全称:root menu square prop)

S_{dW}=S_{dW}+(1-)(dW)^2 \\ S_{db}=S_{db}+(1-)(db)^2
更新参数时使用:
W=W-\frac {dW}{\sqrt {S_{dW}}} \\ b=b-\frac {db}{\sqrt {S_{db}}}
(以后想到更好的描述方式再更新这部分内容)
我在数学上的感觉告诉我,相比指数加权平均,在得到S_{dW}值的计算过程中,加重了本次dW所占的比例,\sqrt {S_{dW}} 可以将大数压缩成一个很小的数,如果是一个小数,则可以得到一个较大的小数。如果dW是一个较大的梯度值,那么除以小值后得到的是稍小一些的数,使用这个数进行参数更新可以减小震荡。如果dW是小数,除以\sqrt {S_{dW}}则等于乘以一个>1的较小的数,综合来讲:
\frac { dW} {\sqrt {S_{dW}}}
相比原始的更新方法,总能让dW较大时,变为一个较小的数,dW太小时,对其进行放大,如果dW不大不小,得到的值与它很接近。
使用RMSProp算法可以设置一个较大的来进行快速迭代而不用担心错过最小点

Adam算法

Adam算法结合了Momentum与RMSprop:
初始化V_{dW}=0, S_{dW}=0
在Mini-batch迭代中:
V_{dW} = _1V_{dW} + (1-_1)dW \\ S_{dW} = _2S_{dW} + (1-_2)(dW)^2
然后使用偏差修正:(其中t=i+1,i指当前子集的下标)
V_{dW}^{current} = \frac {V_{dW}}{1- _1^t} \\ S_{dW}^{current} = \frac {S_{dW}}{1- _2^t}
然后更新参数:
W=W-\frac { V_{dW}^{current}}{\sqrt {S_{dW}}+ξ}

  • 超参数
    _1建议使用0.9
    _2建议使用0.999
    ξ建议使用10^{-8}, 主要用于防止出现参数为0的情况
    可以多次迭代,寻找最为恰当的值

你可能感兴趣的:(Adam算法学习笔记)