0


AI学习指南深度学习篇-Adam的基本原理

AI学习指南深度学习篇-Adam的基本原理

引言

深度学习是人工智能领域中一个重要的研究方向,而优化算法在深度学习中起着至关重要的作用。本文将重点介绍一种流行的优化算法——Adam(Adaptive Moment Estimation),其结合了动量和自适应学习率的优势,成为了深度学习训练过程中常用的优化算法之一。通过对Adam的深入分析,读者可以更好地理解其原理和应用。

Adam优化算法的背景

在优化过程中,梯度下降法(Gradient Descent)是最常见的优化算法。虽然梯度下降法简单且有效,但在面对大规模数据和复杂模型时,其缺陷逐渐显露。例如,传统的梯度下降法使用固定的学习率进行更新,可能导致收敛速度慢或不收敛。而动量法(Momentum)通过预估过去的梯度来为当前更新提供动量,从而改善了收敛速度,但仍然依赖于一个固定的学习率。

Adam算法的提出正是为了解决这类问题,它以自适应方式调整学习率,同时结合了动量的思想,从而提高了训练效率和收敛速度。

Adam的基本原理

Adam优化算法的基本思想是同时计算一阶矩(梯度的均值)和二阶矩(梯度的方差)。在此基础上,Adam使用这些信息来更新模型的参数。

1. 一阶矩和二阶矩的计算

在训练过程中,Adam会为每个参数维持两个状态变量:

  • 一阶矩(动量): 表示梯度的指数加权移动平均。
  • 二阶矩: 表示梯度平方的指数加权移动平均。

这两个状态变量的更新公式如下:

设当前步数为 ( t ),学习率为 ( \alpha ),梯度为 ( g_t ):

  1. 一阶矩的更新公式: [ m t = β 1 m t − 1 + ( 1 − β 1 ) g t ] [ m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t ] [mt​=β1​mt−1​+(1−β1​)gt​] 其中,( m_t ) 是当前的动量,( \beta_1 ) 是一阶矩的衰减率,一般取值为 0.9。
  2. 二阶矩的更新公式: [ v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 ] [ v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 ] [vt​=β2​vt−1​+(1−β2​)gt2​] 其中, ( v t ) ( v_t ) (vt​)是当前的方差,是梯度平方的移动平均, ( β 2 ) ( \beta_2 ) (β2​) 的值通常取为 0.999。

2. 偏差修正

由于在算法的前期,一阶矩和二阶矩的初始化值都是0,因此会导致其值在前期偏离真实值。为了纠正这一偏差,Adam对这两个变量进行了修正:

  • 一阶矩的偏差修正: [ m t ^ = m t 1 − β 1 t ] [ \hat{m_t} = \frac{m_t}{1 - \beta_1^t} ] [mt​^​=1−β1t​mt​​]
  • 二阶矩的偏差修正: [ v t ^ = v t 1 − β 2 t ] [ \hat{v_t} = \frac{v_t}{1 - \beta_2^t} ] [vt​^​=1−β2t​vt​​]

3. 参数更新

通过上面的步骤计算得到修正的一阶矩和二阶矩后,参数的更新公式如下:

      [ 
     
     
     
       θ 
      
     
       t 
      
     
    
      = 
     
     
     
       θ 
      
      
      
        t 
       
      
        − 
       
      
        1 
       
      
     
    
      − 
     
     
      
      
        α 
       
       
        
        
          m 
         
        
          t 
         
        
       
         ^ 
        
       
      
      
       
        
         
         
           v 
          
         
           t 
          
         
        
          ^ 
         
        
       
      
        + 
       
      
        ϵ 
       
      
     
    
      ] 
     
    
   
     [ \theta_t = \theta_{t-1} - \frac{\alpha \hat{m_t}}{\sqrt{\hat{v_t}} + \epsilon} ] 
    
   
 [θt​=θt−1​−vt​^​​+ϵαmt​^​​]

其中,

     ( 
    
   
     θ 
    
   
     ) 
    
   
  
    ( \theta ) 
   
  
(θ) 是模型的参数, 
 
  
   
   
     ( 
    
   
     ϵ 
    
   
     ) 
    
   
  
    ( \epsilon ) 
   
  
(ϵ) 是一个小常数(如  
 
  
   
   
     ( 
    
   
     1 
    
    
    
      0 
     
     
     
       − 
      
     
       8 
      
     
    
   
     ) 
    
   
  
    ( 10^{-8} ) 
   
  
(10−8)),用以避免除以零的情况。

Adam算法的优点

  1. 自适应学习率: Adam根据每个参数的历史梯度调整学习率,使得稀疏更新的参数具有更大的学习率,而频繁更新的参数则适当降低学习率,从而加快收敛。
  2. 较好的性能: 在许多任务中,包括图像识别、自然语言处理等,Adam都显示出了优越的性能,速度快且收敛效果好。
  3. 适用性广: Adam可以与各种类型的深度学习模型配合使用,并且对超参数的选择较为鲁棒。

