机器学习-求解与优化

【算法】一篇入门之-AdaDelta算法

作者 : 老饼 发表日期 : 2022-06-09 15:35:07 更新日期 : 2025-06-12 04:45:39
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com



AdaDelta算法是2012年提出的一种优化算法,它是是RMProp算法的一种改进

AdaDelta算法在RMProp算法的基础上去掉了学习率,使得算法完全不需要设置学习率,更加"自适应"化

本文介绍AdaDelta算法的计算公式,并通过一个具体的代码实例,展示AdaDelta算法的实现流程





      01.AdaDelta算法介绍      




本节介绍AdaDelta算法的原理与计算公式




    AdaDelta算法是什么     


AdaDelta算法是2012年提出的一种优化算法,它是是RMProp算法的一种改进
AdaDelta算法在RMProp算法的基础上去掉了学习率,使得算法完全不需要设置学习率,更加"自适应"化
 记待优化的第i个参数为,AdaDelta算法的更新公式如下:
             
                        
                                 
                                             
其中,
:参数的梯度                          
  :衰减系数,取值范围为[0,1]       
             :初始值为0,它实际就是的累计平方和
                        :初始值为0,它实际就是参数变化量的累计平方和 
                :一个极小的常数,它的作用避免分母为0 
可以看到,AdaDelta与RMProp类似,只是它用来替代了RMProp算法中的学习率
AdaDelta通过引入,解决了AdaGrad、RMProp依赖学习率的问题,使得算法的学习率更加"自适应"化








    02. AdaDelta算法-代码实现    




本节展示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 




图标 评论
添加评论