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

202 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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)$ 的影响。