交互式微积分知识图谱

从导数基础到二元交叉熵损失函数

本节介绍导数的核心概念。导数是微积分的基础,它衡量函数在某一点上变化的瞬时速率。

一、核心基础:导数 (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. 理论推导

  1. 代入定义: $f'(x) = \lim_{h \to 0} \frac{e^{x+h} - e^x}{h}$
  2. 指数法则: $f'(x) = \lim_{h \to 0} \frac{e^x \cdot e^h - e^x}{h}$
  3. 提取公因式: $f'(x) = \lim_{h \to 0} \frac{e^x(e^h - 1)}{h}$
  4. 分离常数: $f'(x) = e^x \cdot \left[ \lim_{h \to 0} \frac{e^h - 1}{h} \right]$
  5. 利用关键极限: $\lim_{h \to 0} \frac{e^h - 1}{h} = 1$ (这是 $e$ 本身的定义之一)
  6. 得出结论: $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. 理论推导

  1. 代入定义: $f'(x) = \lim_{h \to 0} \frac{\ln(x+h) - \ln(x)}{h}$
  2. 对数法则 (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)$
  3. 对数法则 (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]$
  4. 变量替换: 令 $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]$
  5. 利用关键极限: $e = \lim_{u \to 0} (1+u)^{\frac{1}{u}}$ (这是 $e$ 的另一个定义)
    $f'(x) = \ln\left[ e^{\frac{1}{x}} \right]$
  6. 得出结论: $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$ 的梯度(偏导数)。

计算流程(正向传播)

  1. 线性组合 (Z): $z = \mathbf{w}^T \mathbf{x} + b$
  2. Sigmoid 激活 (A): $a = \sigma(z) = \frac{1}{1 + e^{-z}}$ ( $a$ 是模型的预测概率 $\hat{y}$)
  3. 损失函数 (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})$:

  1. 输入 (Input): $\mathbf{x}$ 是一个 $n$ 维的特征向量 ($n$ 个特征)。
  2. 权重和偏置 (Weights & Biases):
    • $\mathbf{W}$ 是一个 $C \times n$ 的权重矩阵。 $w_{ij}$ 是连接第 $j$ 个输入特征到第 $i$ 个类别神经元的权重。
    • $\mathbf{b}$ 是一个 $C$ 维的偏置向量。 $b_i$ 是第 $i$ 个类别神经元的偏置。
  3. 线性得分 (Logits): 我们计算每个类别的得分 $z_i$。 $$z_i = (\sum_{j=1}^n w_{ij}x_j) + b_i$$
  4. 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}}$$
  5. 真实标签 (True Label): $\mathbf{y}$ 是一个 $C$ 维的 one-hot 向量。 (例如,如果类别 3 是正确答案,则 $\mathbf{y} = [0, 0, 1, 0, ...]$)
  6. 多元交叉熵损失 (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) 的导数。链式法则将问题分解为:

  1. $\frac{\partial L}{\partial w_{ij}} = \frac{\partial L}{\partial z_i} \cdot \frac{\partial z_i}{\partial w_{ij}}$
  2. $\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$ 时, 损失 = $-\ln(p)$
当 $y=0$ 时, 损失 = $-\ln(1-p)$

结论

损失函数完美地惩罚了错误的预测,且预测越离谱,惩罚越重。

  • 蓝色曲线 ($y=1$): 如果预测 $p \to 1$ (正确),损失 $\to 0$。如果预测 $p \to 0$ (错误),损失 $\to \infty$。
  • 红色曲线 ($y=0$): 如果预测 $p \to 0$ (正确),损失 $\to 0$。如果预测 $p \to 1$ (错误),损失 $\to \infty$。