目录

深度学习 (Deep Learning)

构建深度学习的知识树。

Agreement

线性代数

矩阵求导

布局规则

对于函数: $$ y = f(x),\quad x \in \mathbb{R}^n,\quad y \in \mathbb{R}^m $$ 存在如下两种布局流派:

  • 分子布局 / Numerator Layout $$ \frac{\partial y}{\partial x^\top} = \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \cdots & \frac{\partial y_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_m}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \in \mathbb{R}^{m \times n} $$
  • 分母布局 / Denominator Layout $$ \frac{\partial y^\top}{\partial x} = \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_1} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_1}{\partial x_n} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \in \mathbb{R}^{n \times m} $$ 注意:
  • 上述分子布局中的 $\partial x^\top$ 和分母布局中的 $\partial y^\top$ 表示的都是转置。这是因为 $x \in \mathbb{R}^n,\quad y \in \mathbb{R}^m$ (在默认情况下)都是列向量,将其转置以得到行向量,这种写法有两个好处:
    • 可以明确维度方向以避免歧义
    • 配合列链式法则更自然
      在矩阵求导中,链式法则通常是: $$ \frac{\partial z}{\partial x^\top} = \frac{\partial z}{\partial y^\top}\cdot\frac{\partial y}{\partial x^\top} $$ 可见,在如上形式中使用转置标记可以让矩阵维度匹配。
矩阵导数
导数一览
自变量因变量导数形式微分形式备注深度学习应用
标量
$x \in \mathbb{R}$
标量
$y \in \mathbb{R}$
$\frac{dy}{dx} \in \mathbb{R}$$dy = f'(x) dx$微积分中的导数
函数在一元情况下的变化率
-
向量
$x \in \mathbb{R}^n$
标量
$y \in \mathbb{R}$
$\frac{\partial y}{\partial x} = \nabla y = \begin{bmatrix} \frac{\partial y}{\partial x_1} \\ \vdots \\ \frac{\partial y}{\partial x_n} \end{bmatrix} \in \mathbb{R}^n$$\begin{aligned} dy &= \text{tr}\left(\left(\frac{\partial y}{\partial x}\right)^T dx\right) \\ &= \left(\frac{\partial y}{\partial x}\right)^T dx \end{aligned}$梯度
实值函数在多元情况下变化率的向量化表达
SGD、Adam、RMSprop等一阶优化算法
向量
$x \in \mathbb{R}^n$
标量
$y \in \mathbb{R}$
$\begin{aligned} H &= \frac{\partial^2 y}{\partial x \partial x^T} = \frac{\partial (\nabla y)}{\partial x^T} \\ &= \begin{bmatrix} \frac{\partial^2 y}{\partial x_1^2} & \cdots & \frac{\partial^2 y}{\partial x_1 \partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial^2 y}{\partial x_n \partial x_1} & \cdots & \frac{\partial^2 y}{\partial x_n^2} \end{bmatrix} \in \mathbb{R}^{n \times n} \end{aligned}$$d^2 y = (dx)^T H , dx$
$d(\nabla y) = H \, dx = \frac{\partial (\nabla y)}{\partial x^T} dx$
Hessian 矩阵
实值函数在多元情况下二阶偏导数组成的方阵
是梯度对输入的 Jacobian
二阶优化:K-FAC、Shampoo等
矩阵
$X \in \mathbb{R}^{m \times n}$
标量
$y \in \mathbb{R}$
$\frac{\partial y}{\partial X} = \begin{bmatrix} \frac{\partial y}{\partial X_{11}} & \cdots & \frac{\partial y}{\partial X_{1n}} \\ \vdots & \ddots & \vdots \\ \frac{\partial y}{\partial X_{m1}} & \cdots & \frac{\partial y}{\partial X_{mn}} \end{bmatrix} \in \mathbb{R}^{m \times n}$$dy = \text{tr}\left(\left(\frac{\partial y}{\partial X}\right)^T dX\right)$矩阵梯度参数更新:权重梯度计算
向量
$x \in \mathbb{R}^n$
向量
$y \in \mathbb{R}^m$
$\begin{aligned} J &= \frac{\partial y}{\partial x^T} \\ &= \begin{bmatrix} \frac{\partial y_1}{\partial x_1} & \cdots & \frac{\partial y_1}{\partial x_n} \\ \vdots & \ddots & \vdots \\ \frac{\partial y_m}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_n} \end{bmatrix} \in \mathbb{R}^{m \times n} \end{aligned}$$dy = \frac{\partial y}{\partial x^T} dx$Jacobian 矩阵反向传播:链式法则、激活函数导数
矩阵
$X \in \mathbb{R}^{m \times n}$
矩阵
$Y \in \mathbb{R}^{p \times q}$
$\frac{\partial \text{vec}(Y)}{\partial \text{vec}(X)^T} \in \mathbb{R}^{pq \times mn}$$d\text{vec}(Y) = \frac{\partial \text{vec}(Y)}{\partial \text{vec}(X)^T} \text{vec}(dX)$矩阵 Jacobian(Kronecker积相关)-
导数与微分的历史纠缠

