深度学习从入门到放飞自我:通俗理解Adam Optimizer

佚名 次浏览

摘要:AdamOptimizer应该是最常用的优化算法,并且其已经在大量的深度神经网络实验上验证了其有效性,下面我将一步一步拆解,介绍AdamOptimizer的来龙去脉。一般机器学习任务,我们的数据集主要有:样本集:;维度:

Adam Optimizer应该是最常用的优化算法,并且其已经在大量的深度神经网络实验上验证了其有效性,下面我将一步一步拆解,介绍Adam Optimizer的来龙去脉。

一般机器学习任务,我们的数据集主要有:

样本集: X=[x^{(1)}, ..., x^{(n)}] ;维度: n * c

标签集: Y=[y^{(1)}, ..., y^{(n)}] ;维度: n*1

对样本量为 n 的数据集,我们可以将其划分为一个个mini-batch,batch size用 s 表示

假设 n/s=m ,则我们可以将数据集划分为 m 个mini-batch

即:

X=[X^{\\{1\\}}, ..., X^{\\{m\\}}]\\\\

其中,X^{\\{1\\}}=[x^{(1)}, ..., x^{(s)}];维度: s*cY=[Y^{\\{1\\}}, ..., Y^{\\{m\\}}]\\\\其中,Y^{\\{1\\}}=[y^{(1)}, ..., y^{(s)}] ;维度: s*1

// one epoch training procedure

// 其中 表示num batches,该循环表示遍历一轮整个数据集上的所有mini-batch

for t=1,..., m

