一般来说,Adam用到的信息更多,所以需要的内存占用更大。曾有个实验,Optimizer选择SGD的时候,Batch Size能选择20,但是换成Adam时候,Batch Size只能选择2
矩的定义
矩来自物理的定义,是距离和物理量的乘积,反映的是物体空间分布;
在数学中,矩表示一种数据测度:E(∣X−c∣k) 称为 X 关于 c 的 k 阶矩.
特别的,c=0,称为 k 阶原点矩,c=E(X) 称为中心距
再特别一点,E(∣X−c1∣p⋅∣Y−c2∣q) 称为X,Y关于 c1,c2 的q+p 阶矩.
如果 c1=c2=0,则称为 p+q 阶混合原点矩
如果 c1=E(X),c2=E(Y) ,则称为 p+q 阶混合中心距
指数滑动平均
指数滑动平均法简称为指数平滑法。是利用上一次的实际值和预测值(估算值),对它们进行不同的加权分配,求得一个 指数 平滑值,作为下一期预测值的一种预测方法。它的预测公式是:
Xt=αXt−1+(1−α)St,(0<α<1)Xt为第t次预测值,St为实际值;Xt−1为上一次的预测值;α为加权系数。
通常不直接利用一次指数平滑法来预测,而是利用二次指数平滑法,求出平滑系数,建立起预测模型,再进行预测。三次以上指数平滑法几乎适用于所有的时间序列预测.
Adam原理(全称:自适应矩估计优化器)
最关键的地方是:使用指数加权移动平均值来估算梯度的动量和二次矩,状态变量:
vt=β1vt−1+(1−β1)gtst=β2st−1+(1−β2)gt2
可以发现,上面那项 vt 其实就是梯度的一阶矩,下面那项 st 是梯度的二阶矩。一般来说,β1=0.9,β2=0.999, 也就是说,方差估计的移动要远远慢于动量估计的移动。
修正矩估计的偏差
vt^=1−β1tvtst^=1−β2tst
更新方程:
gt‘=st^+ϵvt^xt=xt−1−η⋅gt‘
Adam本质是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整
这里的 gt′ 当做归一化算了,可能的理解是:gt‘ 只关心方向,范数无所谓了,反正有学习率 η
理解
其实每次训练的时候都是分批次训练的,从总体样本中抽取一部分作为本次训练的样本。那么用这部分小样本的梯度当做总体样本的梯度就是矩估计(之前一直不清楚自适应矩估计的矩体现在哪里)。然后,如果直接使用样本梯度当做总体梯度又会发现有点问题,那就是方差。很明显,抽取的批样本只是总体样本的一部分,那么批样本的梯度不可能正好就是总体样本的梯度,批样本的梯度服从一个随机分布,其期望是总体梯度,但是这个随机分布是有方差的。(balabalal,胡言乱语)
Adam的自适应的体现之处在于指数平滑,缓解了梯度方向剧变,使收敛路径更平滑一点。
内存占用
既然用了更多信息,那么内存占用自然更多,很明显批训练的Batch_Size 上界会更小.
Adam使用了参数、梯度、动量和二阶动量,所以它的内存占用量是数据的四倍