Files
Notes/机器学习/深度学习模型/1-基础模型/1-MLP-多层感知机.md
2026-05-16 17:16:51 +08:00

7.6 KiB
Raw Permalink Blame History

title, draft, tags
title draft tags
1-MLP-多层感知机 false
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 deltai=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) 的影响。