--- title: 1-MLP-多层感知机 draft: false tags: - MLP - 深度学习 - 基础模型 --- ### 一、 核心直觉与基础定义 多层感知机的本质是一个**万能函数逼近器(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$ 之间的差距。 **常见的损失函数:** 1. **均方误差(MSE)**(常用于回归,如 Critic 网络预估 Value): $$\mathcal{L} = \frac{1}{2} \| a^{(L)} - y \|^2$$ 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)$ 在编写底层推理代码时,激活函数及其导数通常被硬编码为独立的算子: 1. **Sigmoid:** - $\sigma(z) = \frac{1}{1 + e^{-z}}$ - $\sigma'(z) = \sigma(z)(1 - \sigma(z)) = a(1 - a)$ 2. **Tanh:** - $\sigma(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}$ - $\sigma'(z) = 1 - (\sigma(z))^2 = 1 - a^2$ 3. **ReLU (Rectified Linear Unit):** - $\sigma(z) = \max(0, z)$ - $\sigma'(z) = 1 \text{ if } z > 0 \text{ else } 0$ --- 为了更直观地感受一个神经元内部的正向计算与导数(局部梯度)变化,我为你生成了一个交互式的单神经元(感知机)模拟器。你可以手动调节输入值和权重,观察不同激活函数对前向输出 $a$ 和反向传播至关重要的导数项 $\sigma'(z)$ 的影响。