7.6 KiB
title, draft, tags
| title | draft | tags | |||
|---|---|---|---|---|---|
| 1-MLP-多层感知机 | false |
|
一、 核心直觉与基础定义
多层感知机的本质是一个万能函数逼近器(Universal Approximator)。它的核心逻辑是通过多层的线性变换与非线性激活的交替,将输入空间的数据映射到输出空间,从而拟合出任意复杂的非线性函数。
1. 通用逼近定理(Intuition)
一个单隐藏层的 MLP(宽度足够大)可以以任意精度逼近任意连续函数 $f: [0,1]^n \rightarrow [0,1]^m$。这是神经网络的理论基础,也是它"万能"的来源。
直观理解:
- 每一层的线性变换
W^{(l)} a^{(l-1)} + b^{(l)}是在对空间进行旋转、拉伸、平移(仿射变换) - 非线性激活
\sigma是在引入折角/弯曲,打破线性叠加 - 多层叠加后,网络能构造出任意扭曲的高维曲面
2. 网络结构定义
假设我们有一个 L 层的神经网络(通常输入层不计入 $L$,第 L 层为输出层)。
-
$n_l$:第
l层的神经元数量。 -
$W^{(l)} \in \mathbb{R}^{n_l \times n_{l-1}}$:第
l层的权重矩阵。 -
$b^{(l)} \in \mathbb{R}^{n_l \times 1}$:第
l层的偏置向量。 -
$a^{(l)} \in \mathbb{R}^{n_l \times 1}$:第
l层的激活输出向量(其中a^{(0)} = x为输入数据)。 -
$z^{(l)} \in \mathbb{R}^{n_l \times 1}$:第
l层的线性组合输出(未激活)。 -
$\sigma$:非线性激活函数(如 ReLU, Sigmoid, Tanh)。
二、 正向传播(Forward Propagation)
正向传播是数据从输入侧流向输出侧的过程。对于第 l 层,前向传播的数学公式非常简洁:
线性变换:
z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)}
非线性激活:
a^{(l)} = \sigma(z^{(l)})
【代码实现视角的维度校验】
-
W^{(l)}是n_l \times n_{l-1}的矩阵。 -
a^{(l-1)}是n_{l-1} \times 1的列向量。 -
相乘结果
W^{(l)} a^{(l-1)}的维度是 $n_l \times 1$。 -
加上同维度的偏置 $b^{(l)}$,得到
n_l \times 1的向量 $z^{(l)}$,逐元素(element-wise)经过激活函数后,得到n_l \times 1的向量 $a^{(l)}$。
三、 损失函数(Loss Function)
为了让网络学习,我们需要一个标量函数 \mathcal{L} 来衡量网络输出 a^{(L)} 与真实标签 y 之间的差距。
常见的损失函数:
-
均方误差(MSE)(常用于回归,如 Critic 网络预估 Value):
\mathcal{L} = \frac{1}{2} \| a^{(L)} - y \|^2 -
交叉熵(Cross-Entropy)(常用于分类,结合 Softmax):
\mathcal{L} = - \sum_{i} y_i \log(a^{(L)}_i)
四、 反向传播(Backpropagation)严谨推导
反向传播的本质是多变量微积分中的链式法则(Chain Rule)。它的目标是求出标量损失 \mathcal{L} 对所有参数 W^{(l)} 和 b^{(l)} 的偏导数,以便使用梯度下降更新它们。
为了推导清晰,我们引入一个极其重要的中间变量——局部梯度(或误差项) $\delta^{(l)}$,它表示损失对第 l 层未激活输出 z^{(l)} 的导数:
\delta^{(l)} = \frac{\partial \mathcal{L}}{\partial z^{(l)}} \in \mathbb{R}^{n_l \times 1}
推导反向传播,就是推导反向传播的四大核心方程。这是这篇笔记最需要记忆的部分。
方程 1:输出层的误差 \delta^{(L)}
根据链式法则,损失 \mathcal{L} 对输出层 z^{(L)} 的偏导:
\delta^{(L)} = \frac{\partial \mathcal{L}}{\partial a^{(L)}} \odot \sigma'(z^{(L)})
(注:\odot 表示 Hadamard 乘积,即逐元素相乘。\sigma' 是激活函数的导数。)
如果输出层使用 Softmax 且损失是交叉熵,这个公式可以极度化简为非常优雅的形式:
\delta^{(L)} = a^{(L)} - y
【推导:Cross-Entropy + Softmax 的简化】
设 $a_i^{(L)} = \text{softmax}(z)_i = \frac{e^{z_i}}{\sum_j e^{z_j}}$,损失 $\mathcal{L} = -\sum_i y_i \log a_i$。
第一步:对 z_j 求偏导(商的求导法则):
\frac{\partial a_i}{\partial z_j} = a_i (\delta_{ij} - a_j)
其中 \delta_{ij} 是 Kronecker delta(i=j 时为 1,否则为 0)。
第二步:链式法则
\frac{\partial \mathcal{L}}{\partial z_j} = \sum_i \frac{\partial \mathcal{L}}{\partial a_i} \frac{\partial a_i}{\partial z_j} = \sum_i (-y_i / a_i) \cdot a_i (\delta_{ij} - a_j)
= -\sum_i y_i (\delta_{ij} - a_j) = -y_j + a_j \sum_i y_i
第三步:因为 $\sum_i y_i = 1$(one-hot 标签),所以:
\frac{\partial \mathcal{L}}{\partial z_j} = a_j - y_j
即 $\delta^{(L)} = a^{(L)} - y$。这意味着输出层的梯度直接是预测概率减真实标签,无需显式计算激活函数的导数!
方程 2:隐藏层的误差传播 $\delta^{(l)}$(将误差从第 l+1 层传回第 l 层)
当前层的误差 \delta^{(l)} 来源于下一层的误差 $\delta^{(l+1)}$。
已知 $z^{(l+1)} = W^{(l+1)} a^{(l)} + b^{(l+1)}$,且 $a^{(l)} = \sigma(z^{(l)})$。
根据多变量链式法则(矩阵微积分):
\frac{\partial \mathcal{L}}{\partial a^{(l)}} = (W^{(l+1)})^T \frac{\partial \mathcal{L}}{\partial z^{(l+1)}} = (W^{(l+1)})^T \delta^{(l+1)}
继续对 z^{(l)} 求导,只需乘上激活函数的导数(逐元素):
\delta^{(l)} = \left( (W^{(l+1)})^T \delta^{(l+1)} \right) \odot \sigma'(z^{(l)})
记忆点:下一层的权重矩阵转置,乘以下一层的误差,再逐元素乘上当前层激活函数的导数。
方程 3:损失对权重 W^{(l)} 的梯度
已知 $z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)}$,我们要计算 $\frac{\partial \mathcal{L}}{\partial W^{(l)}}$。
根据矩阵微积分,标量对矩阵的导数可以由外积(Outer Product)得到:
\frac{\partial \mathcal{L}}{\partial W^{(l)}} = \delta^{(l)} (a^{(l-1)})^T
【维度校验】
\delta^{(l)} 是 $n_l \times 1$,(a^{(l-1)})^T 是 $1 \times n_{l-1}$。
两者的外积是一个 n_l \times n_{l-1} 的矩阵,完美匹配 W^{(l)} 的维度!
方程 4:损失对偏置 b^{(l)} 的梯度
因为 z^{(l)} 对 b^{(l)} 的偏导是单位阵(即 z 的变化量等于 b 的变化量),所以:
\frac{\partial \mathcal{L}}{\partial b^{(l)}} = \delta^{(l)}
五、 参数更新(Optimization)
拿到梯度后,就可以使用优化算法(如 SGD, Adam 等)更新权重。最基础的梯度下降(Gradient Descent)公式为:
W^{(l)} \leftarrow W^{(l)} - \eta \frac{\partial \mathcal{L}}{\partial W^{(l)}}
b^{(l)} \leftarrow b^{(l)} - \eta \frac{\partial \mathcal{L}}{\partial b^{(l)}}
(其中 \eta 为学习率 Learning Rate)
附录:常用激活函数及其导数 \sigma'(z)
在编写底层推理代码时,激活函数及其导数通常被硬编码为独立的算子:
-
Sigmoid:
-
\sigma(z) = \frac{1}{1 + e^{-z}} -
\sigma'(z) = \sigma(z)(1 - \sigma(z)) = a(1 - a)
-
-
Tanh:
-
\sigma(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} -
\sigma'(z) = 1 - (\sigma(z))^2 = 1 - a^2
-
-
ReLU (Rectified Linear Unit):
-
\sigma(z) = \max(0, z) -
\sigma'(z) = 1 \text{ if } z > 0 \text{ else } 0
-
为了更直观地感受一个神经元内部的正向计算与导数(局部梯度)变化,我为你生成了一个交互式的单神经元(感知机)模拟器。你可以手动调节输入值和权重,观察不同激活函数对前向输出 a 和反向传播至关重要的导数项 \sigma'(z) 的影响。