摘要:AdamOptimizer应该是最常用的优化算法,并且其已经在大量的深度神经网络实验上验证了其有效性,下面我将一步一步拆解,介绍AdamOptimizer的来龙去脉。一般机器学习任务,我们的数据集主要有:样本集:;维度:
Adam Optimizer应该是最常用的优化算法,并且其已经在大量的深度神经网络实验上验证了其有效性,下面我将一步一步拆解,介绍Adam Optimizer的来龙去脉。
一般机器学习任务,我们的数据集主要有:
样本集: ;维度:
标签集: ;维度:
对样本量为 的数据集,我们可以将其划分为一个个mini-batch,batch size用 表示
假设 ,则我们可以将数据集划分为 个mini-batch
即:
其中,;维度: 其中, ;维度:
// one epoch training procedure
// 其中 表示num batches,该循环表示遍历一轮整个数据集上的所有mini-batch
for t=
{
输入当前mini-batch 到网络前向传播获得
计算损失函数: # 表示batch size
反向传播计算梯度: 和 (假设神经网络中参数为 和 )
}
注意:以上算法仅仅表示一个epoch的训练过程,一般深度学习训练过程会在外层再套一个循环来遍历多个epoch
mini-batch梯度下降是用得最多的梯度下降算法
其中,
,此时mini-batch梯度下降就是随机梯度下降算法(Stochastic Gradient Descent):1个样本作为1个mini-batch
,此时mini-batch梯度下降就是批梯度下降算法(Batch Gradient Descent):整个数据集所有样本作为1个mini-batch
mini-batch梯度下降相当于介于两者之间,batch-size一般选取为64,128,256,512等,最好是2的次方
指数加权平均数,又叫指数加权移动平均,是一种常用的序列数据处理方式,可以理解成是计算序列数据的局部平均数。
假设有序列数据:
则可建立:
其中,
关于 的具体意义:
可理解成是近似等于时刻 元素往前推 个元素的均值(可以想象成是一个size为 的滑动窗口,滑动窗口内所有元素的均值。其实再往前的元素对 也有贡献,只是权重太小了,可以忽略),即:
其中,
根据 :
大时, 的权重占比较大, 权重占比较小,因此当前时刻的数据对 影响不大,而过去的 才对其影响较大。
举个栗子:
现有 ,令 ,则:
特点:
对当前 的 ,越远离 的元素 ,其权重越小。
权重呈指数衰减。
另外还有个问题:指数加权平均数 偏差纠正
因为 ,因此当 较小,比如 时, 会很小,不能很好地反应序列数据的均值。
仍以上面的栗子:
这里 显然就是太小了,不能反映当前的均值
可对 进行适当纠正:
为什么要弄个这么个“麻烦”的方法来计算序列数据的局部平均数呢?
我直接用个滑动窗口算均值不也可以吗??
使用指数加权平均数不需要保存所有的序列数据,而只需保存当前状态 和当前序列数据 就可以了,可以编程迭代计算。
在优化算法中,每一个mini batch上计算的梯度不就正是序列数据嘛???!!!
是不是似乎找到了指数加权平均数和优化算法的一点关系了?
Momentum梯度下降算法:使用指数加权平均数来计算梯度,从而更新参数
也就是将可学习参数的梯度作为序列数据,计算梯度的指数加权平均数来更新参数
算法流程:
// one epoch training procedure
// 其中 表示num batches,该循环表示遍历一轮整个数据集上的所有mini-batch
for t=
{
在当前mini-batch上计算梯度 和 (网络参数为 和 )
}
注意:以上算法也是只针对一个epoch的
对于 ,可以比较形象地比喻:
表示速度, 表示加速度,速度在加速度的牵引下改变。
同时 ,因此在没有加速度的情况下速度是有折损的,这可理解成是摩擦力
全称:Root Mean Square propagation
目的:将梯度除以序列数据的指数加权平均数(类似normalize操作)来更新可学习参数,以防止某一参数方向上,更新的梯度过大或者过小。
算法流程:
// one epoch training procedure
// 其中 表示num batches,该循环表示遍历一轮整个数据集上的所有mini-batch
for t=
{
在当前mini-batch上计算梯度 和 (网络参数为 和 )
}
注意: 和 均表示element-wise操作
Adam Optimizer终于千呼万唤始出来!!!
Adam全称:Adaptive Moment estimation
Adam Optimizer就是将Momentum和RMSProp结合起来。
算法流程:
// one epoch training procedure
// 其中 表示num batches,该循环表示遍历一轮整个数据集上的所有mini-batch
// 初始化
for t=
{
在当前mini-batch上计算梯度 和 (网络参数为 和 )
(指数加权平均值偏差纠正)
}
注意:以上算法也是只针对一个epoch的
超参数设置:
:常设为
:常设为
:常设为
表示学习率,一般不会设置一个固定值,而是随着训练轮数(epoch)衰减。
几种学习率衰减策略:
表示当前轮数(epoch)
策略1:
策略2:
策略3:
策略4:
阶梯取值:
吴恩达 deep learning.ai 课程