在古典微积分中,微分先由莱布尼茨通过“无穷小”的概念提出,并将两个微分的比值作为导数。但严格意义上的“无穷小”在柯西引入极限概念前是模糊的,这甚至导致了第二次数学危机。

在现代微积分(分析学)中,认为微分是更基础的概念,导数只是线性近似存在时的线性映射的系数。

对于一元函数,微分(可微)导数(可导)可以认为是互为充要的关系。因此定义了导数可以自然的引出微分,反之亦然。

导数为基础的视角下:

  1. 通过极限定义导数: $f'(x) = \lim_{h \to 0} \frac{f(x+h)-f(x)}{h}$
  2. 定义微分: $df = f'(x) \, dx$
  3. 因此微分导数与自变量增量的积

而以微分为基础的视角下:

  1. 定义可微: $\Delta f = f'(x) \Delta x + o(\Delta x)$ 其中 $\lim_{\Delta x \to 0} \frac{|o(\Delta x)|}{|\Delta x|} = 0$
  2. 定义微分: $df = f'(x) \, dx$ (线性主部)
  3. 这里导数微分系数: $f'(x) = \frac{df}{dx}$

对于多元函数,导数概念被拓展为了偏导微分也被拓展为了全微分。但可微可知偏导必定存在,而偏导存在不能得到可微,必须补充偏导连续作为条件。

因此对于多元函数 $u = f(x_1, x_2, \ldots, x_n)$ :

  1. 定义可微:如果存在常数 $A_1, A_2, \ldots, A_n$ 使得: $\Delta u = A_1 \Delta x_1 + A_2 \Delta x_2 + \cdots + A_n \Delta x_n + o(\rho)$ 其中 $\rho = \sqrt{(\Delta x_1)^2 + (\Delta x_2)^2 + \cdots + (\Delta x_n)^2}$ ,且 $\lim_{\rho \to 0} \frac{|o(\rho)|}{\rho} = 0$
  2. 定义全微分: $du = \sum_{i=1}^{n} A_i \, dx_i$ (线性主部)
  3. 根据偏导数只改变一个变量 $x_i$,其它变量保持不变的前提(即 $\Delta x_j=0,j\neq i$ ),全微分可以退化为偏微分: $\Delta u = A_i \Delta x_i + o(|\Delta x_i|)$
  4. 因此偏导数: $\frac{\partial f}{\partial x_i} = \lim_{\Delta x_i \to 0} \frac{\Delta u}{\Delta x_i} = A_i$ 刚好就是全微分中各自变量的系数

