共计 1919 个字符,预计需要花费 5 分钟才能阅读完成。
数学基础:理解梯度下降的核心
梯度下降 (Gradient Descent) 的本质是通过迭代寻找函数最小值的过程。假设我们的目标是最小化损失函数 $J(\theta)$,其中 $\theta$ 是模型参数。核心思想是:沿着当前点梯度(导数)的反方向更新参数,因为梯度方向是函数值增长最快的方向。

参数更新公式推导如下:
- 泰勒展开一阶近似:$J(\theta_{t+1}) \approx J(\theta_t) + \nabla J(\theta_t)^T(\theta_{t+1}-\theta_t)$
- 为保证 $J(\theta_{t+1}) < J(\theta_t)$,令 $\theta_{t+1} = \theta_t – \eta \nabla J(\theta_t)$
- 其中 $\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()
性能优化关键策略
- 学习率选择
- 常用初始值:0.001-0.1
- 学习率衰减:指数衰减、余弦退火等
-
自适应方法:Adagrad/RMSprop
-
特征缩放(Feature Scaling)
- 标准化:$x’ = \frac{x – \mu}{\sigma}$
-
归一化:$x’ = \frac{x – x_{min}}{x_{max} – x_{min}}$
-
早停法(Early Stopping)
- 验证集误差连续 N 次不下降时终止训练
常见问题解决方案
- 梯度消失 / 爆炸
- 使用 Batch Normalization
- 梯度裁剪(Gradient Clipping)
-
合适的权重初始化(如 Xavier)
-
鞍点问题
- 引入动量(Momentum)
- 使用二阶优化方法(如 L -BFGS)
- 随机扰动参数
思考题延伸
- Adam 优化器结合了动量法和 RMSprop,如何调整其超参数 $\beta_1$,$\beta_2$?
- 分布式环境下如何聚合各 worker 计算的梯度?同步更新和异步更新哪种更好?
实践建议
在实际项目中,建议先使用小批量梯度下降作为基线,然后逐步尝试:
– 添加学习率调度器
– 引入动量项(0.9 是常用值)
– 监控梯度幅值变化
– 可视化损失曲线
梯度下降是优化算法的基石,理解其原理对掌握更复杂的深度学习模型至关重要。
正文完
发表至: 未分类
近一天内
