Skip to content

5.1 梯度下降与凸优化

梯度下降是最基本的无约束优化方法,在深度学习、因子模型训练和组合优化中被广泛使用。凸性保证了梯度下降能找到全局最优解。


一、无约束优化

1.1 梯度下降法

对于一个可微函数 f:RnRf: \mathbb{R}^n \to \mathbb{R},梯度 f(x)\nabla f(\mathbf{x}) 指出了函数在 x\mathbf{x}增长最快的方向。因此,负梯度方向就是下降最快的方向:

x(k+1)=x(k)αf(x(k))\mathbf{x}^{(k+1)} = \mathbf{x}^{(k)} - \alpha \nabla f(\mathbf{x}^{(k)})

其中 α>0\alpha > 0学习率(步长)。

核心思想很简单:从当前点出发,沿着最陡的下坡方向迈出一步,重复直到收敛。

1.2 算法流程

  1. 初始化 x(0)\mathbf{x}^{(0)} 和学习率 α\alpha
  2. 对于 k=0,1,2,k = 0, 1, 2, \dots 直到收敛:
    • 计算梯度 f(x(k))\nabla f(\mathbf{x}^{(k)})
    • 更新位置 x(k+1)=x(k)αf(x(k))\mathbf{x}^{(k+1)} = \mathbf{x}^{(k)} - \alpha \nabla f(\mathbf{x}^{(k)})
    • 如果 f(x(k))<ϵ\|\nabla f(\mathbf{x}^{(k)})\| < \epsilon,停止

1.3 凸函数 vs 非凸函数

性质凸函数非凸函数
二阶条件Hessian 矩阵半正定 (2f(x)0\nabla^2 f(\mathbf{x}) \succeq 0)Hessian 不定或负定
局部极小值即全局最小值可能有多个局部极小值
梯度下降收敛性保证收敛到全局最优可能卡在局部最优
举例f(x)=x2f(x) = x^2, f(x,y)=x2+y2f(x, y) = x^2 + y^2f(x)=x33xf(x) = x^3 - 3x, f(x)=sin(x)f(x) = \sin(x)

凸函数定义f(θx+(1θ)y)θf(x)+(1θ)f(y)f(\theta\mathbf{x} + (1-\theta)\mathbf{y}) \le \theta f(\mathbf{x}) + (1-\theta) f(\mathbf{y}),对 θ[0,1]\forall \theta \in [0,1]

从几何上看:凸函数的图像上任意两点连成的线段,始终位于函数图像的上方。


二、手算实例

2.1 问题

用梯度下降求 f(x)=x2+2x+1f(x) = x^2 + 2x + 1 的最小值。

解析解f(x)=2x+2=0    x=1f'(x) = 2x + 2 = 0 \implies x^* = -1f(x)=2>0f''(x) = 2 > 0 确认是极小值。

2.2 梯度下降迭代(学习率 α=0.1\alpha = 0.1

x(0)=0x^{(0)} = 0 开始,梯度为 f(x)=2x+2f'(x) = 2x + 2

迭代 kkx(k)x^{(k)}f(x(k))f'(x^{(k)})步长 αf\alpha f'x(k+1)x^{(k+1)}
00.0002.0000.200-0.200
1-0.2001.6000.160-0.360
2-0.3601.2800.128-0.488
3-0.4881.0240.102-0.590

经过 3 次迭代,xx 从 0 移动到 0.590-0.590,距离精确解 x=1x^* = -1 还有一段距离。梯度下降线性收敛——每步误差以固定比例缩小,不会一步到位。

相比之下,牛顿法利用二阶信息可以一步收敛到精确解(见 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 次迭代后 x0.893x \approx -0.893,仍在缓慢逼近 1-1。这说明梯度下降虽然可靠,但收敛速度较慢——特别是在接近最优值时。


四、学习率的选择

学习率 α\alpha 是梯度下降最重要的超参数:

α\alpha行为效果
太小(如 0.01)收敛极慢需要大量迭代
适中(如 0.1)稳定下降合理收敛
太大(如 1.0)可能震荡不收敛甚至发散

实践中常用自适应学习率方法(如 Adam、RMSProp),让学习率随迭代自动调整。


Quant Link:在 Markowitz 模型中,组合方差 σp2=wΣw\sigma_p^2 = \mathbf{w}^\top \Sigma \mathbf{w}凸函数(协方差矩阵 Σ\Sigma 半正定),因此均值-方差优化是凸优化问题,梯度下降保证能找到全局最优权重。实际中常用更高效的专用求解器(如 cvxpy、scipy.optimize),但梯度下降的思想贯穿整个量化金融——从因子模型的 OLS 求解到深度学习选股模型的训练。

Built with VitePress