当前位置:首页 » 《随便一记》 » 正文

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

17 人参与  2024年11月06日 10:40  分类 : 《随便一记》  评论

点击全文阅读


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

引言

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

Adam优化算法的背景

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

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

Adam的基本原理

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

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

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

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

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

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

一阶矩的更新公式:
[ 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。

二阶矩的更新公式:
[ 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算法的优点

自适应学习率: Adam根据每个参数的历史梯度调整学习率,使得稀疏更新的参数具有更大的学习率,而频繁更新的参数则适当降低学习率,从而加快收敛。

较好的性能: 在许多任务中,包括图像识别、自然语言处理等,Adam都显示出了优越的性能,速度快且收敛效果好。

适用性广: Adam可以与各种类型的深度学习模型配合使用,并且对超参数的选择较为鲁棒。

Adam的超参数

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

学习率 ( α ) ( \alpha ) (α): 一般取值在 ( 1 0 − 3 ) ( 10^{-3} ) (10−3) 到 ( 1 0 − 5 ) ( 10^{-5} ) (10−5) 之间,具体值需要根据任务进行调节。

一阶矩衰减率 ( β 1 ) ( \beta_1 ) (β1​): 常用值为 0.9。

二阶矩衰减率 ( β 2 ) ( \beta_2 ) (β2​): 常用值为 0.999。

( \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. 定义模型和损失函数

我们定义一个线性模型:

def linear_model(X, w):    return X.dot(w)def mse_loss(y_true, y_pred):    return np.mean((y_true - y_pred) ** 2)

3. Adam优化算法实现

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

def adam_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 in range(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 pltplt.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优化算法,为今后的学习和研究打下坚实的基础。


点击全文阅读


本文链接:http://m.zhangshiyu.com/post/183108.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1