Adam优化算法

参考连接:https://www.bilibili.com/video/BV1bD4y197EE?from=search&seid=2812665294799649680

一、常用的优化方法

  • Momentum方法:通过添加栋梁,提高收敛速度。
  • Nestrov方法:在进行当前更新前,先进行预演一次,从而找到一个更加适合当前情况的梯度方向和幅度。
  • Adagrad方法:让不同的参数拥有不同的学习率,并且通过引入梯度的平方和作为衰减想,而在训练过程中自动降低的学习率。
  • AdaDelta方法:对Adagrad进行改进,让模型在训练后期也能够有较为适合的学习率。

二、Adam算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

案例代码

# ADAM
# 以y=x1+2*x2   为例
# y=np.cdot(x,theta)
import math
import numpy as np
def adam():
    # 训练集,每个样本有三个分量
    x=np.array([(1,1),(1,2),(2,2),(3,1),(1,3),(2,4),(2,3),(3,3)]) # (x1,x2) 
    y=np.array([3,5,6,5,7,10,8,9])                                # 预测值
    
    # 初始化
    m,dim =x.shape  # 返回数组的维数 (8,2)
    theta=np.zeros(dim) # parameter  [0,0]
    alpha=0.01       # 学习率 0.001?收敛性不好后修改的
    momentum=0.1     # 动量
    threshold=0.0001 # 停止迭代的错误阈值
    iterations=3000  # 迭代次数
    error=0          # 初始误差为0
    
    b1=0.9   # 算法作者建议的默认值
    b2=0.999 # 算法作者建议的默认值
    e=0.00000001  # 10E-8,以避免除以零
    mt=np.zeros(dim) 
    vt=np.zeros(dim)
    
    for i in range(iterations):
        j=i % m
        error=-1/(2*m)*np.dot((np.dot(x,theta)-y).T,(np.dot(x,theta)-y)) # 均方误差
        if abs (error)<=threshold: # 误差小于设定的阈值,跳出循环,停止迭代
            break
        gradient=x[j]*(np.dot(x[j],theta)-y[j])
        mt=b1*mt+(1-b1)*gradient       # update biasied first momant estimate
        vt=b2*vt+(1-b2)*(gradient**2) # update biasied second momant estimate
        mtt=mt/(1-(b1**(i+1)))         # bias-corrected first moment estimate
        vtt=vt/(1-(b2**(i+1)))         # bias-corrected second moment estimate
        
        vtt_sqrt=np.array([math.sqrt(vtt[0]),math.sqrt(vtt[1])]) # 因为只能对标量进行开放
        theta=theta-alpha*mtt/(vtt_sqrt+e) # theta 的更新方式
        
        print('迭代次数:%d' %(i+1),'theta:',theta,'error:%f' % error)
        
if __name__=='__main__':
    adam()

### 关于Adam优化算法 #### Adam优化算法简介 Adam是一种用于随机优化的方法,在机器学习特别是深度学习领域广泛应用。该方法结合了AdaGrad能够有效处理稀疏梯度的优点以及RMSProp应对在线问题的能力[^1]。 #### 工作原理 Adam通过计算梯度的一阶矩估计(均值)和二阶矩估计(未中心化的方差),来动态调整每个参数的学习率。具体来说,对于时间步$t$处的参数更新规则如下: - 计算一阶矩估计$m_t$ - 计算二阶矩估计$v_t$ 其中,$\beta_1,\ \beta_2\in[0,1)$分别是控制指数衰减率的超参数,默认设置通常为$(\beta_1=0.9,\ \beta_2=0.999)$;而$\epsilon>0$是为了防止除零错误的小常数项,一般取值为$1e^{-8}$。最终参数更新表达式可以写作: ```python m_t = beta1 * m_{t-1} + (1 - beta1) * g_t v_t = beta2 * v_{t-1} + (1 - beta2) * (g_t ** 2) # 偏置校正 m_hat = m_t / (1 - beta1**t) v_hat = v_t / (1 - beta2**t) theta_t = theta_{t-1} - alpha * m_hat / (sqrt(v_hat) + epsilon) ``` 这里`alpha`代表基础学习速率,`g_t`表示当前时刻的目标函数相对于模型参数的梯度向量。 #### 应用场景 由于其良好的收敛性能和较低内存消耗特性,使得Adam非常适合应用于大规模数据集上的神经网络训练过程之中。此外,它也适用于非稳态目标环境下的最优化求解任务。 #### 解读与理解 建立可解释的基础线性或逻辑回归作为对比基准有助于加深对更复杂模型的理解并指导特征工程方向的选择。因此,在实际应用中先尝试简单的基线模型再逐步过渡到像Adam这样的高级技术不失为一种明智的做法[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值