本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com
AdaDelta算法是2012年提出的一种优化算法,它是是RMProp算法的一种改进
AdaDelta算法在RMProp算法的基础上去掉了学习率,使得算法完全不需要设置学习率,更加"自适应"化
本文介绍AdaDelta算法的计算公式,并通过一个具体的代码实例,展示AdaDelta算法的实现流程
本节介绍AdaDelta算法的原理与计算公式
AdaDelta算法是什么
AdaDelta算法是2012年提出的一种优化算法,它是是RMProp算法的一种改进
AdaDelta算法在RMProp算法的基础上去掉了学习率,使得算法完全不需要设置学习率,更加"自适应"化
记待优化的第i个参数为,AdaDelta算法的更新公式如下:
其中,
:参数的梯度
:衰减系数,取值范围为[0,1]
:初始值为0,它实际就是的累计平方和
:初始值为0,它实际就是参数变化量的累计平方和
:一个极小的常数,它的作用避免分母为0
可以看到,AdaDelta与RMProp类似,只是它用来替代了RMProp算法中的学习率
AdaDelta通过引入,解决了AdaGrad、RMProp依赖学习率的问题,使得算法的学习率更加"自适应"化
本节展示AdaDelta算法的具体代码实现
AdaDelta算法-代码实现
下面使用AdaDelta算法来求函数的最小值
由于AdaDelta算法需要使用目标函数的梯度,所以需要先算出梯度,如下:
,
AdaDelta算法的具体实现代码如下:
"""
AdaDelta算法求y= (x1-2)^2+(x2-3)^2的最小解
"""
import numpy as np
x = np.array([0,0]) # 初始化x
rho = 0.9 # 设置衰减系数
s = np.array([0,0]) # 初始化梯度累计量
d = np.array([0,0]) # 初始化x调整累计量
esp = 0.000001 # 很小的常数
for i in range(1000): # 最大迭代1000次
g = np.array([2*x[0]-4, 2*x[1]-6]) # 计算x的梯度
s = rho*s + (1-rho)*g*g # 计算梯度累计量
dx = np.sqrt((d+esp)/(s+esp))*g # x的调整量
x = x - dx # 更新x
d = rho*d + (1-rho)*dx*dx # 更新x调整累计量
print("第",i+1,"轮迭代:x=[",x[0],",",x[1],"],y=",(x[0]-2)**2+(x[1]-3)**2) # 打印当前结果
if((max(abs(g))< 0.0001) ):break # 如果梯度过小,则退出迭代
运行结果如下:
![]()
可以看到,经过了844轮迭代,所得到解已经非常接近真实极小解[2,3]
好了,以上就是AdaDelta算法的简单介绍了~
End