这里有一个误区,导数记号 $\frac{dy}{dx}$ 并不能被简单看作一个除法。 对于一元情形( $y = f(x)$,$y, x \in \mathbb{R}$ ),导数看起来能通过微分形式直接做除法得到,这是因为 $dy$ 和 $dx$ 都是实数,可以相除,通过极限运算可以从“形式上”满足: $$f'(x)=\lim_{\Delta x \to 0} \frac{\Delta y}{\Delta x}=\lim_{\Delta x \to 0} \frac{A\Delta x+ o(\Delta x)}{\Delta x}=A$$ 但对于多元情形( $u = f(x_1, x_2, \ldots, x_n)$,$u \in \mathbb{R}$,$\mathbf{x} \in \mathbb{R}^n$ ),虽然 $du$ 仍然是标量,但 $d\mathbf{x}$ 是向量,而不存在“标量 ÷ 向量"的运算定义,因此无法形式上地进行 $\frac{du}{d\mathbf{x}}$ 的除法,必须通过“对比系数”的方式定义偏导数。即从微分形式 $du = \sum_{i=1}^{n} A_i dx_i$ 出发,对比 $du$ 中各个 $dx_i$ 的系数,从而得到 $\frac{\partial f}{\partial x_i} = A_i$,这不是从除法运算得到的,而是直接从可微性的定义中提取系数得到的。

常见函数的微分与梯度
函数形式微分形式导数
$y = \sum x_i = \mathbf{1}^T x$$dy = \mathbf{1}^T dx$$\frac{\partial y}{\partial x} = \mathbf{1}$
$y = a^T x$$dy = a^T dx$$\frac{\partial y}{\partial x} = a$
$y = x^T x$$dy = 2(dx)^T x$$\frac{\partial y}{\partial x} = 2x$
$y = x^T A x$$dy = (dx)^T(A+A^T)x$$\frac{\partial y}{\partial x} = (A+A^T)x$
$y = \langle u, v \rangle = u^T v$$dy = (du)^T v + u^T dv$$\frac{\partial y}{\partial x} = \left(\frac{\partial u}{\partial x}\right)^T v + \left(\frac{\partial v}{\partial x}\right)^T u$

基本求和 $$y = \sum x_i = \mathbf{1}^T x$$ 逐元素求导: $\frac{\partial y}{\partial x_i} = 1$

微分形式推导: $$dy = d(\mathbf{1}^T x) = \mathbf{1}^T dx$$ 对比系数得: $$\boxed{\frac{\partial y}{\partial x} = \mathbf{1}}$$ 线性函数 $$y = a^T x, \quad a \in \mathbb{R}^n$$ 微分形式推导: $$dy = d(a^T x) = a^T dx$$ 对比系数得: $$\boxed{\frac{\partial y}{\partial x} = a}$$ 平方范数 $$y = \|x\|^2 = x^T x$$ 微分形式推导: $$dy = d(x^T x) = (dx)^T x + x^T dx = 2(dx)^T x$$ 对比系数得: $$\boxed{\frac{\partial y}{\partial x} = 2x}$$ 二次型(一般情况) $$y = x^T A x, \quad A \in \mathbb{R}^{n \times n}$$ 微分形式: $$dy = (dx)^T A x + x^T A dx = (dx)^T A x + (A^T dx)^T x = (dx)^T(A + A^T)x$$ 对比系数得: $$\boxed{\frac{\partial y}{\partial x} = (A + A^T)x}$$ 特殊情况:若 $A$ 对称,则 $\frac{\partial y}{\partial x} = 2Ax$

内积 $$y = \langle u, v \rangle = u^T v, \quad u = u(x), \quad v = v(x)$$ 链式法则(使用微分形式): $$dy = d(u^T v) = (du)^T v + u^T dv$$ 设 $\frac{\partial u}{\partial x}$ 和 $\frac{\partial v}{\partial x}$ 分别为 $u$ 和 $v$ 对 $x$ 的梯度,则: $$dy = \left[\left(\frac{\partial u}{\partial x}\right)^T v + \left(\frac{\partial v}{\partial x}\right)^T u\right]^T dx$$ 对比系数得: $$\boxed{\frac{\partial y}{\partial x} = \left(\frac{\partial u}{\partial x}\right)^T v + \left(\frac{\partial v}{\partial x}\right)^T u}$$

线性模型

线性回归

线性分类

Logistic 回归