{

输入当前mini-batch X^{\\{t\\}} 到网络前向传播获得 \	ilde{Y^{\\{t\\}}}

计算损失函数: J^{\\{t\\}}=\\frac{1}{s}\\sum_{i=1}^s l( \	ilde{y^{(i)}}, y^{(i)}) + regular\\_item # 表示batch size

反向传播计算梯度: dWdb (假设神经网络中参数为 Wb

W \\leftarrow W - \\alpha \\cdot dW

b \\leftarrow b - \\alpha \\cdot db

}

注意:以上算法仅仅表示一个epoch的训练过程,一般深度学习训练过程会在外层再套一个循环来遍历多个epoch

mini-batch梯度下降是用得最多的梯度下降算法

其中,

s=1 ,此时mini-batch梯度下降就是随机梯度下降算法(Stochastic Gradient Descent):1个样本作为1个mini-batch

s=n ,此时mini-batch梯度下降就是批梯度下降算法(Batch Gradient Descent):整个数据集所有样本作为1个mini-batch

mini-batch梯度下降相当于介于两者之间,batch-size一般选取为64,128,256,512等,最好是2的次方


指数加权平均数,又叫指数加权移动平均,是一种常用的序列数据处理方式,可以理解成是计算序列数据的局部平均数

假设有序列数据: \\{ \	heta_1, ..., \	heta_n \\}

则可建立:

V_t=\\beta V_{t-1}+ (1-\\beta) \	heta_t\\\\

其中, V_0=0

关于 V_t 的具体意义

V_t 可理解成是近似等于时刻 t 元素往前推 \\frac{1}{1-\\beta} 个元素的均值(可以想象成是一个size为 \\frac{1}{1-\\beta} 的滑动窗口,滑动窗口内所有元素的均值。其实再往前的元素对 V_t 也有贡献,只是权重太小了,可以忽略),即:

V_t \\approx \\sum_{i=t-k+1}^{t}\	heta_i\\\\

其中, k=\\frac{1}{1-\\beta}

根据 V_t=\\beta V_{t-1}+ (1-\\beta) \	heta_t

\\beta 大时, V_{t-1} 的权重占比较大, \	heta_t 权重占比较小,因此当前时刻的数据对 V_t影响不大,而过去的 V_{t-1} 才对其影响较大。

举个栗子:

现有 \\{\	heta_1, \	heta_2, ..., \	heta_{100}\\} ,令 \\beta=0.9 ,则:

v_{100}=0.9 v_{99}+ 0.1 \	heta_{100}\\\\

v_{99}=0.9 v_{98}+ 0.1 \	heta_{99}\\\\

v_{98}=0.9 v_{97}+ 0.1 \	heta_{98}\\\\

.......\\\\

\\begin{align}v_{100}&=0.1 \	heta_{100}+ 0.9 v_{99}\\\\ &=0.1 \	heta_{100}+ 0.9(0.1\	heta_{99}+0.9v_{98})\\\\ &=0.1 \	heta_{100}+ 0.1 \\cdot 0.9\\cdot \	heta_{99}+0.1 \\cdot (0.9)^2 \	heta_{98}+ 0.1 \\cdot (0.9)^3 \	heta_{97}+ ... \\end{align}

特点:

对当前 t=100v_{100} ,越远离 t=100 的元素 \	heta ,其权重越小。

权重呈指数衰减。

另外还有个问题:指数加权平均数 偏差纠正

因为 V_0=0 ,因此当 t 较小,比如 t=1,2 时, V_t 会很小,不能很好地反应序列数据的均值。

仍以上面的栗子: \\beta=0.9

V_0=0\\\\ V_1=\\beta * V_0 + (1-\\beta) * \	heta_1=0.1\	heta_1\\\\

这里 V_1 显然就是太小了,不能反映当前的均值

可对 V 进行适当纠正:

\\frac{V_t}{1-\\beta^t}\\\\


为什么要弄个这么个“麻烦”的方法来计算序列数据的局部平均数呢?

我直接用个滑动窗口算均值不也可以吗??

使用指数加权平均数不需要保存所有的序列数据,而只需保存当前状态 V 和当前序列数据 \	heta_t 就可以了,可以编程迭代计算。

在优化算法中,每一个mini batch上计算的梯度不就正是序列数据嘛???!!!

是不是似乎找到了指数加权平均数和优化算法的一点关系了?


Momentum梯度下降算法:使用指数加权平均数来计算梯度,从而更新参数

也就是将可学习参数的梯度作为序列数据,计算梯度的指数加权平均数来更新参数

算法流程:

// one epoch training procedure

// 其中m 表示num batches,该循环表示遍历一轮整个数据集上的所有mini-batch

for t=1, ..., m

{

在当前mini-batch上计算梯度 dWdb (网络参数为 Wb

v_{dW}=\\beta v_{dW}+ (1-\\beta) dW

v_{db}=\\beta v_{db}+ (1-\\beta) db

W \\leftarrow W - \\alpha \\cdot v_{dW}

b \\leftarrow b - \\alpha \\cdot v_{db}

}

注意:以上算法也是只针对一个epoch的


对于 v_{dW}=\\beta v_{dW}+ (1-\\beta) dW ,可以比较形象地比喻:

v_{dW} 表示速度, dW 表示加速度,速度在加速度的牵引下改变。

同时 0<\\beta<1 ,因此在没有加速度的情况下速度是有折损的,这可理解成是摩擦力


全称:Root Mean Square propagation

目的:将梯度除以序列数据的指数加权平均数(类似normalize操作)来更新可学习参数,以防止某一参数方向上,更新的梯度过大或者过小。

算法流程:

// one epoch training procedure

// 其中m 表示num batches,该循环表示遍历一轮整个数据集上的所有mini-batch

for t=1, ..., m

{

在当前mini-batch上计算梯度 dWdb (网络参数为 Wb

s_{dW}=\\beta \\cdot s_{dW}+ (1-\\beta) (dW)^2

s_{db}=\\beta \\cdot s_{db}+ (1-\\beta) (db)^2

W \\leftarrow W - \\alpha \\cdot \\frac{dW}{\\sqrt{s_{dW}}+\\varepsilon}

b \\leftarrow b - \\alpha \\cdot \\frac{db}{\\sqrt{s_{db}}+\\varepsilon}

}

注意(dW)^2(db)^2 均表示element-wise操作


Adam Optimizer终于千呼万唤始出来!!!

Adam全称:Adaptive Moment estimation

Adam Optimizer就是将Momentum和RMSProp结合起来。

算法流程:

// one epoch training procedure

// 其中m 表示num batches,该循环表示遍历一轮整个数据集上的所有mini-batch

// 初始化

v_{dW}=0

s_{dW}=0

v_{db}=0

s_{db}=0

for t=1, ..., m

{
在当前mini-batch上计算梯度 dWdb (网络参数为 Wb

v_{dW}=\\beta_1 \\cdot v_{dW}+ (1-\\beta_1)\\cdot dW

v_{db}=\\beta_1 \\cdot v_{db}+ (1-\\beta_1)\\cdot db

s_{dW}=\\beta_2 \\cdot s_{dW}+ (1-\\beta_2)\\cdot (dW)^2

s_{db}=\\beta_2 \\cdot s_{db}+ (1-\\beta_2)\\cdot (db)^2

v_{dW}^{corrected}=\\frac{v_{dW}}{1-\\beta_1^t} (指数加权平均值偏差纠正)

v_{db}^{corrected}=\\frac{v_{db}}{1-\\beta_1^t}

s_{dW}^{corrected}=\\frac{s_{dW}}{1-\\beta_2^t}

s_{db}^{corrected}=\\frac{s_{db}}{1-\\beta_2^t}

W \\leftarrow W - \\alpha \\cdot \\frac{v_{dW}^{corrected}}{\\sqrt{s_{dW}^{corrected}}+\\varepsilon}

b \\leftarrow b - \\alpha \\cdot \\frac{v_{db}^{corrected}}{\\sqrt{s_{db}^{corrected}}+\\varepsilon}

}

注意:以上算法也是只针对一个epoch的

超参数设置:

\\beta_1 :常设为 0.9

\\beta_2 :常设为 0.999

\\varepsilon :常设为 10^{-8}

\\alpha 表示学习率,一般不会设置一个固定值,而是随着训练轮数(epoch)衰减

几种学习率衰减策略:

t 表示当前轮数(epoch)

策略1:

\\alpha=\\frac{1}{1+decay\\_rate*t}\\cdot \\alpha_0\\\\

策略2:

\\alpha=0.95^{t}\\cdot \\alpha_0\\\\

策略3:

\\alpha=\\frac{k}{\\sqrt{t}}\\cdot \\alpha_0\\\\

策略4:

阶梯取值:

\\begin{align}\\alpha &=k_1, \\quad if \\quad a_1 < t < a_2\\\\ \\alpha &=k_2, \\quad if \\quad a_2 < t < a_3\\\\ \\alpha &=k_3, \\quad if \\quad a_3 < t < a_4\\\\ ... \\end{align}


吴恩达 deep learning.ai 课程

随机内容

平台注册入口