跳到主要内容

神经网络分类原理

多层神经网络本质上是仿射变换与非线性激活函数的堆叠。引入非线性激活,使得网络能够拟合单个逻辑回归单元无法表达的复杂决策边界。

单隐藏层模型

给定输入向量 xx,隐藏层权重 W(1)W^{(1)} 与偏置 b(1)b^{(1)},输出层权重 W(2)W^{(2)} 与偏置 b(2)b^{(2)},前向传播过程如下:

z(1)=W(1)x+b(1),a(1)=ϕ(z(1)),z(2)=W(2)a(1)+b(2),y^=σ(z(2)).\begin{aligned} z^{(1)} &= W^{(1)}x+b^{(1)},\\ a^{(1)} &= \phi\left(z^{(1)}\right),\\ z^{(2)} &= W^{(2)}a^{(1)}+b^{(2)},\\ \hat y &= \sigma\left(z^{(2)}\right). \end{aligned}

其中 ϕ\phi 可以是 ReLU、GELU、tanh 等常见的隐藏层激活函数。在二分类任务中,Sigmoid 输出 y^\hat y 被解释为预测概率,通常配合二元交叉熵(Binary Cross-Entropy)损失函数进行训练:

L=[ylogy^+(1y)log(1y^)].L=-\left[y\log \hat y+(1-y)\log(1-\hat y)\right].

反向传播

反向传播的核心是利用链式法则,从损失函数向输入方向逐层计算梯度。当输出层使用 Sigmoid 且损失函数为二元交叉熵时,输出层预激活值 z(2)z^{(2)} 的梯度有一个非常简洁的形式:

δ(2)=Lz(2)=y^y.\delta^{(2)}=\frac{\partial L}{\partial z^{(2)}}=\hat y-y.

基于此,输出层的权重与偏置梯度为:

LW(2)=δ(2)(a(1))T,Lb(2)=δ(2).\frac{\partial L}{\partial W^{(2)}}=\delta^{(2)}(a^{(1)})^T, \qquad \frac{\partial L}{\partial b^{(2)}}=\delta^{(2)}.

将误差信号 δ(2)\delta^{(2)} 通过隐藏层激活函数反向传播,得到隐藏层的误差信号:

δ(1)=(W(2))Tδ(2)ϕ(z(1)),\delta^{(1)}=(W^{(2)})^T\delta^{(2)}\odot\phi'\left(z^{(1)}\right),

进而得到隐藏层的权重与偏置梯度:

LW(1)=δ(1)xT,Lb(1)=δ(1).\frac{\partial L}{\partial W^{(1)}}=\delta^{(1)}x^T, \qquad \frac{\partial L}{\partial b^{(1)}}=\delta^{(1)}.

符号 \odot 表示逐元素乘法(Elementwise Multiplication)。这里强调使用矩阵形式书写,是为了明确张量的维度形状,避免使用标量下标时产生的歧义。

参数更新

采用学习率为 α\alpha 的标准梯度下降法,每个参数 θ\theta 的更新规则为:

θθαLθ.\theta\leftarrow\theta-\alpha\frac{\partial L}{\partial\theta}.

实际工程中,训练通常基于 Mini-batch 数据,并配合 Adam 等自适应优化器。尽管优化策略有所变化,但梯度的计算逻辑始终源于同一套前向计算图与链式法则。

本文未涵盖的内容

这个小网络仅用于演示核心计算流程,不足以指导生产级架构的选择。权重初始化、归一化(Normalization)、正则化、优化器状态管理、多分类输出、数值稳定性以及数据质量,都会显著影响最终训练效果。关于更广泛的架构细节,请参阅 多层感知机笔记

张量形状与完整反向计算

输入有 dd 个特征、隐藏层有 hh 个单元时,采用列向量约定:xRdx\in\mathbb R^dW(1)Rh×dW^{(1)}\in\mathbb R^{h\times d}b(1),a(1),δ(1)Rhb^{(1)},a^{(1)},\delta^{(1)}\in\mathbb R^hW(2)R1×hW^{(2)}\in\mathbb R^{1\times h}b(2),z(2),δ(2)b^{(2)},z^{(2)},\delta^{(2)} 为标量。权重梯度应与对应矩阵同形,因此外积 δ(1)xT\delta^{(1)}x^T 的形状是 h×dh\times d

取最小数值例子:d=h=1d=h=1x=2x=2y=1y=1,使用 ReLU,即 ϕ(t)=max(0,t)\phi(t)=\max(0,t)。设 W(1)=0.5W^{(1)}=0.5b(1)=0b^{(1)}=0W(2)=1W^{(2)}=1b(2)=0b^{(2)}=0。前向计算得到 z(1)=a(1)=z(2)=1z^{(1)}=a^{(1)}=z^{(2)}=1y^0.731059\hat y\approx0.731059L0.313262L\approx0.313262。隐藏层输入为正,故 ϕ=1\phi'=1,于是

δ(2)=δ(1)0.268941,(LW(1),Lb(1),LW(2),Lb(2))(0.537883,0.268941,0.268941,0.268941).\delta^{(2)}=\delta^{(1)}\approx-0.268941,\qquad \left(\frac{\partial L}{\partial W^{(1)}},\frac{\partial L}{\partial b^{(1)}},\frac{\partial L}{\partial W^{(2)}},\frac{\partial L}{\partial b^{(2)}}\right) \approx(-0.537883,-0.268941,-0.268941,-0.268941).

α=0.1\alpha=0.1,基于同一次前向传播同时更新四个参数,按上述顺序约得到 (0.553788,0.026894,1.026894,0.026894)(0.553788,0.026894,1.026894,0.026894)。下一轮 logit 约为 1.1918751.191875,损失约为 0.2651690.265169。若先更新输出层权重再计算 δ(1)\delta^{(1)},就混用了两组参数状态,不再是这里的梯度更新。

ReLU 输入为零时不存在普通导数,实现中需指定约定,常见取值是零。在远离这类折点的小例子上,可用 [L(θ+εej)L(θεej)]/(2ε)[L(\theta+\varepsilon e_j)-L(\theta-\varepsilon e_j)]/(2\varepsilon) 检查解析梯度。它检验的是求导是否正确,不能证明训练会找到全局最优解。

优化循环能说明什么

反向传播负责计算导数,优化器负责选择参数如何变化。批次损失使用样本梯度的平均值。小批量梯度会波动,因此每一步未必降低完整训练集上的损失。与固定特征的逻辑回归不同,联合学习隐藏层和输出层权重,通常会使目标非凸。不同初始化可能进入不同的驻点区域;更新很小也可能来自学习率过小、激活饱和或 ReLU 不活跃。

训练时检查数值是否有限,设置迭代预算,观察梯度和损失,并用留出验证集决定是否提前停止。验证集早停用于限制过拟合,不是最优性证明。二元交叉熵应通过稳定的对数损失公式直接从 logit 计算。优化与泛化之间的区别详见《深度学习》第 8 章

探索关联打开关联网络