概述
实现Adam算法的优化器
一句话解释:实现梯度下降,找到极值
官方api网址:
https://www.tensorflow.org/api_docs/python/tf/keras/optimizers/Adam?version=nightly#__init__
算法根据下面论文实现:
https://openreview.net/pdf?id=ryQu7f-RZ
算法伪代码在官方api中
常用方法
创建
__init__(
learning_rate=0.001,
beta_1=0.9,
beta_2=0.999,
epsilon=1e-07,
amsgrad=False,
name='Adam',
**kwargs
)
参数
- learning_rate:学习速率
- beta_1:float,
0 <beta <1。一般接近1。一阶矩估计的指数衰减率。 - beta_2:float,
0 <beta <1。一般接近1。二阶矩估计的指数衰减率。 - epsilon:float,为了防止在实现中除以零。
- amsgrad:使用不同的算法
apply_gradients
把计算出来的梯度更新到变量上面去。
一句话解释:实现梯度下降
apply_gradients(
grads_and_vars,
name=None
)
参数
grads_and_vars:list类型,其内部元素是tuple类型,即
[(gradient, variable)]- gradient:是
tf.GradientTape()的tape.gradient()返回值 - variable:是函数的自变量
例子:
adam.apply_gradients([(g,x)])- gradient:是
返回值
An Operation that applies the specified gradients. The iterations will be automatically increased by 1.
例子
自己实现梯度下降(废弃)
lr=1
b1=0.1
b2=0
e=1e-07
mt=0
mt_last=0
vt_last=0
def exe_x(x_var,g):
global mt,vt_last,mt_last
# print("g:",g)
lrt=lr*(1-b2)**0.5/(1-b1)
mt=b1*mt_last+(1-b1)*g
mt_last=mt
vt=b2*vt_last+(1-b2)*g*g
vt_last=vt
x_var=x_var-lrt*mt/(vt**0.5+e)#-b1
print("x_var:%s,lrt:%s,mt:%s,vt:%s"%(x_var.numpy(),lrt,mt.numpy(),vt.numpy()))
return x_var
# print("lrt:",lrt)
exe_x(tf.constant(3.),tf.constant(-94.))