梯度下降原理详解:从数学基础到Python实现

1次阅读
没有评论

共计 1919 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

数学基础:理解梯度下降的核心

梯度下降 (Gradient Descent) 的本质是通过迭代寻找函数最小值的过程。假设我们的目标是最小化损失函数 $J(\theta)$,其中 $\theta$ 是模型参数。核心思想是:沿着当前点梯度(导数)的反方向更新参数,因为梯度方向是函数值增长最快的方向。

梯度下降原理详解:从数学基础到 Python 实现

参数更新公式推导如下:

  1. 泰勒展开一阶近似:$J(\theta_{t+1}) \approx J(\theta_t) + \nabla J(\theta_t)^T(\theta_{t+1}-\theta_t)$
  2. 为保证 $J(\theta_{t+1}) < J(\theta_t)$,令 $\theta_{t+1} = \theta_t – \eta \nabla J(\theta_t)$
  3. 其中 $\eta$ 是学习率(learning rate),控制每次更新的步长

三种梯度下降变体对比

  • 批量梯度下降(Batch GD)
  • 每次使用全量数据计算梯度
  • 优点:稳定收敛到全局最优(凸函数情况下)
  • 缺点:计算开销大,内存要求高

  • 随机梯度下降(Stochastic GD)

  • 每次随机选择一个样本计算梯度
  • 优点:计算快,适合在线学习
  • 缺点:收敛不稳定,可能震荡

  • 小批量梯度下降(Mini-batch GD)

  • 折中方案,每次使用 32-256 个样本
  • 兼具计算效率和收敛稳定性
  • 深度学习中的默认选择

Python 实现详解

import numpy as np
import matplotlib.pyplot as plt

class GradientDescent:
    def __init__(self, learning_rate=0.01, decay=0.1):
        self.lr = learning_rate
        self.decay = decay  # 学习率衰减系数

    def compute_gradient(self, X, y, theta):
        """计算梯度"""
        m = len(y)
        return (1/m) * X.T @ (X @ theta - y)

    def update_learning_rate(self, epoch):
        """指数衰减学习率"""
        return self.lr * (1. / (1. + self.decay * epoch))

    def fit(self, X, y, max_epochs=1000, tol=1e-4):
        """训练过程"""
        theta = np.zeros(X.shape[1])
        losses = []

        for epoch in range(max_epochs):
            grad = self.compute_gradient(X, y, theta)
            theta -= self.update_learning_rate(epoch) * grad

            loss = np.mean((X @ theta - y)**2)
            losses.append(loss)

            if len(losses) > 1 and abs(losses[-1] - losses[-2]) < tol:
                break

        return theta, losses

可视化代码示例:

def plot_learning_curve(losses):
    plt.figure(figsize=(10,6))
    plt.plot(losses, linewidth=2)
    plt.title("Loss Curve", fontsize=16)
    plt.xlabel("Epochs", fontsize=14)
    plt.ylabel("MSE", fontsize=14)
    plt.grid(True)
    plt.show()

性能优化关键策略

  1. 学习率选择
  2. 常用初始值:0.001-0.1
  3. 学习率衰减:指数衰减、余弦退火等
  4. 自适应方法:Adagrad/RMSprop

  5. 特征缩放(Feature Scaling)

  6. 标准化:$x’ = \frac{x – \mu}{\sigma}$
  7. 归一化:$x’ = \frac{x – x_{min}}{x_{max} – x_{min}}$

  8. 早停法(Early Stopping)

  9. 验证集误差连续 N 次不下降时终止训练

常见问题解决方案

  • 梯度消失 / 爆炸
  • 使用 Batch Normalization
  • 梯度裁剪(Gradient Clipping)
  • 合适的权重初始化(如 Xavier)

  • 鞍点问题

  • 引入动量(Momentum)
  • 使用二阶优化方法(如 L -BFGS)
  • 随机扰动参数

思考题延伸

  1. Adam 优化器结合了动量法和 RMSprop,如何调整其超参数 $\beta_1$,$\beta_2$?
  2. 分布式环境下如何聚合各 worker 计算的梯度?同步更新和异步更新哪种更好?

实践建议

在实际项目中,建议先使用小批量梯度下降作为基线,然后逐步尝试:
– 添加学习率调度器
– 引入动量项(0.9 是常用值)
– 监控梯度幅值变化
– 可视化损失曲线

梯度下降是优化算法的基石,理解其原理对掌握更复杂的深度学习模型至关重要。

正文完
 0
评论(没有评论)