共计 1287 个字符,预计需要花费 4 分钟才能阅读完成。
背景介绍
梯度下降是神经网络训练中最核心的优化算法之一。在反向传播算法中,梯度下降负责根据损失函数的梯度来调整网络参数,使模型逐步逼近最优解。理解梯度下降不仅对掌握深度学习至关重要,也是许多机器学习算法的基础。

数学原理
梯度概念
梯度本质上是多变量函数的偏导数向量。对于神经网络中的损失函数 L(w),梯度∇L(w)表示在各个参数方向上的变化率。
链式法则
反向传播的核心是链式法则,它使我们能够高效地计算复合函数的导数:
∂L/∂w = ∂L/∂y * ∂y/∂h * ∂h/∂w
更新公式
参数更新遵循:
w_new = w_old - η * ∇L(w_old)
其中 η 是学习率,控制每次更新的步长。
代码实现
import numpy as np
# 定义简单的二次损失函数
def loss(w):
return w**2 + 2*w + 1
# 损失函数的梯度
def gradient(w):
return 2*w + 2
# 梯度下降实现
def gradient_descent(initial_w, learning_rate, epochs):
w = initial_w
history = []
for i in range(epochs):
grad = gradient(w)
w = w - learning_rate * grad
history.append((w, loss(w)))
if i % 10 == 0:
print(f'Epoch {i}: w={w:.4f}, loss={loss(w):.4f}')
return w, history
# 运行示例
final_w, history = gradient_descent(
initial_w=5.0,
learning_rate=0.1,
epochs=50
)
关键参数分析
学习率选择
- 学习率过大:可能导致震荡甚至发散
- 学习率过小:收敛速度慢,可能陷入局部最优
实际建议
- 初始学习率通常设置在 0.001 到 0.1 之间
- 使用学习率衰减策略
- 考虑自适应优化器(如 Adam)
常见问题
梯度消失 / 爆炸
梯度消失:深层网络中梯度逐层减小,导致底层参数几乎不更新
解决方案:
– 使用 ReLU 等激活函数
– 批归一化(BatchNorm)
– 残差连接
局部最优
现象:陷入非全局最优解
对策:
– 增加随机性(如 Dropout)
– 使用动量(Momentum)
实践建议
- 始终监控损失函数和梯度的变化
- 对输入数据进行标准化
- 尝试不同的初始化方法
- 使用验证集早期停止
- 记录完整的训练日志
可视化示例
import matplotlib.pyplot as plt
# 绘制优化轨迹
ws = np.linspace(-6, 6, 100)
plt.plot(ws, loss(ws), label='Loss Function')
plt.scatter(*zip(*history), c='r', label='Optimization Path')
plt.xlabel('Parameter w')
plt.ylabel('Loss')
plt.legend()
plt.show()
思考题
- 如何证明梯度下降在凸函数上一定能找到全局最优解?
- 学习率衰减策略有哪些常见实现方式?
- 动量 (Momentum) 是如何帮助加速收敛的?
- 二阶优化方法 (如牛顿法) 相比梯度下降有哪些优缺点?
正文完