Adam的超参数

在使用Adam算法时,有几个重要的超参数需要注意:

  1. 学习率 ( α ) ( \alpha ) (α): 一般取值在 ( 1 0 − 3 ) ( 10^{-3} ) (10−3) 到 ( 1 0 − 5 ) ( 10^{-5} ) (10−5) 之间,具体值需要根据任务进行调节。
  2. 一阶矩衰减率 ( β 1 ) ( \beta_1 ) (β1​): 常用值为 0.9。
  3. 二阶矩衰减率 ( β 2 ) ( \beta_2 ) (β2​): 常用值为 0.999。
  4. ( \epsilon ): 用于避免除零错误,通常取值为 ( 10^{-8} )。

Adam算法示例

让我们通过一个简单的示例来演示Adam算法的应用。

假设我们有一个简单的线性回归模型,其损失函数为均方误差(MSE)。我们用Adam来优化这个模型的参数。

1. 数据准备

我们首先生成一些数据:

import numpy as np

# 生成数据
np.random.seed(42)
X = np.random.rand(100,1)*10# 100个样本,1个特征
y =2.5* X + np.random.randn(100,1)# y = 2.5*x + 噪声

2. 定义模型和损失函数

我们定义一个线性模型:

deflinear_model(X, w):return X.dot(w)defmse_loss(y_true, y_pred):return np.mean((y_true - y_pred)**2)

3. Adam优化算法实现

我们实现Adam优化算法的核心逻辑:

defadam_optimizer(X, y, learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-8, epochs=1000):
    m, n = X.shape
    w = np.zeros((n,1))# 初始化权重
    m_t = np.zeros((n,1))# 一阶矩
    v_t = np.zeros((n,1))# 二阶矩for t inrange(1, epochs +1):
        y_pred = linear_model(X, w)
        loss = mse_loss(y, y_pred)# 计算当前梯度
        grad =-2/m * X.T.dot(y - y_pred)# 更新一阶矩和二阶矩
        m_t = beta1 * m_t +(1- beta1)* grad
        v_t = beta2 * v_t +(1- beta2)*(grad **2)# 进行偏差修正
        m_t_hat = m_t /(1- beta1 ** t)
        v_t_hat = v_t /(1- beta2 ** t)# 更新参数
        w -= learning_rate * m_t_hat /(np.sqrt(v_t_hat)+ epsilon)# 每100次迭代输出一次损失if t %100==0:print(f"Epoch {t}, Loss: {loss:.4f}")return w

4. 训练模型

使用Adam优化器训练线性回归模型:

w_opt = adam_optimizer(X, y, epochs=1000)print(f"Optimized weights: {w_opt.flatten()}")

5. 可视化结果

为了观察训练的效果,我们可以可视化训练后的模型与真实数据的关系:

import matplotlib.pyplot as plt

plt.scatter(X, y, color="blue", label="Data")
plt.plot(X, linear_model(X, w_opt), color="red", label="Fitted line")
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.title("Linear Regression with Adam Optimizer")
plt.show()

Adam与其他优化算法的比较

1. Adam vs SGD(Stochastic Gradient Descent)

SGD是最基础的梯度下降算法,每次更新仅使用一个样本的梯度。尽管SGD可以收敛到较优的解,但其收敛速度慢且受学习率影响较大。相比之下,Adam不仅考虑了历史梯度的影响,还能自适应地调整学习率,从而在收敛速度上具有明显优势。

2. Adam vs RMSProp

RMSProp通过对梯度进行自适应学习率调整来提高收敛速度,而Adam是在RMSProp的基础上引入了一阶矩的概念,使得它能够更有效地利用先前的信息。因此,Adam在许多场景下表现更好。

3. Adam vs Momentum

Momentum优化算法通过引入过去的梯度来加速收敛,而Adam则将这一思想与自适应学习率相结合,以更智能地调整参数更新。虽然Momentum可以有效解决一些梯度下降中的震荡问题,但在参数更新的灵活性和适应性方面,Adam更具优势。

Adam的实际应用

Adam优化器已经成为许多深度学习框架(如TensorFlow和PyTorch)的默认优化器。其广泛应用于图像分类、目标检测、自然语言处理、强化学习等多种任务中。在许多情况下,Adam都能显著加快收敛速度,提高模型性能。

结论

在本文中,我们详细介绍了Adam优化算法的基本原理,包括如何通过一阶矩和二阶矩的计算,以及如何结合动量和自适应学习率来优化梯度下降。通过示例代码,我们演示了Adam在训练线性回归模型中的实际应用,以及与其他优化算法的比较。希望读者在对深度学习和机器学习的理解和实践中,能够更全面地掌握Adam优化算法,为今后的学习和研究打下坚实的基础。

标签: ai

本文转载自: https://blog.csdn.net/zhaopeng_yu/article/details/141440169
版权归原作者 俞兆鹏 所有, 如有侵权,请联系我们删除。

“AI学习指南深度学习篇-Adam的基本原理”的评论:

还没有评论