本节介绍导数的核心概念。导数是微积分的基础,它衡量函数在某一点上变化的瞬时速率。
一、核心基础:导数 (Derivative)
导数是微积分的核心,它衡量函数变化的快慢。
1. 理论定义 (极限法)
函数 $f(x)$ 在点 $x$ 处的导数 $f'(x)$ 定义为:
$$f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}$$2. 直观理解
导数 $f'(x)$ 就是函数 $f(x)$ 在点 $(x, f(x))$ 处切线的斜率。
- 如果 $f'(x) > 0$,函数在该点处正在上升。
- 如果 $f'(x) < 0$,函数在该点处正在下降。
- 如果 $f'(x) = 0$,函数在该点处处于一个平坦的局部极值点(极大或极小)。
3. 数值近似 (直觉验证法)
我们可以通过取一个非常小的 $h$ (例如 $h=0.0001$) 来近似计算导数,以此建立直观感受:
$$f'(x) \approx \frac{f(x+h) - f(x)}{h}$$本节探讨两个在机器学习中至关重要的函数:指数函数 $e^x$ 和自然对数 $\ln(x)$。它们的导数形式非常简洁,是构建复杂模型的基础。
二、关键函数求导 (基于第一性原理)
这两个函数是构建更复杂模型(如逻辑回归、神经网络)的基石。
1. 指数函数 $f(x) = e^x$
- 导数结果: $\frac{d}{dx}(e^x) = e^x$
- 含义: $e^x$ 是一个极其特殊的函数,它在任意一点的斜率都恰好等于它在那一点的函数值。
A. 理论推导
- 代入定义: $f'(x) = \lim_{h \to 0} \frac{e^{x+h} - e^x}{h}$
- 指数法则: $f'(x) = \lim_{h \to 0} \frac{e^x \cdot e^h - e^x}{h}$
- 提取公因式: $f'(x) = \lim_{h \to 0} \frac{e^x(e^h - 1)}{h}$
- 分离常数: $f'(x) = e^x \cdot \left[ \lim_{h \to 0} \frac{e^h - 1}{h} \right]$
- 利用关键极限: $\lim_{h \to 0} \frac{e^h - 1}{h} = 1$ (这是 $e$ 本身的定义之一)
- 得出结论: $f'(x) = e^x \cdot 1 = e^x$
B. 直觉验证 (h=0.0001)
- 在 $x=0$ 处:
- 函数值:$e^0 = \mathbf{1}$
- 近似斜率:$\frac{e^{0.0001} - e^0}{0.0001} \approx \frac{1.000100005 - 1}{0.0001} \approx \mathbf{1.00005}$
- 在 $x=1$ 处:
- 函数值:$e^1 \approx \mathbf{2.71828}$
- 近似斜率:$\frac{e^{1.0001} - e^1}{0.0001} \approx \frac{2.71855 - 2.71828}{0.0001} \approx \mathbf{2.718}$
- 结论: 数值计算结果与理论 $f'(x) = f(x)$ 高度吻合。
2. 自然对数 $f(x) = \ln(x)$
- 导数结果: $\frac{d}{dx}(\ln(x)) = \frac{1}{x}$
- 含义: $\ln(x)$ 的斜率是 $x$ 的倒数。当 $x$ 很小时 (如 $x=0.1$),斜率很大 ($1/0.1=10$);当 $x$ 很大时 (如 $x=100$),斜率很小 ($1/100=0.01$)。
A. 理论推导
- 代入定义: $f'(x) = \lim_{h \to 0} \frac{\ln(x+h) - \ln(x)}{h}$
- 对数法则 (1): $\ln(a) - \ln(b) = \ln(a/b)$
$f'(x) = \lim_{h \to 0} \frac{1}{h} \ln\left(\frac{x+h}{x}\right) = \lim_{h \to 0} \frac{1}{h} \ln\left(1 + \frac{h}{x}\right)$ - 对数法则 (2): $c \ln(a) = \ln(a^c)$
$f'(x) = \lim_{h \to 0} \ln\left[ \left(1 + \frac{h}{x}\right)^{\frac{1}{h}} \right]$ - 变量替换: 令 $u = \frac{h}{x}$ (则 $h=ux$, $\frac{1}{h}=\frac{1}{ux}$)
$f'(x) = \lim_{u \to 0} \ln\left[ (1 + u)^{\frac{1}{ux}} \right] = \lim_{u \to 0} \ln\left[ \left( (1 + u)^{\frac{1}{u}} \right)^{\frac{1}{x}} \right]$ - 利用关键极限: $e = \lim_{u \to 0} (1+u)^{\frac{1}{u}}$ (这是 $e$ 的另一个定义)
$f'(x) = \ln\left[ e^{\frac{1}{x}} \right]$ - 得出结论: $f'(x) = \frac{1}{x}$
链式法则是计算“复合函数”导数的核心工具。它允许我们将复杂的求导过程分解为一系列简单的、可管理的步骤,是神经网络反向传播算法的数学基础。
三、核心工具:链式法则 (Chain Rule)
链式法则是计算复合函数导数的基础,它将复杂的求导过程分解为一系列简单的求导步骤。
定义
如果 $L$ 是 $a$ 的函数, $a$ 是 $z$ 的函数, $z$ 是 $w$ 的函数,即 $L(a(z(w)))$。
法则
损失 $L$ 对参数 $w$ 的导数等于所有中间导数的乘积:
$$\frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \cdot \frac{da}{dz} \cdot \frac{\partial z}{\partial w}$$在本节中,我们将综合运用前面的所有知识($e^x$, $\ln(x)$ 的导数, 链式法则)来推导两种核心的损失函数梯度:首先是用于二元分类的**二元交叉熵**,然后是用于多类别分类的**Softmax 多元交叉熵**。这是理解梯度下降如何工作的关键一步。
四、高级应用:二元交叉熵损失函数求导
这是逻辑回归(Logistic Regression)进行梯度下降的核心计算过程。
目标
计算损失函数 $L$ 对参数 $\mathbf{w}$ 和 $b$ 的梯度(偏导数)。
计算流程(正向传播)
- 线性组合 (Z): $z = \mathbf{w}^T \mathbf{x} + b$
- Sigmoid 激活 (A): $a = \sigma(z) = \frac{1}{1 + e^{-z}}$ ( $a$ 是模型的预测概率 $\hat{y}$)
- 损失函数 (L): $L(a, y) = -[y \ln(a) + (1-y) \ln(1-a)]$ ( $y$ 是真实标签 0 或 1)
求导过程(反向传播)
我们使用链式法则 $\frac{\partial L}{\partial w_i} = \frac{\partial L}{\partial a} \cdot \frac{da}{dz} \cdot \frac{\partial z}{\partial w_i}$
Step 1. 计算 $\frac{\partial L}{\partial a}$ (损失对预测的导数)
- $\frac{\partial L}{\partial a} = \frac{\partial}{\partial a} \left( -[y \ln(a) + (1-y) \ln(1-a)] \right)$
- 利用 $\frac{d}{dx}(\ln(x)) = \frac{1}{x}$:
- $\frac{\partial L}{\partial a} = - \left[ \frac{y}{a} + (1-y) \frac{1}{1-a} \cdot (-1) \right] = - \left[ \frac{y(1-a) - a(1-y)}{a(1-a)} \right]$
- 结果: $\frac{\partial L}{\partial a} = \frac{a - y}{a(1-a)}$
Step 2. 计算 $\frac{da}{dz}$ (Sigmoid 的导数)
- $a = (1 + e^{-z})^{-1}$
- 利用链式法则和 $\frac{d}{dx}(e^x) = e^x$:
- $\frac{da}{dz} = -1 \cdot (1 + e^{-z})^{-2} \cdot (e^{-z} \cdot -1) = \frac{e^{-z}}{(1 + e^{-z})^2}$
- 变形:$\frac{da}{dz} = \left( \frac{1}{1 + e^{-z}} \right) \cdot \left( \frac{e^{-z}}{1 + e^{-z}} \right) = a \cdot (1 - a)$
- 结果: $\frac{da}{dz} = a(1 - a)$
Step 3. 计算 $\frac{\partial z}{\partial w_i}$ 和 $\frac{\partial z}{\partial b}$ (线性层的导数)
- $z = w_1x_1 + ... + w_ix_i + ... + w_nx_n + b$
- 结果: $\frac{\partial z}{\partial w_i} = x_i$
- 结果: $\frac{\partial z}{\partial b} = 1$
Step 4. 组合求 $\frac{\partial L}{\partial z}$ (关键中间步)
- $\frac{\partial L}{\partial z} = \frac{\partial L}{\partial a} \cdot \frac{da}{dz}$
- $\frac{\partial L}{\partial z} = \left( \frac{a - y}{a(1-a)} \right) \cdot \left( a(1-a) \right)$
- 简洁结果: $\frac{\partial L}{\partial z} = a - y \quad (\text{即:预测值 - 真实值})$
- 这个简洁的形式是 Sigmoid 和二元交叉熵损失函数成为“黄金搭档”的核心原因。
Step 5. 最终梯度
- 对 $w_i$: $\frac{\partial L}{\partial w_i} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial w_i} = (a - y) x_i$
- 对 $b$: $\frac{\partial L}{\partial b} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial b} = (a - y) \cdot 1 = a - y$
总结
- $\frac{\partial L}{\partial \mathbf{w}} = (a - y) \mathbf{x} \quad$ (向量形式)
- $\frac{\partial L}{\partial b} = a - y$
五、高级应用:Softmax 多元交叉熵函数求导
这是理解神经网络多分类任务(如图像识别、NLP中的词汇分类)反向传播的核心。这里的关键是 Softmax 函数如何处理多个类别。
核心组件 (The Setup)
假设我们有 $C$ 个类别。对于单个样本 $(\mathbf{x}, \mathbf{y})$:
- 输入 (Input): $\mathbf{x}$ 是一个 $n$ 维的特征向量 ($n$ 个特征)。
- 权重和偏置 (Weights & Biases):
- $\mathbf{W}$ 是一个 $C \times n$ 的权重矩阵。 $w_{ij}$ 是连接第 $j$ 个输入特征到第 $i$ 个类别神经元的权重。
- $\mathbf{b}$ 是一个 $C$ 维的偏置向量。 $b_i$ 是第 $i$ 个类别神经元的偏置。
- 线性得分 (Logits): 我们计算每个类别的得分 $z_i$。 $$z_i = (\sum_{j=1}^n w_{ij}x_j) + b_i$$
- Softmax 激活 (Activation): 我们将得分 $z$ 向量转换为概率 $a$ 向量。 $a_i$ (也就是 $\hat{y}_i$) 是模型预测第 $i$ 类的概率。 $$a_i = \text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{k=1}^C e^{z_k}}$$
- 真实标签 (True Label): $\mathbf{y}$ 是一个 $C$ 维的 one-hot 向量。 (例如,如果类别 3 是正确答案,则 $\mathbf{y} = [0, 0, 1, 0, ...]$)
- 多元交叉熵损失 (Loss):
$$L = -\sum_{i=1}^C y_i \log(a_i)$$
(因为 $\mathbf{y}$ 是 one-hot 向量, 这个总和中只有一项 $y_i$ 不为零, 即真实类别 $c$ 对应的那一项, 所以 $L = -y_c \log(a_c) = -\log(a_c)$)
目标
计算损失 $L$ 对任意权重 $w_{ij}$ 和偏置 $b_i$ 的偏导数。
推导工具:链式法则
最高效的路径是先求出 $L$ 对 $z_i$ (logit) 的导数。链式法则将问题分解为:
- $\frac{\partial L}{\partial w_{ij}} = \frac{\partial L}{\partial z_i} \cdot \frac{\partial z_i}{\partial w_{ij}}$
- $\frac{\partial L}{\partial b_i} = \frac{\partial L}{\partial z_i} \cdot \frac{\partial z_i}{\partial b_i}$
步骤 1. $\frac{\partial z_i}{\partial w_{ij}}$ 和 $\frac{\partial z_i}{\partial b_i}$ (简单部分)
根据 $z_i = (w_{i1}x_1 + ... + w_{ij}x_j + ... + w_{in}x_n) + b_i$:
- $\frac{\partial z_i}{\partial w_{ij}} = x_j$
- $\frac{\partial z_i}{\partial b_i} = 1$
步骤 2. $\frac{\partial L}{\partial z_i}$ (核心部分)
$L$ 依赖于所有的 $a_k$,而所有的 $a_k$ 都依赖于所有的 $z_j$ (因为 $z_j$ 在Softmax的分母中)。这使得求导变得复杂。完整的链式法则是:
$$\frac{\partial L}{\partial z_i} = \sum_{k=1}^C \frac{\partial L}{\partial a_k} \cdot \frac{\partial a_k}{\partial z_i}$$子步骤 2a: $\frac{\partial L}{\partial a_k}$
对 $L = -\sum_{k=1}^C y_k \log(a_k)$ 求导:
$$\frac{\partial L}{\partial a_k} = -\frac{y_k}{a_k}$$子步骤 2b: $\frac{\partial a_k}{\partial z_i}$ (Softmax 的导数)
这里必须分为两种情况:
- 情况 1 ($k = i$): $\frac{\partial a_i}{\partial z_i}$
使用除法法则,最终简化可得: $\frac{\partial a_i}{\partial z_i} = a_i (1 - a_i)$ - 情况 2 ($k \neq i$): $\frac{\partial a_k}{\partial z_i}$
使用除法法则,最终简化可得: $\frac{\partial a_k}{\partial z_i} = -a_k a_i$
子步骤 2c: 组合 2a 和 2b
我们将 $k=i$ 这一项从总和中拆分出来:
$$\frac{\partial L}{\partial z_i} = \left( \frac{\partial L}{\partial a_i} \cdot \frac{\partial a_i}{\partial z_i} \right) + \sum_{k \neq i} \left( \frac{\partial L}{\partial a_k} \cdot \frac{\partial a_k}{\partial z_i} \right)$$代入结果:
$$\frac{\partial L}{\partial z_i} = \left( -\frac{y_i}{a_i} \right) \cdot \left( a_i (1 - a_i) \right) + \sum_{k \neq i} \left( -\frac{y_k}{a_k} \right) \cdot \left( -a_k a_i \right)$$简化:
$$\frac{\partial L}{\partial z_i} = -y_i (1 - a_i) + \sum_{k \neq i} (y_k a_i)$$ $$\frac{\partial L}{\partial z_i} = -y_i + y_i a_i + a_i \sum_{k \neq i} y_k$$提出 $a_i$:
$$\frac{\partial L}{\partial z_i} = -y_i + a_i \left( y_i + \sum_{k \neq i} y_k \right)$$关键点:因为 $\mathbf{y}$ 是 one-hot 向量,$\left( y_i + \sum_{k \neq i} y_k \right)$ 是 $\mathbf{y}$ 中所有元素的总和,永远等于 1。
$$\frac{\partial L}{\partial z_i} = -y_i + a_i (1)$$简洁结果:
$$\frac{\partial L}{\partial z_i} = a_i - y_i$$步骤 3. 最终组合
- 对 $w_{ij}$ 的导数: $$\frac{\partial L}{\partial w_{ij}} = \frac{\partial L}{\partial z_i} \cdot \frac{\partial z_i}{\partial w_{ij}} = (a_i - y_i) \cdot x_j$$
- 对 $b_i$ 的导数: $$\frac{\partial L}{\partial b_i} = \frac{\partial L}{\partial z_i} \cdot \frac{\partial z_i}{\partial b_i} = (a_i - y_i)$$
总结
这个 $(a_i - y_i)$ 的简洁形式(预测概率 - 真实概率)是 Softmax 激活函数和多元交叉熵损失函数成为多分类任务“黄金搭档”的核心原因。
本节通过交互式图表直观地展示二元交叉熵损失函数。您可以将鼠标悬停在曲线上,观察当预测概率 $p$ 接近(或远离)真实标签时,损失值是如何急剧变化(或接近于0)的。
五、图表可视化 (辅助理解)
最后,我们通过函数曲线来直观理解二元交叉熵损失函数。
结论
损失函数完美地惩罚了错误的预测,且预测越离谱,惩罚越重。
- 蓝色曲线 ($y=1$): 如果预测 $p \to 1$ (正确),损失 $\to 0$。如果预测 $p \to 0$ (错误),损失 $\to \infty$。
- 红色曲线 ($y=0$): 如果预测 $p \to 0$ (正确),损失 $\to 0$。如果预测 $p \to 1$ (错误),损失 $\to \infty$。