返回
全连接神经网络是深度学习的基础模型,由多层神经元通过加权连接组成。其训练过程本质上是一个优化问题:给定训练数据,通过梯度下降法不断调整网络的权重和偏置,使损失函数最小化。前向传播完成从输入到输出的映射,反向传播利用链式法则高效计算梯度,各种优化器和学习率调度器则决定了参数更新的效率与稳定性。本页将系统介绍这些核心概念。
全连接神经网络结构
全连接神经网络(Fully Connected Network,也称多层感知机 MLP)由输入层、若干隐藏层和输出层组成。第 \(l\) 层的每个神经元与第 \(l+1\) 层的所有神经元相连。记第 \(l\) 层的输出向量为 \(\mathbf{a}^{[l]}\),则相邻层之间的变换为:
\[
\mathbf{z}^{[l]} = \mathbf{W}^{[l]} \mathbf{a}^{[l-1]} + \mathbf{b}^{[l]},
\quad \mathbf{a}^{[l]} = g^{[l]}(\mathbf{z}^{[l]})
\]
其中 \(\mathbf{W}^{[l]}\) 为权值矩阵(形状为 \(n_l \times n_{l-1}\)),\(\mathbf{b}^{[l]}\) 为偏置向量,\(g^{[l]}\) 为第 \(l\) 层的激活函数。\((n_0, n_1, \ldots, n_L)\) 称为网络结构。
上图展示了一个 4-5-5-2 结构:输入层 4 个神经元,两个隐藏层各 5 个神经元,输出层 2 个神经元。每两个相邻层之间的全部连接对应一个权值矩阵和偏置向量。
前向传播
前向传播(Forward Propagation)将输入数据逐层向前传递,最终输出预测值。以三层网络(输入 → 隐藏 → 输出)为例:
\[
\mathbf{z}^{[1]} = \mathbf{W}^{[1]} \mathbf{x} + \mathbf{b}^{[1]},
\quad \mathbf{a}^{[1]} = g(\mathbf{z}^{[1]})
\]
\[
\mathbf{z}^{[2]} = \mathbf{W}^{[2]} \mathbf{a}^{[1]} + \mathbf{b}^{[2]},
\quad \hat{\mathbf{y}} = \sigma(\mathbf{z}^{[2]})
\]
最终,预测值 \(\hat{\mathbf{y}}\) 与真实标签 \(\mathbf{y}\) 之间的差异由损失函数衡量:
\[
\text{MSE: } J = \frac{1}{2m} \sum_{i=1}^{m} \|\hat{\mathbf{y}}^{(i)} - \mathbf{y}^{(i)}\|^2,
\qquad
\text{交叉熵: } J = -\frac{1}{m} \sum_{i=1}^{m} \mathbf{y}^{(i)\top} \log\hat{\mathbf{y}}^{(i)}
\]
关键思想:前向传播将网络的每一层视为一次矩阵乘法和非线性变换的复合。整个网络就是这些层叠函数拼接而成的一个大型参数化函数 \(f_\theta(\mathbf{x})\),其中 \(\theta = \{\mathbf{W}^{[1]}, \mathbf{b}^{[1]}, \ldots\}\) 为全部可学习参数。
反向传播
反向传播(Back-Propagation)是计算损失函数对各层参数梯度的算法。其核心是链式法则:从输出层开始,误差信号逐层向前传递,依次计算每层参数对损失的影响。
定义输出层误差:\(\boldsymbol{\delta}^{[L]} = \frac{\partial J}{\partial \mathbf{z}^{[L]}} = \hat{\mathbf{y}} - \mathbf{y}\)(对于 MSE + Sigmoid 输出层),然后逐层向前递推:
\[
\boldsymbol{\delta}^{[l]} = \left( \mathbf{W}^{[l+1]\top} \boldsymbol{\delta}^{[l+1]} \right) \odot g'(\mathbf{z}^{[l]})
\]
由 \(\boldsymbol{\delta}^{[l]}\) 得到各层参数的梯度:
\[
\frac{\partial J}{\partial \mathbf{W}^{[l]}} = \frac{1}{m} \boldsymbol{\delta}^{[l]} \mathbf{a}^{[l-1]\top},
\qquad
\frac{\partial J}{\partial \mathbf{b}^{[l]}} = \frac{1}{m} \sum \boldsymbol{\delta}^{[l]}
\]
得到梯度后,利用梯度下降法更新参数:
\[
\mathbf{W}^{[l]} := \mathbf{W}^{[l]} - \eta \frac{\partial J}{\partial \mathbf{W}^{[l]}},
\qquad
\mathbf{b}^{[l]} := \mathbf{b}^{[l]} - \eta \frac{\partial J}{\partial \mathbf{b}^{[l]}}
\]
其中 \(\eta\) 为学习率,控制每次更新的步长。整个过程反复迭代(前向 → 反向 → 更新),直至损失收敛。
算法步骤
- 前向传播:逐层计算 \(\mathbf{z}^{[l]}, \mathbf{a}^{[l]}\),最终得到损失 \(J\)。
- 逐层反向:从输出层开始,计算 \(\boldsymbol{\delta}^{[L]}\),然后递推 \(\boldsymbol{\delta}^{[l-1]}, \ldots, \boldsymbol{\delta}^{[1]}\)。
- 计算梯度:利用 \(\boldsymbol{\delta}^{[l]}\) 和缓存的前向激活值 \(\mathbf{a}^{[l-1]}\) 计算 \(\nabla_{\mathbf{W}^{[l]}}J\) 和 \(\nabla_{\mathbf{b}^{[l]}}J\)。
- 参数更新:利用优化器(如下文所述)更新所有权值和偏置。
- 重复迭代直至收敛。
激活函数
激活函数为神经网络引入非线性表达能力。没有激活函数(或使用线性激活),无论多少层网络本质上都等价于一个线性变换。以下是四种常用激活函数,点击按钮切换查看。
\( \sigma(x) = \dfrac{1}{1 + e^{-x}} \)
\( \sigma\,'(x) = \sigma(x)(1 - \sigma(x)) \)
优点:输出范围 (0, 1),平滑可导,适合二分类输出层。
缺点:输入绝对值较大时导数值趋近于 0,易导致梯度消失。
优化器
优化器决定了如何使用梯度来更新参数。普通 SGD 只沿当前梯度方向下降,而更先进的优化器引入动量、自适应学习率等机制,显著提升收敛速度和稳定性。
\[ v_t = \beta v_{t-1} + (1 - \beta) \nabla J(\theta_t) \]
\[ \theta_{t+1} = \theta_t - \eta \, v_t \]
在 SGD 基础上引入动量项 \(v_t\)(通常 \(\beta = 0.9\)),累积历史梯度方向,加速收敛并减少震荡。
学习率调度器
固定的学习率往往难以兼顾初期的快速收敛与后期的精细调优。学习率调度器在训练过程中动态调整学习率,通常随着训练推进逐步衰减。点击按钮切换查看不同调度策略。
\( \eta_t = \eta_0 \cdot \gamma^{\lfloor t / \text{step} \rfloor} \)
每间隔 step 个 epoch,学习率乘以衰减因子 \(\gamma\)(图上 \(\gamma = 0.5\),step = 30)。