一、基本概念
1. 求导(Derivative)
- 定义:函数在某点的瞬时变化率。即自变量变化时,函数值变化的速度。
- 记号:如果 ( y = f(x) ),则导数记为 ( \frac{dy}{dx} ) 或 ( f’(x) )。
几何意义:
函数曲线在某点的切线斜率。
2. 求偏导(Partial Derivative)
- 定义:多元函数对某一个自变量的导数,其他变量视为常数。
- 记号:如果 ( z = f(x, y) ),则对 ( x ) 的偏导记为 ( \frac{\partial z}{\partial x} )。
几何意义:
在多维空间中,沿着某一个变量方向的变化率。
二、公式与运算规则
1. 常见函数的导数
| 函数 | 导数 |
|---|---|
| ( f(x) = x^n ) | ( f’(x) = n x^{n-1} ) |
| ( f(x) = \sin x ) | ( f’(x) = \cos x ) |
| ( f(x) = \cos x ) | ( f’(x) = -\sin x ) |
| ( f(x) = e^x ) | ( f’(x) = e^x ) |
| ( f(x) = \ln x ) | ( f’(x) = \frac{1}{x} ) |
2. 求导的基本法则
- 加法法则:( (f(x) + g(x))’ = f’(x) + g’(x) )
- 乘法法则:( (f(x)g(x))’ = f’(x)g(x) + f(x)g’(x) )
- 链式法则:( (f(g(x)))’ = f’(g(x)) \cdot g’(x) )
- 商法则:( \left(\frac{f(x)}{g(x)}\right)’ = \frac{f’(x)g(x) - f(x)g’(x)}{[g(x)]^2} )
3. 偏导运算规则
- 对某个变量求偏导时,其他变量视为常数。
- 链式法则同样适用于偏导。
三、举例详解
1. 单变量求导
例1:
( f(x) = x^3 + 2x )
( f’(x) = 3x^2 + 2 )
例2:
( f(x) = \sin(x^2) )
链式法则:
( f’(x) = \cos(x^2) \cdot 2x )
2. 多变量偏导
例1:
( f(x, y) = x^2y + y^3 )
对 ( x ) 求偏导:
( \frac{\partial f}{\partial x} = 2xy )
对 ( y ) 求偏导:
( \frac{\partial f}{\partial y} = x^2 + 3y^2 )
例2:
( f(x, y, z) = xyz )
对 ( x ) 求偏导:
( \frac{\partial f}{\partial x} = yz )
四、机器学习中的应用
1. 梯度下降法
- 用导数/偏导数计算损失函数对参数的变化率(梯度),更新参数使损失最小化。
2. 反向传播(Backpropagation)
- 神经网络训练时,利用链式法则对每层参数求偏导,计算梯度,进行参数更新。
3. 自动微分(Autograd)
- 现代深度学习框架(如PyTorch、TensorFlow)自动计算复杂函数的导数/偏导数。
五、代码实现
1. SymPy符号求导(Python)
import sympy as sp
# 单变量求导
x = sp.symbols('x')
f = x**3 + 2*x
df_dx = sp.diff(f, x)
print("f'(x):", df_dx)
# 多变量偏导
y = sp.symbols('y')
g = x**2 * y + y**3
dg_dx = sp.diff(g, x)
dg_dy = sp.diff(g, y)
print("∂g/∂x:", dg_dx)
print("∂g/∂y:", dg_dy)
2. 自动微分(PyTorch)
import torch
x = torch.tensor(2.0, requires_grad=True)
y = torch.tensor(3.0, requires_grad=True)
f = x**2 * y + y**3
f.backward()
print("∂f/∂x:", x.grad.item())
print("∂f/∂y:", y.grad.item())
六、几何与物理意义
- 导数:切线斜率,瞬时速度。
- 偏导数:多维空间中,沿某一方向的变化速率。
七、常见问题与技巧
- 链式法则:复合函数求导必用。
- 偏导和全导:多变量函数如果变量间有依赖,要用全微分。
- 高阶导数:可以连续对同一变量求导,得到二阶、三阶导等。
八、机器学习中的典型案例
1. 损失函数求梯度
假设线性回归损失函数:
[
L(w) = \frac{1}{2}(y - wx)^2
]
对 ( w ) 求导:
[
\frac{dL}{dw} = -(y - wx)x
]
2. 神经网络反向传播
每一层的梯度都用链式法则递归求导,从输出层回传到输入层。
总结
- 求导是单变量函数的变化率,偏导是多变量函数对某一变量的变化率。
- 链式法则是复合函数和神经网络反向传播的核心。
- 机器学习几乎所有优化算法都依赖导数/偏导数。
- Python有丰富的自动求导工具(如SymPy、Autograd、PyTorch等)。
九. 链式法则详细推导与应用
单变量链式法则
如果 ( y = f(u) ), ( u = g(x) ),则
[
\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}
]
例子:
( y = \sin(x^2) )
设 ( u = x^2 ), ( y = \sin(u) )
则
[
\frac{dy}{dx} = \cos(x^2) \cdot 2x
]
多变量链式法则(神经网络常用)
如果 ( z = f(x, y) ), ( x = g(t), y = h(t) ),则
[
\frac{dz}{dt} = \frac{\partial f}{\partial x} \cdot \frac{dx}{dt} + \frac{\partial f}{\partial y} \cdot \frac{dy}{dt}
]
例子:
( z = x^2y ), ( x = t^2, y = \sin t )
[
\frac{dz}{dt} = 2xy \cdot \frac{dx}{dt} + x^2 \cdot \frac{dy}{dt}
]
[
\frac{dx}{dt} = 2t, \quad \frac{dy}{dt} = \cos t
]
十. 高阶偏导与全微分
高阶偏导
对同一变量连续求偏导,得到二阶、三阶偏导。
例子:
( f(x, y) = x^2y + y^3 )
二阶偏导:
[
\frac{\partial^2 f}{\partial x^2} = \frac{\partial}{\partial x}(2xy) = 2y
]
[
\frac{\partial^2 f}{\partial y^2} = \frac{\partial}{\partial y}(x^2 + 3y^2) = 6y
]
混合偏导:
[
\frac{\partial^2 f}{\partial x \partial y} = \frac{\partial}{\partial x}(x^2 + 3y^2) = 2x
]
全微分
如果 ( f(x, y) ) 是多变量函数,
[
df = \frac{\partial f}{\partial x} dx + \frac{\partial f}{\partial y} dy
]
在变量间有依赖时,需用全微分。
十一. 机器学习中复杂梯度的推导
神经网络反向传播链式法则
假设神经元输出 ( a = \sigma(wx + b) ),损失函数 ( L = (a - y)^2 )
对 ( w ) 求导:
[
\frac{dL}{dw} = 2(a - y) \cdot \frac{da}{dw}
]
[
\frac{da}{dw} = \sigma’(wx + b) \cdot x
]
所以
[
\frac{dL}{dw} = 2(a - y) \cdot \sigma’(wx + b) \cdot x
]
更复杂的网络(多层链式法则)
每一层的梯度都依赖上一层的输出,对每层参数应用链式法则递归求导。
十二. 自动微分原理与工程实现
自动微分(Autograd)
自动微分通过记录运算过程的“计算图”,在反向传播时自动应用链式法则,实现高效、准确的梯度计算。
- 前向传播:计算输出并记录操作。
- 反向传播:从输出反向递归求导,自动应用链式法则。
PyTorch自动微分示例
import torch
x = torch.tensor(1.0, requires_grad=True)
y = torch.tensor(2.0, requires_grad=True)
z = x * y + torch.sin(x)
z.backward()
print("dz/dx:", x.grad.item())
print("dz/dy:", y.grad.item())
十三. 常见问题解析与实战技巧
1. 偏导与梯度的关系
- 多变量函数的所有偏导数组成梯度向量:
[
\nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots \right)
]
2. 雅可比矩阵与海森矩阵
- 雅可比矩阵:多元向量函数的一阶偏导矩阵。
- 海森矩阵:标量函数的二阶偏导矩阵,常用于优化算法(如牛顿法)。
示例:计算海森矩阵
import sympy as sp
x, y = sp.symbols('x y')
f = x**2 * y + y**3
H = sp.hessian(f, (x, y))
print("海森矩阵:\n", H)
3. 实战技巧
- 链式法则是梯度计算的核心,尤其在深度网络反向传播中。
- 自动微分框架优先选用,避免手动推导出错。
- 数值稳定性:如除以很小的数时加上微小常数(如 ( 1e-7 ))。
十四. 复杂案例:Softmax与交叉熵的梯度
假设 softmax 输出 ( p_i = \frac{e^{z_i}}{\sum_j e^{z_j}} ),交叉熵损失 ( L = -\sum_i y_i \log p_i )
对 ( z_k ) 求导:
[
\frac{\partial L}{\partial z_k} = p_k - y_k
]
这是深度学习分类问题中最常见的梯度公式之一。
十五. 总结
- 链式法则是复杂函数求导的核心,尤其在神经网络和机器学习优化中。
- 偏导、梯度、雅可比、海森矩阵是多变量分析的基础工具。
- 自动微分极大简化了工程实现,推荐优先使用。
- 掌握这些理论和技巧,能让你在机器学习和深度学习模型设计、调优中游刃有余。
十六、其他扩展
1. 梯度、雅可比、海森矩阵详解
1.1 梯度(Gradient)
- 定义:多元函数对所有变量的偏导数组成的向量。
- 公式:
[
\nabla f(x_1, x_2, …, x_n) = \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, …, \frac{\partial f}{\partial x_n} \right]^T
] - 意义:在点处,梯度指向函数增长最快的方向,模长表示增长速度。
应用:梯度下降法、优化算法的核心。
1.2 雅可比矩阵(Jacobian)
- 定义:向量值函数对所有自变量的偏导组成的矩阵。
- 公式:
[
J = \begin{bmatrix}
\frac{\partial f_1}{\partial x_1} & \cdots & \frac{\partial f_1}{\partial x_n} \
\vdots & \ddots & \vdots \
\frac{\partial f_m}{\partial x_1} & \cdots & \frac{\partial f_m}{\partial x_n}
\end{bmatrix}
]
适用于 ( \mathbf{f}: \mathbb{R}^n \to \mathbb{R}^m )
应用:深度学习中的反向传播、变分自编码器、物理仿真等。
1.3 海森矩阵(Hessian)
- 定义:标量函数的二阶偏导数组成的对称矩阵。
- 公式:
[
H = \begin{bmatrix}
\frac{\partial^2 f}{\partial x_1^2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \
\vdots & \ddots & \vdots \
\frac{\partial^2 f}{\partial x_n \partial x_1} & \cdots & \frac{\partial^2 f}{\partial x_n^2}
\end{bmatrix}
] - 意义:描述函数在某点的曲率,常用于二阶优化(如牛顿法)。
2. 多变量链式法则在深度学习中的应用
神经网络的反向传播本质就是多变量链式法则的应用。
假设网络第 ( l ) 层输出为 ( a^{(l)} ),参数为 ( w^{(l)} ),损失函数为 ( L ):
[
\frac{\partial L}{\partial w^{(l)}} = \frac{\partial L}{\partial a^{(L)}} \cdot \frac{\partial a^{(L)}}{\partial a^{(L-1)}} \cdots \frac{\partial a^{(l+1)}}{\partial a^{(l)}} \cdot \frac{\partial a^{(l)}}{\partial w^{(l)}}
]
每一项都是矩阵或向量的偏导,自动微分框架会自动构建这些链条。
3. 自动微分底层原理简述
自动微分(Autograd)分为两种方式:
- 前向模式(Forward Mode):适合输入变量多、输出少的情况。
- 反向模式(Reverse Mode):适合输出变量少、输入多(深度学习常用)。
原理:
- 构建计算图,每个节点记录操作和输入。
- 反向遍历图,递归应用链式法则,自动计算所有梯度。
优势:
- 高效、准确,无需手动推导复杂梯度。
- 支持高阶导数。
4. 常见机器学习模型梯度推导实例
4.1 线性回归损失函数梯度
[
L(w) = \frac{1}{2} | Xw - y |^2
]
对 ( w ) 求导:
[
\frac{\partial L}{\partial w} = X^T(Xw - y)
]
4.2 Logistic回归损失函数梯度
[
L(w) = -\sum_{i=1}^n [y_i \log(p_i) + (1 - y_i) \log(1 - p_i)]
]
其中 ( p_i = \sigma(X_i w) ), (\sigma(z) = \frac{1}{1 + e^{-z}})
对 ( w ) 求偏导:
[
\frac{\partial L}{\partial w} = X^T(p - y)
]
4.3 神经网络Softmax+交叉熵梯度
如前述,损失对每个logits的梯度为 ( p_k - y_k )。
5. 实战代码与数值计算注意事项
5.1 梯度与海森矩阵自动计算(SymPy)
import sympy as sp
x1, x2 = sp.symbols('x1 x2')
f = x1**2 * x2 + sp.sin(x2)
grad = [sp.diff(f, var) for var in (x1, x2)]
hess = sp.hessian(f, (x1, x2))
print("梯度:", grad)
print("海森矩阵:\n", hess)
5.2 自动微分高阶导数(PyTorch)
import torch
x = torch.tensor(2.0, requires_grad=True)
y = x**3
y.backward(create_graph=True) # 保留计算图
print("一阶导:", x.grad.item())
# 二阶导
x.grad.zero_()
y = x**3
y.backward(create_graph=True)
grad1 = x.grad
grad1.backward()
print("二阶导:", x.grad.item())
5.3 数值稳定性技巧
- 避免除零:如 softmax/log 运算时加上微小常数。
- 梯度裁剪:防止梯度爆炸,常见于RNN训练。
- 归一化处理:如 BatchNorm、LayerNorm。
总结
- 梯度、雅可比、海森矩阵是多变量函数分析和机器学习优化的核心工具。
- 多变量链式法则是深度学习反向传播的理论基础。
- 自动微分极大简化了复杂模型的梯度计算。
- 工程实践中要注意数值稳定性、效率和高阶导数的需求。
创作不易,点赞关注,互通有无!

求导计算&spm=1001.2101.3001.5002&articleId=152906203&d=1&t=3&u=b8e6a2453f6d49988e36f7a3958d4e39)
148

被折叠的 条评论
为什么被折叠?



