现在位置: 首页 > AI 数学基础 > 正文

导数入门 -- 瞬时变化率与切线

导数 = 函数在某一点的瞬时变化率 = 该点切线的斜率。

理解导数,就理解了梯度下降为什么往反方向走。


从平均变化率到瞬时变化率

平均变化率(割线斜率)→ Δx 越来越小 → 割线变切线 → 导数 = 切线斜率

导数符号揭示了函数行为

f'(x) > 0

函数在此处上升

切线向右上方

f'(x) < 0

函数在此处下降

切线向右下方

f'(x) = 0

水平——可能是极值

切线水平

梯度下降的直觉就藏在导数符号里:

f'(x) > 0 → 函数在上升 → 往反方向走。f'(x) < 0 → 函数在下降 → 继续往这个方向走。

这就是「负梯度方向」的根源。


生活例子

车速表 = 位置函数的导数

全程 120 公里开了 2 小时 → 平均速度 60 km/h。

但仪表盘上的瞬时速度一直在变。这个「此刻的速度」就是距离函数对时间的导数。


数学定义

\[ f'(x) = \lim_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x} \]

如果这个极限存在,f 在 x 处可导。


Python 动手实践

实例

import numpy as np

def numerical_derivative(f, x, h=1e-5):
    return (f(x + h) - f(x - h)) / (2 * h)

f = lambda x: x**2

# f'(2) = 2*2 = 4
print(f"f'(2) 数值={numerical_derivative(f, 2):.6f}, 理论=4")

# 各点的导数
for x in [-2, -1, 0, 1, 2]:
    d = numerical_derivative(f, x)
    dir = "下降" if d < 0 else ("上升" if d > 0 else "水平")
    print(f"x={x:2d}, f'(x)={d:5.1f}, {dir}")
f'(2) 数值=4.000000, 理论=4
x=-2, f'(x)= -4.0, 下降
x=-1, f'(x)= -2.0, 下降
x= 0, f'(x)=  0.0, 水平
x= 1, f'(x)=  2.0, 上升
x= 2, f'(x)=  4.0, 上升

AI 中的应用场景

梯度下降的一维原型

对于单变量函数,梯度下降退化为 \( x_{new} = x_{old} - \eta \cdot f'(x_{old}) \)。导数告诉你「往哪边走函数值会减小」——导数正就向左走,导数负就向右走。

激活函数的导数决定反向传播效率

ReLU 的导数:x>0 时为 1,x≤0 时为 0。计算极快,且正半区梯度不衰减——这是 ReLU 比 Sigmoid 更适合深层网络的关键原因。Sigmoid 的导数最大只有 0.25,多层相乘后梯度指数级衰减(梯度消失)。

损失函数在最优解处的导数为零

当模型收敛到局部最优时,损失函数关于所有参数的偏导都接近 0——梯度下降自然停止。这是训练收敛的信号:梯度范数 ||\nabla J|| \approx 0。