我发现文档很清楚,我会在这里粘贴算法的伪代码:
你的参数:
> learning_rate:1e-4和1e-2之间是标准的
> beta1:0.9默认情况下
> beta2:默认为0.999
> epsilon:默认为1e-08
The default value of 1e-8 for epsilon might not be a good default in general. For example, when training an Inception network on ImageNet a current good choice is 1.0 or 0.1.
初始化:
m_0
v_0
t
对于网络的每个参数,m_t和v_t将跟踪梯度的移动平均值及其平方. (所以如果你有1M参数,亚当将在内存中保留2M以上的参数)
在每次迭代t,以及模型的每个参数:
t
lr_t
m_t
v_t
variable
这里lr_t与learning_rate略有不同,因为对于早期迭代,移动平均线尚未收敛,因此我们必须通过乘以sqrt(1 – beta2 ^ t)/(1 – beta1 ^ t)进行归一化.当t为高(t>1./(1.-β2))时,lr_t几乎等于learning_rate
要回答你的问题,你只需要传递一个固定的学习率,保持beta1和beta2的默认值,也许修改epsilon,而Adam会做魔术:)
与RMSProp联系
具有beta1 = 1的Adam等同于具有动量= 0的RMSProp.亚当的论证beta2和RMSProp的论证衰变是相同的.
但是,RMSProp不保持梯度的移动平均值.但它可以保持势头,如MomentumOptimizer.
rmsprop的详细说明.
>保持渐变平方的移动(折扣)平均值
>按此平均值的根除以梯度
>(可以保持动力)
这是伪代码:
v_t
mom = momentum * mom{t-1} + learning_rate * gradient / sqrt(v_t + epsilon)
variable