Lecture 11: Neural Networks 1(前向传播与基础架构)

目录 · ← l10 · l12 →

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]

【算法逻辑解说】

  1. Step 2.1W^[l] @ A^[l-1] 是矩阵乘法——第 $l$ 层的每个神经元对上一层所有输出做加权和。偏置 $b$ 按列广播。
  2. Step 2.2:激活逐元素施加。注意必须在每层施加非线性(除纯线性回归输出层)。
  3. 缓存中间量:前向传播中要保存每层的 $Z^{[l]}, A^{[l]}$——反向传播(L12)需要它们计算梯度。这是“前向是后向的燃料”。
  4. 维度检查:$W^{[l]} \in \mathbb{R}^{n_l \times n_{l-1}}$、$Z^{[l]}, A^{[l]} \in \mathbb{R}^{n_l \times m}$——每步检查形状是调试神经网络的第一要务。
  5. 数值稳定性:Softmax + 交叉熵应使用 log-sum-exp 融合实现,避免中间指数溢出。

关键要点

  1. 神经网络 = 分层复合“线性 + 非线性”;非线性激活是表达能力的来源。
  2. 前向传播 = 从输入到输出的逐层变换;中间激活必须缓存供反向传播使用。
  3. 输出层激活 + 损失函数 = 对标签分布的假设(GLM 原则的延伸)。
  4. 向量化(矩阵乘法)与 mini-batch 是训练效率的根本。
  5. 容量(宽/深)是过拟合风险源——正则化手段随后登场。

常见误区与注意事项

  • 输出层误用 Sigmoid 做多分类:多分类要用 Softmax(输出为合法概率分布);Sigmoid 是逐元素的,不保证和为 1。
  • 回归问题输出层加 Sigmoid/ReLU:回归要求输出任意实数——输出层应为线性激活。
  • 初始化全零权重:对称性导致所有神经元学到相同特征(“对称破缺”失败)——需随机初始化(如 He/Xavier)。
  • ReLU 死亡:学习率过大或初始化不当,神经元输出恒为负 → 梯度恒 0 → 永不复活。用 Leaky ReLU 或合理初始化/学习率。
  • 忽略输入标准化:大数值输入使 $z$ 进入激活饱和区、梯度消失——标准化输入(均值 0 方差 1)是标配。

思考题

  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}$ 形式,无表达力增益。只有非线性激活才能让深度有意义。
  2. 问题:通用逼近定理说单隐层网络可逼近任意连续函数,那为什么还要深度?
    • 答案:宽度大但浅的网络参数效率低(需要指数级神经元逼近某些函数);深度网络通过层级特征复用以多项式级参数表达复杂函数,且泛化更好(结构先验:组合性)。实践中深而窄通常优于浅而巨宽。
  3. 问题:为什么 tanh 通常优于 Sigmoid 作隐藏层激活(除了梯度消失更缓)?
    • 答案:tanh 输出零中心 $(-1,1)$——后一层输入的均值接近 0,梯度更新更对称、收敛更快;Sigmoid 输出恒正 $(0,1)$,导致权重梯度方向一致(全正/全负),zigzag 式更新。