用于处理二分类任务,本质上是把线性打分输出(即 $z = w^T x + b$ )套上一层 Sigmoid : $$\hat p = \sigma(z) = \frac{1}{1+e^{-z}}$$ 其中 $\hat p$ 是样本属于正类的概率。

决策规则

若 $\hat p > 0.5$ 预测为正类,反之则为负类。

因为 Sigmoid 函数的对称性,即 $\sigma(0) = \frac{1}{1+e^0} = \frac{1}{2} = 0.5$ 且 $\sigma$ 严格单调递增,所以 $z > 0 \Rightarrow \sigma(z) > 0.5$ ,即决策等价为 $z = w^Tx+b > 0$ 预测为正类。

损失函数

对于样本 $(x, y)$ ,其中 $y \in \{0, 1\}$ ,则模型预测样本属于正类的概率为 $\hat p = \sigma(w^T x + b)$ 。

此外,样本 $(x, y)$ 出现,即在输入 $x$ 的条件下输出 $y$ ,的概率可表示为: $$P(y|x) = \begin{cases} \hat p & \text{if } y=1 \\ 1-\hat p & \text{if } y=0 \end{cases}$$ 即,若 $y = 1$ ,则该样本在模型预测下出现的概率为 $\hat p$ ,反之若 $y = 0$ ,则该样本在模型预测下出现的概率为 $1-\hat p$ 。可简化表示为: $$P(y|x) = \hat p^y \cdot (1-\hat p)^{1-y}$$ 对于整个数据集,联合概率(似然函数)是: $$L = \prod_{i=1}^N P(y_i|x_i) = \prod_{i=1}^N \hat p_i^{y_i} \cdot (1-\hat p_i)^{1-y_i}$$ 为便于计算,取其对数似然: $$\ln L = \sum_{i=1}^N \left[y_i \ln \hat p_i + (1-y_i) \ln(1-\hat p_i)\right]$$ 由于最大化似然就是最小化负对数似然: $$\min \mathcal{L} = -\frac{1}{N}\sum_{i=1}^N \left[y_i\log \hat p_i + (1-y_i)\log(1-\hat p_i)\right]$$ 此即二元交叉熵,且其中 $y_i \in \{0,1\}$ 。

Softmax 回归

用于处理多分类任务,即对 $K$ 个类别的每个类都算一个线性打分: $$z_k = w_k^T x + b_k, \quad k=1,2,\ldots,K$$ 再用如下 Softmax 映射成概率分布: $$\hat p_k = \frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}}$$ 不难看出,$\sum_{k=1}^K \hat p_k = 1$ 和 $\hat p_k \in (0,1)$ 都是满足的,符合概率值的基本要求。

决策规则

多分类任务的决策表现为选择概率最大的类,即 $\hat y = \arg\max_k \hat p_k = \arg\max_k z_k$ 。

因为 Softmax 函数

  • 分母 $\sum_{j=1}^K e^{z_j}$ 对所有 $k$ 都相同
  • 分子 $e^{z_k}$ 随 $k$ 变化,且 $e^{z_k}$ 关于 $z_k$ 严格单调递增

所以 $$\arg\max_k \hat p_k = \arg\max_k z_k = \arg\max_k (w_k^T x + b_k)$$ 也等价于 $w_k^T x + b_k > w_j^T x + b_j$ ,即 $(w_k - w_j)^T x + (b_k - b_j) > 0$ 。

损失函数

对于样本 $(x, y)$ ,其中 $y \in \{1, 2, \ldots, K\}$ (真实标签为某一类),模型预测该样本属于各类的概率分别为 $\hat p_1, \hat p_2, \ldots, \hat p_K$ ,其中: $$\hat p_k = \frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}}, \quad z_k = w_k^T x + b_k$$ 为了统一表示,通常采用 one-hot 编码将标签 $y$ 表示为向量 $(y_1, y_2, \ldots, y_K)$ ,其中 $y_k = 1$ 当且仅当真实类为 $k$ ,否则 $y_k=0$ 。

