202 lines
7.6 KiB
Markdown
202 lines
7.6 KiB
Markdown
---
|
||
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)$ 的影响。 |