梯度下降(Gradient Descent)详解
梯度下降是机器学习中最核心的优化算法,用于通过迭代调整模型参数(如权重 ( w ) 和偏置 ( b )),最小化代价函数(如均方误差、交叉熵)。它的核心思想是:
“沿着代价函数梯度(导数)的反方向逐步更新参数,直到找到最小值。”
1. 核心概念
(1) 梯度(Gradient)
- 数学意义:多元函数的偏导数向量,指向函数值上升最快的方向。
- 例如,代价函数 ( J(w, b) ) 的梯度为 ( \nabla J = \left[ \frac{\partial J}{\partial w}, \frac{\partial J}{\partial b} \right] )。
- 优化意义:梯度的反方向(( -\nabla J ))是函数值下降最快的方向。
(2) 参数更新公式
2. 梯度下降的步骤
- 初始化参数:随机设定初始值 ( w ) 和 ( b )。
- 计算梯度:在当前参数下计算代价函数的梯度。
- 更新参数:沿梯度反方向调整参数。
- 重复迭代:直到梯度接近零(收敛)或达到最大迭代次数。
3. 梯度下降的类型
(1) 批量梯度下降(Batch Gradient Descent)
- 每次迭代使用全部训练数据计算梯度。
- 优点:稳定收敛到全局最优(凸函数时)。
- 缺点:计算慢,不适合大数据集。
(2) 随机梯度下降(Stochastic Gradient Descent, SGD)
- 每次迭代随机选一个样本计算梯度。
- 优点:速度快,适合在线学习。
- 缺点:波动大,可能无法收敛到最优解。
(3) 小批量梯度下降(Mini-Batch Gradient Descent)
- 折中方案:每次使用一小批(如32、64个)样本计算梯度。
- 深度学习标配:平衡效率与稳定性。
4. 关键问题与调参
(1) 学习率 ( \alpha )的选择
- 太大:可能跳过最优解(发散)。
- 太小:收敛速度慢。
- 自适应学习率:如Adam、Adagrad等优化算法动态调整 ( \alpha )。
(2) 局部最优 vs 全局最优
- 凸函数(如线性回归):梯度下降总能找到全局最优。
- 非凸函数(如神经网络):可能陷入局部最优,但实际中局部最优通常也能接受。
(3) 特征缩放
- 如果特征量纲差异大(如年龄 vs 收入),需先归一化/标准化,否则梯度下降会震荡。
5. 代码示例(Python实现线性回归)
import numpy as np
# 生成数据
X = np.array([1, 2, 3, 4]) # 特征
y = np.array([2, 4, 6, 8]) # 目标值 (y = 2x)
# 初始化参数
w = 0.0 # 权重
b = 0.0 # 偏置
alpha = 0.01 # 学习率
epochs = 100 # 迭代次数
# 梯度下降
for epoch in range(epochs):
# 计算预测值 y_pred = w * X + b
y_pred = w * X + b
# 计算梯度 (MSE的导数)
dw = (2/len(X)) * np.sum((y_pred - y) * X) # dJ/dw
db = (2/len(X)) * np.sum(y_pred - y) # dJ/db
# 更新参数
w = w - alpha * dw
b = b - alpha * db
# 打印损失
if epoch % 10 == 0:
loss = np.mean((y_pred - y)**2)
print(f"Epoch {epoch}, Loss: {loss:.4f}, w: {w:.4f}, b: {b:.4f}")
# 输出最终参数
print(f"Final w: {w}, b: {b}") # 应接近 w=2, b=0
6. 应用场景
- 线性回归:最小化均方误差(MSE)。
- 逻辑回归:最小化交叉熵损失。
- 神经网络:反向传播(Backpropagation)的核心依赖梯度下降。
7. 总结
关键点 | 说明 |
---|---|
目标 | 通过迭代优化参数,最小化代价函数。 |
核心公式 | ( w_{\text{new}} = w_{\text{old}} - \alpha \cdot \frac{\partial J}{\partial w} ) |
学习率 ( \alpha ) | 需谨慎选择,过大导致发散,过小导致收敛慢。 |
类型 | 批量(稳定但慢)、随机(快但波动)、小批量(平衡)。 |
注意事项 | 特征缩放、学习率调整、防止过拟合。 |