1.4 多元微积分
把一元函数的知识推广到多个变量。你有了一个变量随另一个变量怎么变的概念,现在来看一个值随多个变量同时变化的情况。
一、看得见的例子:从一元到二元
1.1 一元函数回顾
一元函数 很简单——输入一个数 ,输出一个数 。 比如 ,输入 ,得 。画出来就是一条曲线。
1.2 二元函数:输入两个数
二元函数 :输入两个数 ,输出一个数。 比如 ,输入 ,输出 。
这个函数在输入空间中对所有点都定义了。你想想看如果把它画出来:在 平面上每个点处,垂直方向的高度就是 。它在三维空间中形成一个曲面—— 实际上就是一个碗状曲面。
也就是说, 的图像是二维平面上的一条抛物线(弯曲线),而 的图像是三维空间中的一个碗(抛物面)。
1.3 看几个具体值
拿 随便代几个数进去,感受一下:
| 代进去怎么算 | ||
|---|---|---|
| 1 | ||
| 4 | ||
| 4 | ||
| 2 | ||
| 5 |
注意 和 的结果都是 , 和 都是 ——这说明这个函数是对称的。
二、偏导数:一次只看一个变量
2.1 直觉
对于 ,我们自然想知道:如果只改变 ,函数值怎么变?只改变 呢?
这就是偏导数的意思——保持其他变量不动,只对一个变量求导。
符号:
- 读作"偏 f 偏 x",意思是: 固定,只看 的变化
- 同理
2.2 动手算
:
对 求偏导( 当常数):
把 看作一个常数(就像 、 一样),对 求导:
对 求偏导( 当常数):
就这么简单。对比之前学的导数 ,偏导完全一样——只是多了一个"把其他变量当常数"的步骤。
2.3 再算一个例子
:
对 求偏导: 和 都是常数
对 求偏导: 是常数
代入具体点验证:在 处
含义:在 这个点, 每增加一点点,函数值增加约 倍的变化量; 每增加一点点,函数值增加约 倍。
Quant Link:期权价格 是多元函数——标的价格、波动率、利率、剩余时间。期权希腊值本质上就是偏导数:
- Delta :标的价格每涨 1 块,期权涨多少
- Vega :波动率每升 1%,期权涨多少
- Rho :利率每升 1%,期权涨多少
- Theta :过一天,期权跌多少 这就是 "其他变量固定,只看一个变量变化的影响" 在量化里的直接应用。
2.4 二元偏导的几何意义
还记得 是个碗吗?
在某点 :
- 告诉你:如果你沿着 方向走,碗面是向上还是向下倾斜
- 告诉你:如果你沿着 方向走,碗面是怎么倾斜的
在碗底 ,两个偏导都是 ——因为碗底是平的。
三、梯度:所有偏导放在一起
3.1 定义
一个函数的全部偏导数放在一个向量里,就叫梯度:
注意 读作 "nabla"。
3.2 算是算
:
在 处:
这个向量的含义就两个东西:
- 方向: 指的方向,是函数上升最快的方向
- 大小:,是上升的"速度"
反之,负梯度 就是下降最快的方向。
3.3 梯度下降的核心直觉
如果你站在碗面上想走到最低点( 的碗底),你会怎么做?
每次都沿着当前最陡的下降方向迈一步——这就是梯度下降。
是学习率,决定你迈的步子有多大。
这也是一元函数里牛顿法的升级版——当你有很多变量(比如神经网络里几百万个参数)时,不可能把所有二阶偏导都算了,梯度下降就是唯一可行的方案。
Quant Link:梯度下降是所有机器学习模型训练的基石。线性回归、逻辑回归、神经网络,训练过程就是:
- 预测 → 2. 算损失 → 3. 算梯度 → 4. 沿着梯度反方向更新参数 → 重复 你在量化里写的任何模型,只要是"学习"出来的,背后就是梯度下降或它的变体(Adam、SGD 等)。
四、方向导数:沿着任意方向的变化
4.1 不只是沿坐标轴
梯度告诉你"最陡的方向",但你可能想知道沿任意方向 (单位向量)的变化率。
方向导数的公式简单得惊人:
就是梯度和方向向量的点积。
4.2 算一个看看
还拿 在 处,。
如果沿着方向 (即沿 轴方向)走,方向导数为:
嗯,这不就是 吗?确实,沿 轴的方向导数就是偏导本身。
如果沿着 (45 度方向)走:
看,比沿 轴变化更快了。
点积最大化:当 和梯度同方向时,方向导数最大(增长最快);反向时最小(下降最快);垂直时为零(沿等高线移动,值不变)。
五、高阶偏导与海森矩阵
5.1 二阶偏导
就像一元函数可以求二阶导一样,多元函数也可以。只是现在有四种组合:
对 :
| 符号 | 含义 | 读法 |
|---|---|---|
| 先对 求偏导,再对 求 | "偏 x 两次" | |
| 先对 求偏导,再对 求 | "偏 y 两次" | |
| 先对 求偏导,再对 求 | "偏 x 偏 y" | |
| 先对 求偏导,再对 求 | "偏 y 偏 x" |
5.2 手算
先算一阶偏导:
再算二阶:
注意 ——混合偏导在大多数情况下与求导顺序无关(克莱罗定理)。
5.3 海森矩阵
把四个二阶偏导排成一个 矩阵:
对于上面的 :
5.4 海森矩阵有什么用?
回忆一元函数: 意味着函数是凸的(局部最小值), 意味着是凹的(局部最大值)。
对多元函数,海森矩阵就相当于二阶导的推广。判定规则:
- 所有特征值 > 0(特征值 = 衡量矩阵在各方向"拉伸"程度的数值,详见 2.4 特征值分解)→ 函数在该点是凸的(局部最小值)
- 所有特征值 < 0 → 函数在该点是凹的(局部最大值)
- 特征值有正有负 → 鞍点(一个方向凸、另一个方向凹,像马鞍的形状)
六、拉格朗日乘子法
6.1 问题
假设你想最大化一个矩形面积 ,但有一个限制:(周长固定)。
这是一个带约束的优化问题。你可以直接代入 变成一元问题,但很多时候代入不了。
6.2 解决方案
构造拉格朗日函数:
这里 是约束条件。
所以:
6.3 求解
对三个变量分别求偏导,令为零:
由前两式得 ,代入第三式得 。最大面积 。
Quant Link:Markowitz 组合优化就是拉格朗日乘子的直接应用: 目标:最小化组合方差 约束:(权重之和为 1) 拉格朗日函数: 求导得最优权重的解析解:
七、Python 验证
import sympy as sp
import numpy as np
# === 偏导数符号计算 ===
x, y = sp.Symbol('x'), sp.Symbol('y')
f = x**2 * y + 3*y**2
print("=== 偏导数 ===")
print(f"f(x, y) = {f}")
print(f"∂f/∂x = {sp.diff(f, x)}") # 2xy
print(f"∂f/∂y = {sp.diff(f, y)}") # x² + 6y
# 在具体点求值
fx = sp.lambdify((x, y), sp.diff(f, x))
fy = sp.lambdify((x, y), sp.diff(f, y))
print(f"在 (2, 3) 处: ∂f/∂x = {fx(2, 3)}, ∂f/∂y = {fy(2, 3)}")
# === 海森矩阵 ===
f2 = x**2 * y**3
H = sp.hessian(f2, (x, y))
print(f"\n=== 海森矩阵 ===")
print(f"f(x,y) = {f2}")
print(f"H = {H}")
# 代入 x=1, y=1
H_num = np.array([[float(H[0,0].subs({x:1, y:1})),
float(H[0,1].subs({x:1, y:1}))],
[float(H[1,0].subs({x:1, y:1})),
float(H[1,1].subs({x:1, y:1}))]])
eigvals = np.linalg.eigvals(H_num)
print(f"在 (1,1) 处的特征值: {eigvals}")
if np.all(eigvals > 0):
print("→ 正定,局部最小值")
elif np.all(eigvals < 0):
print("→ 负定,局部最大值")
else:
print("→ 鞍点")
# === 梯度下降 ===
def gradient_descent(grad, x0, lr=0.1, n_iter=20):
x = np.array(x0, dtype=float)
print(f"\n=== 梯度下降 ===")
print(f"从 {x0} 开始, lr={lr}")
for i in range(n_iter):
g = grad(x)
x = x - lr * g
if i % 5 == 0 or i == n_iter - 1:
print(f" 第{i+1:2d}步: x={x}, |∇f|={np.linalg.norm(g):.4f}")
return x
# 找 f(x,y) = x² + y² 的最小值(已知在 (0,0))
grad_f = lambda v: np.array([2*v[0], 2*v[1]])
opt = gradient_descent(grad_f, [5.0, 3.0])
print(f"\n理论最小值在 (0, 0),梯度下降找到 ({opt[0]:.6f}, {opt[1]:.6f})")
# === 拉格朗日乘子 ===
lam = sp.Symbol('lambda')
f_obj = x * y
g_con = x + y - 10
L = f_obj - lam * g_con
eqs = [sp.diff(L, var) for var in (x, y, lam)]
sol = sp.solve(eqs, (x, y, lam))
print(f"\n=== 拉格朗日乘子 ===")
print(f"最大化 xy,约束 x+y=10")
print(f"最优解: x={sol[x]}, y={sol[y]}, λ={sol[lam]}")
print(f"最大面积: {sol[x] * sol[y]}")小结
| 概念 | 要点 |
|---|---|
| 偏导数 | 固定其他变量,只对一个变量求导 |
| 梯度 | 所有偏导组成的向量,指向最陡上升方向 |
| 方向导数 | 沿任意方向的变化率 = 梯度 · 方向向量 |
| 海森矩阵 | 所有二阶偏导组成的矩阵,判定极值类型 |
| 拉格朗日乘子 | 带约束的优化——引入 变成无约束问题 |
| Quant 应用 | 希腊值(偏导)、梯度下降(训练)、Markowitz(拉格朗日) |