利用此特点,样本 $(x, y)$ 在模型预测下出现的条件概率可统一为: $$P(y|x) = \hat p_1^{y_1} \cdot \hat p_2^{y_2} \cdot \ldots \cdot \hat p_K^{y_K}$$ 进一步可表示为: $$P(y|x) = \prod_{k=1}^K \hat p_k^{y_k}$$ 对于整个数据集,联合概率(似然函数)是: $$L = \prod_{i=1}^N P(y^{(i)}|x^{(i)}) = \prod_{i=1}^N \prod_{k=1}^K \hat p_k^{(i)y_k^{(i)}}$$ 为便于计算,取其对数似然: $$\ln L = \sum_{i=1}^N \sum_{k=1}^K y_k^{(i)} \ln \hat p_k^{(i)}$$ 由于最大化似然就是最小化负对数似然: $$\min \mathcal{L} = -\frac{1}{N}\sum_{i=1}^N \sum_{k=1}^K y_k^{(i)}\log \hat p_k^{(i)}$$ 此即多类交叉熵,其中 $y_k^{(i)} \in \{0, 1\}$ 为 one-hot 编码, $\hat p_k^{(i)}$ 为模型对第 $i$ 个样本的第 $k$ 类预测概率。

非线性与激活函数

由于线性模型无法处理非线性可分问题,引入非线性的激活函数可以打破线性映射叠加后还等价于线性映射的局限,赋予网络任意逼近复杂函数的能力。

若采用不加激活的线性叠加: $h = W_2(W_1 x + b_1) + b_2 = W'x + b'$ ,则无论多少层都可以展开为一层等效的线性映射;而施加激活后则不然: $h = \sigma(W_1 x + b_1), \quad y = W_2 h + b_2$ ,无法进行类似的等效。

所以:

  • 单层感知机:只能解决线性可分问题
  • 多层感知机+激活函数:可以解决异或这类“多条线性界可组合”的非线性可分问题
  • 深度网络+激活函数:可以解决“复杂”非线性可分问题

注意: 如 SigmoidSoftmax 等单调非线性函数在输出层可保证决策边界仍是线性的(order-preserving)。但在隐藏层(中间层),使用任何激活函数都会打破多层线性叠加的等价性。

常见激活函数

