优化算法篇(三)——AdaGrad(自适应梯度算法)、RMSProp

AdaGrad

这前面两篇不同的是,AdaGrad优化算法的学习率明面上是不断变换,且每个维度的学习率都尽相同。

具体算法过程上图所示。可以发现它是通过累加平方梯度的方式,来改变学习率。这使得在平缓的地方,由于梯度值小,对应学习的下降幅度就会小;对于陡峭的地方,由于梯度值大。对应的学习率就会相对大幅下降,使得更加平缓,从而加快训练速度。

缺点:AdaGrad会记录之前的所有梯度之和,这使得这个结果会越来越大,从而使得后面学习率会无限接近0,从而使得权值无法得到更新。为了改善这点,下面会介绍RMSProp方法。

python实现

import numpy as np
import random
#1、AdaGrad
def AdaGrad(x,y,alpha,theta,maxiterations,n,sigma = 1e-6):
    r = 0
    for i in range(maxiterations): 
        index_list = random.sample(range(0,10),n) # 随机选择m个样本的索引
        x_selsct = x[[index_list]]
        m = y.size  # 样本数量
        h = x.dot(theta)  #预测值  (10,1)
        loss = h - y
        loss = loss[index_list]  #随机选择5个样本的损失值替代整体损失值 (n,1)
        gradient = np.dot(x_selsct.transpose(),loss) / n  #(3,)
        r += gradient*gradient
        theta -= (alpha/(r**0.5+sigma))*gradient
        if loss.sum() == 0:
            print("迭代结束,收敛总共迭代了{}次".format(i+1))
            break
    return theta
def predict(x,theta):
    h = x.dot(theta)
    return h
#(10, 3)
trainData = np.array([[1.1,1.5,1],[1.3,1.9,1],[1.5,2.3,1],[1.7,2.7,1],[1.9,3.1,1],[2.1,3.5,1],[2.3,3.9,1],[2.5,4.3,1],[2.7,4.7,1],[2.9,5.1,1]])
trainLabel = np.array([2.5,3.2,3.9,4.6,5.3,6,6.7,7.4,8.1,8.8])
alpha = 0.4
maxIteration = 10000
_,n = trainData.shape
theta = np.ones(n)
theta = AdaGrad(trainData, trainLabel ,alpha,theta,maxIteration,5)
#迭代结束,收敛总共迭代了1888次
#array([ 0.95221273,  1.27389363, -0.45827446])
predict(trainData,theta)
#array([2.5, 3.2, 3.9, 4.6, 5.3, 6. , 6.7, 7.4, 8.1, 8.8])

原始的RMSProp

鉴于AdaGrad会累积历史梯度,造成后续的学习率很小,权值无法得到有效更新。所以原始的RMSProp增加了一个衰减系数来控制历史信息获取多少。

python实现

import numpy as np
import random
#1、RMSProp
def RMSProp(x,y,alpha,theta,maxiterations,n,sigma = 1e-6,mu = 0.9):
    r = 0
    for i in range(maxiterations): 
        index_list = random.sample(range(0,10),n) # 随机选择m个样本的索引
        x_selsct = x[[index_list]]
        m = y.size  # 样本数量
        h = x.dot(theta)  #预测值  (10,1)
        loss = h - y
        loss = loss[index_list]  #随机选择5个样本的损失值替代整体损失值 (n,1)
        gradient = np.dot(x_selsct.transpose(),loss) / n  #(3,)
        r = mu*r + (1-mu)*gradient*gradient
        theta -= (alpha/((r+sigma)**0.5))*gradient
        if loss.sum() == 0:
            print("迭代结束,收敛总共迭代了{}次".format(i+1))
            break
    return theta
def predict(x,theta):
    h = x.dot(theta)
    return h
