34 正确设置矩阵维度
🎯 课程核心目标
在实现深度神经网络时,确保各层权重 $W^{[l]}$ 、偏置 $b^{[l]}$ 、激活值 $a^{[l]}$ 、线性输出 $z^{[l]}$ 等变量的维度正确,是避免 bug、调试代码的关键技巧。本节重点讲解如何通过手算维度来验证前向传播(forward propagation)中的矩阵运算是否合理。
🔢 符号约定与网络结构
- 总层数(不含输入层):$L = 5$
各层神经元数量:
- 输入层:$n_0 = n_x = 2$
- 隐藏层1:$n_1 = 3$
- 隐藏层2:$n_2 = 5$
- 隐藏层3:$n_3 = 4$
- 隐藏层4:$n_4 = 2$
- 输出层:$n_5 = 1$
注:一般记第 $l$ 层的神经元数为 $n_l$,其中 $l = 0, 1, \dots, L$,$l=0$ 为输入层。
📐 单样本前向传播的维度分析(非向量化)
对单个训练样本 $x \in \mathbb{R}^{n_0 \times 1}$,前向传播公式为:
\[z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}, \quad a^{[l]} = g^{[l]}(z^{[l]})\]✅ 权重矩阵 $W^{[l]}$ 的维度
为了使矩阵乘法合法且结果维度匹配:
\[z^{[l]} \in \mathbb{R}^{n_l \times 1}, \quad a^{[l-1]} \in \mathbb{R}^{n_{l-1} \times 1}\]必须有:
\[W^{[l]} \in \mathbb{R}^{n_l \times n_{l-1}}\]通用规则:
\[\boxed{W^{[l]} \text{ 的维度是 } (n_l, n_{l-1})}\]
示例:
- $W^{[1]}$: $3 \times 2$
- $W^{[2]}$: $5 \times 3$
- $W^{[3]}$: $4 \times 5$
- $W^{[4]}$: $2 \times 4$
- $W^{[5]}$: $1 \times 2$
✅ 偏置向量 $b^{[l]}$ 的维度
由于 $z^{[l]} = W^{[l]} a^{[l-1]} + b^{[l]}$,且 $z^{[l]} \in \mathbb{R}^{n_l \times 1}$,所以:
\[b^{[l]} \in \mathbb{R}^{n_l \times 1}\]通用规则:
\[\boxed{b^{[l]} \text{ 的维度是 } (n_l, 1)}\]
✅ 激活值 $a^{[l]}$ 与 $z^{[l]}$ 的维度
因为激活函数 $g^{[l]}$ 是逐元素应用的:
\[a^{[l]} = g^{[l]}(z^{[l]}) \Rightarrow a^{[l]} \text{ 与 } z^{[l]} \text{ 维度相同}\]即:
\[a^{[l]}, z^{[l]} \in \mathbb{R}^{n_l \times 1}\]特别地,输入层:$a^{[0]} = x \in \mathbb{R}^{n_0 \times 1}$
🧮 向量化实现(处理 m 个样本)
设训练集有 $m$ 个样本,则将所有样本按列堆叠:
- 输入矩阵:$X = [x^{(1)}, x^{(2)}, \dots, x^{(m)}] \in \mathbb{R}^{n_0 \times m}$
- 第 $l$ 层的激活矩阵:$A^{[l]} = [a^{[l]!(1)}, \dots, a^{[l]!(m)}] \in \mathbb{R}^{n_l \times m}$
- 同理:$Z^{[l]} \in \mathbb{R}^{n_l \times m}$
前向传播变为:
\[Z^{[l]} = W^{[l]} A^{[l-1]} + b^{[l]}\]✅ 向量化下的维度规则
| 变量 | 维度 |
|---|---|
| $W^{[l]}$ | $(n_l, n_{l-1})$ ← 不变 |
| $b^{[l]}$ | $(n_l, 1)$ ← 不变 |
| $A^{[l-1]}$ | $(n_{l-1}, m)$ |
| $Z^{[l]}$, $A^{[l]}$ | $(n_l, m)$ |
⚠️ 注意:虽然 $b^{[l]}$ 是 $(n_l, 1)$,但在 Python/Numpy 中会通过 广播机制(broadcasting) 自动扩展为 $(n_l, m)$,从而与 $W^{[l]} A^{[l-1]}$ 相加。
🔁 反向传播中的维度一致性
在实现反向传播时,梯度的维度应与原变量一致:
- $dW^{[l]}$ 与 $W^{[l]}$ 维度相同:$(n_l, n_{l-1})$
- $db^{[l]}$ 与 $b^{[l]}$ 维度相同:$(n_l, 1)$
- $dZ^{[l]}$, $dA^{[l]}$ 与 $Z^{[l]}$, $A^{[l]}$ 维度相同:$(n_l, m)$
✅ 重要原则:
梯度的形状必须与对应参数/激活值完全一致,这是调试反向传播是否正确的黄金法则。
🛠 调试建议(吴恩达亲授)
“当我实现深度神经网络时,最常用的调试工具之一就是拿出一张纸,手动推导每一层的矩阵维度。”
- 在写代码前,先手写各层 $n_l$
- 根据公式推导 $W^{[l]}$, $b^{[l]}$, $Z^{[l]}$, $A^{[l]}$ 的预期维度
- 编程时用
print(shape)或断言(assert)验证 - 若维度不匹配,99% 是索引或转置错误
📌 总结:关键公式速查表
| 变量 | 单样本维度 | 向量化维度(m 样本) |
|---|---|---|
| $W^{[l]}$ | $(n_l, n_{l-1})$ | $(n_l, n_{l-1})$ |
| $b^{[l]}$ | $(n_l, 1)$ | $(n_l, 1)$ |
| $z^{[l]}$, $a^{[l]}$ | $(n_l, 1)$ | $(n_l, m)$ |
| $x$, $a^{[0]}$ | $(n_0, 1)$ | $(n_0, m)$ |
| $dW^{[l]}$ | $(n_l, n_{l-1})$ | $(n_l, n_{l-1})$ |
| $db^{[l]}$ | $(n_l, 1)$ | $(n_l, 1)$ |
💡 学习建议
- 动手练习:画一个 3 层网络(如 $n_0=4, n_1=5, n_2=3, n_3=1$),写出所有 $W, b, Z, A$ 的维度。
- 编程验证:在 NumPy 中随机生成符合维度的矩阵,测试前向传播是否报错。
牢记口诀:
“W 的行 = 当前层神经元数,W 的列 = 上一层神经元数”