常见激活函数
  1. Sigmoid - 经典的 S 形曲线,输出范围 (0,1) $$\sigma(x) = \frac{1}{1 + e^{-x}}$$

    def sigmoid(x):
      return 1 / (1 + np.exp(-x))

    解决的问题(最古老)

    • 将任意实数映射到 $(0, 1)$ ,并提供概率解释
    • 单调递增,保证不改变线性边界的相对顺序
    • 光滑可导,适合梯度下降

    局限

    • 梯度消失:在 $x \to \pm\infty$ 时, $\sigma'(x) \to 0$ ,导致深层网络梯度逐层衰减
    • 非零中心:输出总是正的,导致反向传播时梯度振荡,收敛慢
    • 计算量大:需要指数运算

    现状

    • 基本被 ReLU 系取代
    • 仅保留在输出层(二分类概率)
  2. Tanh - 双曲正切函数,输出范围 (-1,1),常用于隐层 $$\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$$

    def tanh(x):
      return np.tanh(x)

    解决的问题(改进 Sigmoid

    • 零中心化:输出范围 $(-1, 1)$ ,均值接近 $0$ ,缓解梯度振荡
    • Sigmoid 收敛快
    • 数学上就是 $\tanh(x) = 2\sigma(2x) - 1$

    局限

    • 梯度消失:梯度消失虽然改善但本质问题未解决
    • 在深层网络中依然瓶颈明显
    • 隐层用 Tanh 不如 ReLU

    现状

    • LSTM/GRU 等门控机制中有应用
    • 很少作为深层隐层激活函数
  3. ReLU - 修正线性单元,简单高效 $$\text{ReLU}(x) = \max(0, x)$$

    def relu(x):
      return np.maximum(0, x)

    解决的问题(革命性的)

    • 梯度消失完全消除:梯度 $\text{ReLU}'(x) = \begin{cases}1 & x>0 \\ 0 & x\leq 0\end{cases}$ ,其在正区间梯度为常数 $1$ ,避免了梯度衰减,使深度学习真正可行
    • 计算简单:速度快
    • 稀疏表示:负值被设为 $0$ ,自动产生稀疏性,减少过拟合

    局限

    • 死亡 ReLU:一旦 $x < 0$ ,神经元永久失活(梯度为 $0$ ),无法恢复(尤其是在学习率太高时)
    • 非零中心:即 $E[\text{ReLU}(x)] > 0$
    • 不够光滑:在 $x=0$ 处导数不连续(实践中影响不大)

    现状

    • 仍是最常用的激活函数
    • CNN、标准 Feed-forward 网络中标准配置
  4. Leaky ReLU - ReLU 的改进,负值区间有小斜率 $$\text{Leaky ReLU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases}$$

    def leaky_relu(x, alpha=0.01):
      return np.where(x > 0, x, alpha * x)

    解决的问题(修复死亡 ReLU

    • 在负值区间添加小斜率 $\alpha$ (通常为 $0.01$ ),保证负值也有梯度流,从而完全解决死亡 ReLU 问题
    • 计算成本仍然很低

    局限

    • 引入了超参数 $\alpha$ ,需要调整
    • 实践中改善不总是显著(有时跟 ReLU 差不多)
    • 对正值区间表现力没改善

    现状

    • GAN 中较常见,因为 Leaky ReLU 更"平衡”
    • 一般场景下可选
  5. ELU - 指数线性单元,光滑曲线 $$\text{ELU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha(e^x - 1) & \text{if } x \leq 0 \end{cases}$$

    def elu(x, alpha=1.0):
      return np.where(x > 0, x, alpha * (np.exp(x) - 1))

    解决的问题(平滑版 Leaky ReLU

    • 负值区间使用指数映射,而不是线性
    • Leaky ReLU 更平滑,二阶可导
    • 保证输出接近零中心(负值端会趋向 $-\alpha$ )
    • 理论上更好的梯度流

    局限

    • 计算量大:需要指数运算 $e^x$
    • 改善通常不明显,通常跟 Leaky ReLU 旗鼓相当
    • 超参数 $\alpha$ 也需调

    现状

    • 在某些特定领域(如强化学习)有应用
    • 不如 ReLU 常用(因为收益 < 计算成本)
  6. Swish - 自门控激活函数 $$\text{Swish}(x) = x \cdot \sigma(x)$$

    def swish(x):
      return x * sigmoid(x)

    解决的问题

    • $\text{Swish}(x) = x \cdot \sigma(x)$ 结合了"线性"和"非线性能力"
    • 自适应门控:接近 $0$ 时会抑制,远离 $0$ 时会放大,相当于让网络自己决定是否激活
    • ReLU 更光滑,避免了硬裁断
    • 在某些任务上超过 ReLU

    局限

    • 计算量大:需要计算 Sigmoid,比 ReLU 贵 2-3 倍
    • 改善通常 $3-5%$ ,性价比一般
    • 需要更多的数据/训练时间才能显效
    • 不如 ReLU 稳定(某些初始化下可能发散)

    现状

    • Google神经架构搜索(Neural Architecture Search, NAS)中发现效果好
    • Transformer 中偶有应用
    • 工业界还是以 ReLU 为主
  7. GELU - 高斯误差线性单元 $$\text{GELU}(x) = x \cdot \Phi(x)$$

    def gelu(x):
      return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))

    解决的问题

    • Swish 更"平滑",有更强的概率论解释
    • Transformer 架构中表现突出(BERT, GPT 等都用)
    • 避免了 ReLU 的硬裁断,但保持了稀疏性

    局限

    • 计算量大:涉及高斯函数,需要特殊库加速
    • ReLU 相比收益小(通常 $2-3%$ ),只在大规模模型上差异明显

    现状

    • Transformer 标准激活函数
    • NLP 领域(BERT, GPT)里应该首选,CNN 里用 ReLU 更合适