5.1 梯度下降与凸优化
梯度下降是最基本的无约束优化方法,在深度学习、因子模型训练和组合优化中被广泛使用。凸性保证了梯度下降能找到全局最优解。
一、无约束优化
1.1 梯度下降法
对于一个可微函数 ,梯度 指出了函数在 处增长最快的方向。因此,负梯度方向就是下降最快的方向:
其中 是学习率(步长)。
核心思想很简单:从当前点出发,沿着最陡的下坡方向迈出一步,重复直到收敛。
1.2 算法流程
- 初始化 和学习率
- 对于 直到收敛:
- 计算梯度
- 更新位置
- 如果 ,停止
1.3 凸函数 vs 非凸函数
| 性质 | 凸函数 | 非凸函数 |
|---|---|---|
| 二阶条件 | Hessian 矩阵半正定 () | Hessian 不定或负定 |
| 局部极小值 | 即全局最小值 | 可能有多个局部极小值 |
| 梯度下降收敛性 | 保证收敛到全局最优 | 可能卡在局部最优 |
| 举例 | , | , |
凸函数定义:,对 。
从几何上看:凸函数的图像上任意两点连成的线段,始终位于函数图像的上方。
二、手算实例
2.1 问题
用梯度下降求 的最小值。
解析解:, 确认是极小值。
2.2 梯度下降迭代(学习率 )
从 开始,梯度为 :
| 迭代 | 步长 | |||
|---|---|---|---|---|
| 0 | 0.000 | 2.000 | 0.200 | -0.200 |
| 1 | -0.200 | 1.600 | 0.160 | -0.360 |
| 2 | -0.360 | 1.280 | 0.128 | -0.488 |
| 3 | -0.488 | 1.024 | 0.102 | -0.590 |
经过 3 次迭代, 从 0 移动到 ,距离精确解 还有一段距离。梯度下降线性收敛——每步误差以固定比例缩小,不会一步到位。
相比之下,牛顿法利用二阶信息可以一步收敛到精确解(见 5.3 节)。
三、Python 实现
python
import numpy as np
import matplotlib.pyplot as plt
def gradient_descent(f_prime, x0, alpha=0.1, n_iter=10):
"""简单的梯度下降实现"""
x = x0
history = [x]
for i in range(n_iter):
x = x - alpha * f_prime(x)
history.append(x)
return x, history
def f_prime(x):
return 2 * x + 2 # f(x) = x^2 + 2x + 1 的导数
x_opt, history = gradient_descent(f_prime, x0=0.0, alpha=0.1, n_iter=10)
print(f"最优解: x = {x_opt:.6f}")
print(f"迭代路径: {[f'{h:.4f}' for h in history]}")
# 输出:
# 最优解: x = -0.8926
# 迭代路径: ['0.0000', '-0.2000', '-0.3600', '-0.4880', ...]10 次迭代后 ,仍在缓慢逼近 。这说明梯度下降虽然可靠,但收敛速度较慢——特别是在接近最优值时。
四、学习率的选择
学习率 是梯度下降最重要的超参数:
| 行为 | 效果 | |
|---|---|---|
| 太小(如 0.01) | 收敛极慢 | 需要大量迭代 |
| 适中(如 0.1) | 稳定下降 | 合理收敛 |
| 太大(如 1.0) | 可能震荡 | 不收敛甚至发散 |
实践中常用自适应学习率方法(如 Adam、RMSProp),让学习率随迭代自动调整。
Quant Link:在 Markowitz 模型中,组合方差 是凸函数(协方差矩阵 半正定),因此均值-方差优化是凸优化问题,梯度下降保证能找到全局最优权重。实际中常用更高效的专用求解器(如 cvxpy、scipy.optimize),但梯度下降的思想贯穿整个量化金融——从因子模型的 OLS 求解到深度学习选股模型的训练。