Lecture 11: Neural Networks 1(前向传播与基础架构)
Lecture 11: Neural Networks 1(前向传播与基础架构)
概述
本讲把“神经元”概念形式化:神经网络是多层非线性函数的复合,每一层是“线性变换 + 非线性激活”。讲清楚前向传播(forward propagation)如何把输入变换为输出、为什么需要非线性激活、如何向量化实现,以及逻辑回归如何作为“单神经元”特例嵌入框架。
核心概念与数学直觉
- 从逻辑回归到神经网络:逻辑回归 $h = g(\theta^T x)$ 是一个“单神经元”:输入 $x$ → 线性加权 $\theta^T x$ → 非线性压缩 $g$。神经网络 = 多个这样的神经元分层堆叠:前一层的输出作为后一层的输入。
- 直观解释:第 1 层神经元学习“低级特征”(如像素边缘),第 2 层组合成“中级特征”(如形状),更高层组合成“高级概念”(如人脸)——特征的层级化自动学习,无需手工特征工程。
- 数学形式(前向传播):设 $a^{[0]} = x$,对层 $l = 1..L$:
$z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}, \qquad a^{[l]} = g^{[l]}(z^{[l]})$- $W^{[l]}$:第 $l$ 层权重矩阵(行=该层神经元数,列=上一层神经元数)。
- $b^{[l]}$:偏置向量;$z^{[l]}$:线性组合(pre-activation)。
- $g^{[l]}$:激活函数(非线性);$a^{[l]}$:该层输出(activation)。
- 为什么必须非线性:若所有 $g$ 都是恒等(线性),多层复合仍是线性函数 $W_{total} x$——深层毫无意义。非线性激活使网络能表达任意复杂函数(通用逼近定理:足够宽的单隐层网络可逼近任意连续函数)。
常见激活函数: | 激活 | 公式 | 输出范围 | 特点 | |—|—|—|—| | Sigmoid | $\sigma(z) = \frac{1}{1+e^{-z}}$ | $(0,1)$ | 历史经典;饱和区梯度消失;输出非零中心 | | tanh | $\tanh(z)$ | $(-1,1)$ | 零中心;仍会饱和 | | ReLU | $\max(0, z)$ | $[0,\infty)$ | 计算快、缓解梯度消失;负数侧梯度为 0(死亡神经元) | | Leaky ReLU | $\max(0.01z, z)$ | $\mathbb{R}$ | 缓解死亡神经元 | | Softmax(输出层) | $\frac{e^{z_j}}{\sum_k e^{z_k}}$ | 概率分布 | 多分类输出层 |
- 输出层与损失的选择(GLM 思想的延续):
- 回归 → 线性输出 + MSE(或 Huber)。
- 二分类 → Sigmoid 输出 + 交叉熵。
- 多分类 → Softmax 输出 + 交叉熵。
- 直觉:输出层激活函数 + 损失函数 = 对 $y$ 分布假设的体现(呼应 L4 的 GLM 框架)。
- 向量化与批处理:把 $m$ 个样本堆成矩阵 $X$($n \times m$),一层计算 $Z^{[l]} = W^{[l]} A^{[l-1]} + b^{[l]}$——利用 BLAS 并行。批处理 (mini-batch) 是内存与梯度噪声的平衡点。
- 网络容量与过拟合:宽度(每层神经元数)、深度、激活类型都是容量旋钮——容量大则易过拟合,配 Dropout/权重衰减等正则化(L12/L13 展开)。
算法伪代码与逻辑解说:前向传播(向量化)
伪代码
输入:
- 输入 X(n×m,n 特征,m 样本)
- 网络参数 {W^[l], b^[l]}_{l=1..L},激活函数 g^[l]
输出:
- 每层激活 A^[l],最终预测 A^[L](即 h)
1. A^[0] = X
2. 对 l = 1..L:
2.1 Z^[l] = W^[l] @ A^[l-1] + b^[l] // 线性变换(广播加偏置)
2.2 A^[l] = g^[l](Z^[l]) // 逐元素非线性
3. 返回 A^[1], ..., A^[L]
【算法逻辑解说】
- Step 2.1:
W^[l] @ A^[l-1]是矩阵乘法——第 $l$ 层的每个神经元对上一层所有输出做加权和。偏置 $b$ 按列广播。 - Step 2.2:激活逐元素施加。注意必须在每层施加非线性(除纯线性回归输出层)。
- 缓存中间量:前向传播中要保存每层的 $Z^{[l]}, A^{[l]}$——反向传播(L12)需要它们计算梯度。这是“前向是后向的燃料”。
- 维度检查:$W^{[l]} \in \mathbb{R}^{n_l \times n_{l-1}}$、$Z^{[l]}, A^{[l]} \in \mathbb{R}^{n_l \times m}$——每步检查形状是调试神经网络的第一要务。
- 数值稳定性:Softmax + 交叉熵应使用 log-sum-exp 融合实现,避免中间指数溢出。
关键要点
- 神经网络 = 分层复合“线性 + 非线性”;非线性激活是表达能力的来源。
- 前向传播 = 从输入到输出的逐层变换;中间激活必须缓存供反向传播使用。
- 输出层激活 + 损失函数 = 对标签分布的假设(GLM 原则的延伸)。
- 向量化(矩阵乘法)与 mini-batch 是训练效率的根本。
- 容量(宽/深)是过拟合风险源——正则化手段随后登场。
常见误区与注意事项
- 输出层误用 Sigmoid 做多分类:多分类要用 Softmax(输出为合法概率分布);Sigmoid 是逐元素的,不保证和为 1。
- 回归问题输出层加 Sigmoid/ReLU:回归要求输出任意实数——输出层应为线性激活。
- 初始化全零权重:对称性导致所有神经元学到相同特征(“对称破缺”失败)——需随机初始化(如 He/Xavier)。
- ReLU 死亡:学习率过大或初始化不当,神经元输出恒为负 → 梯度恒 0 → 永不复活。用 Leaky ReLU 或合理初始化/学习率。
- 忽略输入标准化:大数值输入使 $z$ 进入激活饱和区、梯度消失——标准化输入(均值 0 方差 1)是标配。
思考题
- 问题:为什么两层线性激活的网络等价于单层线性模型?
- 答案:$a^{[2]} = W^{[2]}(W^{[1]}x + b^{[1]}) + b^{[2]} = (W^{[2]}W^{[1]})x + (W^{[2]}b^{[1]} + b^{[2]})$——仍为 $W^{\prime}x + b^{\prime}$ 形式,无表达力增益。只有非线性激活才能让深度有意义。
- 问题:通用逼近定理说单隐层网络可逼近任意连续函数,那为什么还要深度?
- 答案:宽度大但浅的网络参数效率低(需要指数级神经元逼近某些函数);深度网络通过层级特征复用以多项式级参数表达复杂函数,且泛化更好(结构先验:组合性)。实践中深而窄通常优于浅而巨宽。
- 问题:为什么 tanh 通常优于 Sigmoid 作隐藏层激活(除了梯度消失更缓)?
- 答案:tanh 输出零中心 $(-1,1)$——后一层输入的均值接近 0,梯度更新更对称、收敛更快;Sigmoid 输出恒正 $(0,1)$,导致权重梯度方向一致(全正/全负),zigzag 式更新。
