Adam算法
Adam算法直观上其实是RMSProp算法和Momentum算法的加和,即Adam = RMSProp + Momentum,因为其思想采用了使用过去的累加动量和梯度。
-
公式
一般设置,
,
就相当于动量法,是一阶梯度矩阵,
相当于RMSProp法,是二阶梯度矩阵,
和
分别是对原始值的偏差修正。采用偏差矫正的原因是因为采用移动指数平均方法并且在
和
初始值都为0向量,所以在刚开始阶段如果不进行修正,算法会给梯度分配很小的权重,得到不真实的结果。
偏差矫正的直观感受
,
,
,
,那么公式就变成
可以看到,原本的一阶梯度和二阶梯度由于和
的作用权重比原来小了很多,如果想要使得梯度发挥更大的作用,就要进行修正。
偏差矫正的严格推导
由于:
将时间放到步后:
又因为等比数列的前项和:
所以有如下公式,同理可证:
代码
first_moment = 0
second_moment = 0
while True:
dx = compute_gradient(x)
first_moment = beta1 * first_moment + (1 - beta1) * dx
second_moment = beta2 * second_moment + (1 - beta2) * dx * dx
first_unbias = first_moment / ( 1 - beta1**t)
second_unbias = second_moment / ( 1 - beta2**t)
x -= learning_rate * first_unbias / (np.sqrt(second_unbias) + 1e-7)
- 优点:
考虑动量、考虑自适应、进行修正、快速到达最小点。