导数入门 -- 瞬时变化率与切线
导数 = 函数在某一点的瞬时变化率 = 该点切线的斜率。
理解导数,就理解了梯度下降为什么往反方向走。
从平均变化率到瞬时变化率
平均变化率(割线斜率)→ Δ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}")
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。
