33 深度神经网络中的前向传播(Forward Propagation in a Deep Network)
33 深度神经网络中的前向传播(Forward Propagation in a Deep Network)
一、核心目标
- 理解如何在 L 层深度神经网络 中执行 前向传播(Forward Propagation)
- 掌握 单个样本 与 整个训练集(向量化) 两种情况下的计算方式
- 明确为何在实现中 必须使用 for 循环(无法完全向量化层间计算)
二、符号约定(Notation)
| 符号 | 含义 |
|---|---|
| $L$ | 神经网络的总层数(不包括输入层) |
| $x$ 或 $a^{[0]}$ | 输入特征向量(第 0 层激活值) |
| $a^{[l]}$ | 第 $l$ 层的激活输出(列向量) |
| $z^{[l]}$ | 第 $l$ 层的线性组合结果(未激活) |
| $W^{[l]}$ | 第 $l$ 层的权重矩阵 |
| $b^{[l]}$ | 第 $l$ 层的偏置向量 |
| $g^{[l]}(\cdot)$ | 第 $l$ 层的激活函数(如 ReLU、sigmoid 等) |
💡 注意:输入 $x = a^{[0]}$,这是统一表达式的关键。
三、单个训练样本的前向传播
对于一个输入样本 $x = a^{[0]} \in \mathbb{R}^{n^{[0]}}$,逐层计算如下:
对于每一层 $l = 1, 2, \dots, L$:
\[\begin{aligned} z^{[l]} &= W^{[l]} a^{[l-1]} + b^{[l]} \\ a^{[l]} &= g^{[l]}(z^{[l]}) \end{aligned}\]- 最终输出为 $\hat{y} = a^{[L]}$
- 每一层的计算依赖于前一层的激活值
✅ 示例(4 层网络):
- $z^{[1]} = W^{[1]} x + b^{[1]},\quad a^{[1]} = g^{[1]}(z^{[1]})$
- $z^{[2]} = W^{[2]} a^{[1]} + b^{[2]},\quad a^{[2]} = g^{[2]}(z^{[2]})$
- …
- $z^{[4]} = W^{[4]} a^{[3]} + b^{[4]},\quad \hat{y} = a^{[4]} = g^{[4]}(z^{[4]})$
四、向量化:对整个训练集进行前向传播
设训练集有 $m$ 个样本,将所有输入按列堆叠成矩阵:
\[X = A^{[0]} = \begin{bmatrix} | & | & & | \\ x^{(1)} & x^{(2)} & \cdots & x^{(m)} \\ | & | & & | \end{bmatrix} \in \mathbb{R}^{n^{[0]} \times m}\]同样地,定义:
- $Z^{[l]} = \begin{bmatrix} z^{[l]!(1)} & z^{[l]!(2)} & \cdots & z^{[l]!(m)} \end{bmatrix}$
- $A^{[l]} = \begin{bmatrix} a^{[l]!(1)} & a^{[l]!(2)} & \cdots & a^{[l]!(m)} \end{bmatrix}$
则向量化前向传播公式为:
对于 $l = 1$ 到 $L$:
\[\begin{aligned} Z^{[l]} &= W^{[l]} A^{[l-1]} + b^{[l]} \\ A^{[l]} &= g^{[l]}(Z^{[l]}) \end{aligned}\]其中:
- $b^{[l]}$ 是一个列向量,但在实际计算中会通过 广播(broadcasting) 自动扩展为与 $Z^{[l]}$ 同维的矩阵
- 最终预测结果为 $\hat{Y} = A^{[L]} \in \mathbb{R}^{n^{[L]} \times m}$
🔍 关键点:
虽然样本维度 $m$ 被向量化了,但 层与层之间仍需逐层计算,因此 无法避免 for 循环
五、为何必须使用 for 循环?
- 每一层的计算 依赖前一层的输出($A^{[l]}$ 依赖 $A^{[l-1]}$)
- 这种 顺序依赖性 决定了无法像样本维度那样一次性向量化所有层
- 因此,在实现深度网络时,外层 for 循环(遍历层数 $l = 1$ 到 $L$ )是不可避免且合理的
✅ 结论:
“在前向传播中使用 for 循环遍历网络层数,是标准且高效的做法。”
六、调试建议:关注矩阵维度
为避免 bug,强烈建议在纸上手动验证每一步的矩阵维度:
- $W^{[l]} \in \mathbb{R}^{n^{[l]} \times n^{[l-1]}}$
- $b^{[l]} \in \mathbb{R}^{n^{[l]} \times 1}$
- $A^{[l-1]} \in \mathbb{R}^{n^{[l-1]} \times m}$
- ⇒ $Z^{[l]} = W^{[l]} A^{[l-1]} + b^{[l]} \in \mathbb{R}^{n^{[l]} \times m}$
确保维度匹配是实现正确性的关键!
七、总结要点
| 项目 | 内容 |
|---|---|
| 核心思想 | 前向传播 = 逐层线性变换 + 激活函数 |
| 单样本公式 | $z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]},\quad a^{[l]} = g(z^{[l]})$ |
| 向量化公式 | $Z^{[l]} = W^{[l]} A^{[l-1]} + b^{[l]},\quad A^{[l]} = g(Z^{[l]})$ |
| 输入表示 | $x = a^{[0]} = A^{[0]}$ |
| 输出表示 | $\hat{y} = a^{[L]},\quad \hat{Y} = A^{[L]}$ |
| 是否可全向量化? | ❌ 不可;层间依赖需 for 循环 |
| 调试技巧 | 手动检查每一步矩阵维度 |
本文由作者按照 CC BY 4.0 进行授权