#(10, 3)
trainData = np.array([[1.1,1.5,1],[1.3,1.9,1],[1.5,2.3,1],[1.7,2.7,1],[1.9,3.1,1],[2.1,3.5,1],[2.3,3.9,1],[2.5,4.3,1],[2.7,4.7,1],[2.9,5.1,1]])
trainLabel = np.array([2.5,3.2,3.9,4.6,5.3,6,6.7,7.4,8.1,8.8])
alpha = 0.01
maxIteration = 5000
_,n = trainData.shape
theta = np.ones(n)
theta = RMSProp(trainData, trainLabel ,alpha,theta,maxIteration,5)
#array([ 0.9305065 ,  1.28002522, -0.45210931])
predict(trainData,theta)
#array([2.49148567, 3.18959706, 3.88770845, 4.58581983, 5.28393122,
#       5.98204261, 6.680154  , 7.37826538, 8.07637677, 8.77448816])
### 改进的自适应梯度算法概述 改进的自适应梯度算法旨在解决传统自适应梯度算法中的某些局限性,特别是在处理稀疏特征长期训练时的表现。通过引入额外机制来动态调整学习率或其他超参数,这些改进版本可以在不同场景下提供更优性能[^1]。 ### 常见的改进型自适应梯度算法及其特点 #### Adam (Adaptive Moment Estimation) Adam 结合了 AdaGrad RMSProp 的优点,在每次迭代中不仅考虑了一阶梯度平方的历史累积值,还加入了动量项以加速收敛并减少震荡。具体而言: - 利用指数加权平均数估计一阶矩(均值)二阶矩(方差) - 对偏差进行了修正,使得初期更新更为稳定 - 动态调整每个参数的学习速率,提高了泛化能力 ```python import numpy as np class AdamOptimizer: def __init__(self, params, lr=0.001, beta1=0.9, beta2=0.999, eps=1e-8): self.params = params self.lr = lr self.beta1 = beta1 self.beta2 = beta2 self.eps = eps self.m = [np.zeros_like(p) for p in params] self.v = [np.zeros_like(p) for p in params] self.t = 0 def step(self, grads): self.t += 1 for i, grad in enumerate(grads): self.m[i] = self.beta1 * self.m[i] + (1 - self.beta1) * grad self.v[i] = self.beta2 * self.v[i] + (1 - self.beta2) * (grad ** 2) m_hat = self.m[i] / (1 - self.beta1 ** self.t) v_hat = self.v[i] / (1 - self.beta2 ** self.t) self.params[i] -= self.lr * m_hat / (np.sqrt(v_hat) + self.eps) ``` #### Adadelta 作为另一种改进方案,Adadelta 不再依赖固定的学习率设置,而是基于窗口内的历史梯度变化情况自动计算当前步长。这种方法减少了对初始学习率敏感性的担忧,并且能够在一定程度上防止过早饱现象的发生。 ```python def adadelta_update(params, square_grad_avg, delta_x_avg, rho=0.95, epsilon=1e-6): for param, avg_sq_grad, avg_delta_x in zip(params, square_grad_avg, delta_x_avg): # Compute the running average of squared gradients avg_sq_grad *= rho avg_sq_grad += (1-rho)*param.grad.data.pow(2).item() # Compute update with rescaled gradient std = avg_delta_x.add(epsilon).sqrt().mul_(avg_sq_grad.add(epsilon).rsqrt()) param.data.sub_(std.mul(param.grad.data)) # Update the running average of parameter updates avg_delta_x *= rho avg_delta_x += (1-rho)*(param.grad.data*std).pow(2).item() square_grad_avgs = [torch.zeros_like(p) for p in model.parameters()] delta_x_avgs = [torch.zeros_like(p) for p in model.parameters()] for epoch in range(num_epochs): ... adadelta_update(model.parameters(), square_grad_avgs, delta_x_avgs) ``` ### 应用领域与发展前景 随着研究不断深入技术进步,更多新型高效的自适应优化算法被提出应用于实际问题求解当中。例如,在自然语言处理、计算机视觉等领域取得了显著成效的同时也促进了理论层面的发展完善[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值