当前位置: 首页 > article >正文

【漫话机器学习系列】063.梯度下降(Gradient Descent)

梯度下降(Gradient Descent)

1. 什么是梯度下降?

梯度下降(Gradient Descent)是一种优化算法,用于通过迭代更新模型参数,最小化目标函数(通常是损失函数)。它是机器学习和深度学习中最常用的优化方法之一。


2. 梯度下降的目标

目标是找到模型参数(如权重 w 和偏置 b),使得损失函数 J(w, b) 达到最小值。这意味着找到目标函数的最优解(通常是最小值)。

数学定义

假设我们有一个目标函数 J(w),梯度下降的更新公式为:

w_{t+1} = w_t - \alpha \cdot \nabla J(w_t)

  • w_t:当前参数值。
  • α:学习率(Learning Rate),控制步长大小。
  • \nabla J(w_t):损失函数 J(w) 对 w 的梯度。

3. 梯度的意义

梯度是目标函数的一阶导数,表示函数在某一点处变化的方向和速率。

  • 梯度的方向:函数增长最快的方向。
  • 负梯度方向:函数下降最快的方向。

4. 梯度下降的类型

根据计算梯度的方式不同,梯度下降有以下几种类型:

  1. 批量梯度下降(Batch Gradient Descent, BGD)

    • 每次迭代计算所有训练数据的梯度。
    • 优点:收敛稳定,方向准确。
    • 缺点:计算成本高,特别是在大数据集上。
  2. 随机梯度下降(Stochastic Gradient Descent, SGD)

    • 每次迭代仅使用一个样本计算梯度。
    • 优点:速度快,适合大规模数据。
    • 缺点:收敛不稳定,可能震荡。
  3. 小批量梯度下降(Mini-batch Gradient Descent)

    • 每次迭代使用一小批数据计算梯度(通常是 32 或 64 个样本)。
    • 优点:计算效率高,收敛相对稳定。
    • 缺点:需要选择合适的批量大小。

5. 梯度下降的工作原理
  1. 初始化参数:随机初始化模型参数(如权重和偏置)。
  2. 计算损失:使用当前参数计算损失函数 J(w,b)。
  3. 计算梯度:计算损失函数对参数的偏导数。
  4. 更新参数:使用梯度下降公式更新参数。
  5. 重复迭代:直到达到停止条件(如损失函数收敛或达到最大迭代次数)。

6. 梯度下降的学习率

学习率 α\alphaα 是梯度下降的关键超参数,决定每次参数更新的步长大小。

  • 学习率太大:可能跳过最优解,甚至导致发散。
  • 学习率太小:收敛速度慢,训练时间长。

解决方法

  • 使用自适应学习率优化算法(如 Adam、RMSprop)。
  • 手动调整学习率或使用学习率调度。

7. 常见问题
  1. 局部最小值问题

    • 非凸函数可能存在多个局部最小值,梯度下降可能陷入局部最优。
    • 在深度学习中,损失函数通常是高维非凸的,但局部最小值问题不太严重,因为随机初始化和动量项可以帮助逃离局部最优。
  2. 鞍点问题

    • 在鞍点(梯度为零的点),梯度下降可能停滞不前。
  3. 梯度消失和梯度爆炸

    • 深层网络中,梯度可能逐层缩小或增大,导致模型训练失败。
    • 解决方法包括使用归一化技术(如 Batch Normalization)、自适应优化算法(如 Adam)或改进激活函数(如 ReLU)。

8. 优化梯度下降的算法
  1. 动量法(Momentum)

    • 在梯度下降中加入动量项,加速收敛并减小震荡。
  2. 自适应梯度(Adagrad)

    • 为每个参数设计不同的学习率。
  3. RMSprop

    • 对 Adagrad 进行改进,通过指数衰减移动平均值调整学习率。
  4. Adam

    • 结合动量法和 RMSprop,既考虑梯度的平均值,又考虑梯度的方差。

9. 梯度下降的应用

梯度下降被广泛应用于以下领域:

  • 线性回归和逻辑回归:用于参数估计。
  • 神经网络训练:优化权重和偏置。
  • 支持向量机(SVM):用于最大间隔分类器的参数优化。
  • 深度学习:广泛用于 CNN、RNN、Transformer 等模型的训练。

10. 示例代码

以下是一个梯度下降优化线性回归模型的示例代码:

import numpy as np

# 模拟数据
np.random.seed(0)
X = np.random.rand(100, 1)  # 特征
y = 3 * X.squeeze() + 2 + np.random.randn(100) * 0.1  # 目标值

# 梯度下降实现
def gradient_descent(X, y, lr=0.1, epochs=100):
    m, n = X.shape
    theta = np.zeros(n + 1)  # 初始化参数
    X = np.c_[np.ones(m), X]  # 添加偏置项
    for epoch in range(epochs):
        gradients = -2/m * X.T @ (y - X @ theta)
        theta -= lr * gradients
        loss = np.mean((y - X @ theta) ** 2)
        if epoch % 10 == 0:
            print(f"Epoch {epoch}, Loss: {loss:.4f}")
    return theta

# 训练模型
theta = gradient_descent(X, y, lr=0.1, epochs=100)
print("最终参数:", theta)

运行结果

Epoch 0, Loss: 7.1997
Epoch 10, Loss: 0.1870
Epoch 20, Loss: 0.1273
Epoch 30, Loss: 0.0995
Epoch 40, Loss: 0.0783
Epoch 50, Loss: 0.0621
Epoch 60, Loss: 0.0498
Epoch 70, Loss: 0.0403
Epoch 80, Loss: 0.0331
Epoch 90, Loss: 0.0276
最终参数: [2.22800035 2.58762454]


11. 总结

梯度下降是机器学习和深度学习中的基础优化方法,尽管简单,但却非常强大。通过调整学习率和结合先进优化算法(如 Adam),梯度下降可以高效解决许多复杂的模型优化问题。理解其原理和实现是深入学习机器学习的关键步骤。

 


http://www.kler.cn/a/521416.html

相关文章:

  • 【STM32】-TTP223B触摸开关
  • 荔枝派LicheePi Zero V3S芯片图形系统开发详解[持续更新]
  • Nxopen 直齿轮参数化设计
  • FloDB 设计与思考
  • 12、本地缓存分布式缓存(未完待续)
  • Android的签名
  • uvm timeout的哪些事
  • 2025.1.26机器学习笔记:C-RNN-GAN文献阅读
  • 有趣的网站
  • VUE3 使用路由守卫函数实现类型服务器端中间件效果
  • ListOJ14:环形链表II(寻找环的入口点)
  • Spring Security(maven项目) 3.0.2.6版本—下
  • DeepSeek学术题目选择效果怎么样?
  • AWS Serverless Application Repository
  • Anaconda使用教程 如何conda配置多版本Python环境
  • 【力扣:新动计划,编程入门 —— 题解 ③】
  • 【Oracle】修改表字段顺序 保留原数据
  • Jenkins安装部署(以及常见报错解决方案),jdk版本控制器sdkman
  • 2025/1/22 [抓包] Fiddler
  • redis的分片集群模式