文章

34 正确设置矩阵维度

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)$

💡 学习建议

  1. 动手练习:画一个 3 层网络(如 $n_0=4, n_1=5, n_2=3, n_3=1$),写出所有 $W, b, Z, A$ 的维度。
  2. 编程验证:在 NumPy 中随机生成符合维度的矩阵,测试前向传播是否报错。
  3. 牢记口诀

    W 的行 = 当前层神经元数,W 的列 = 上一层神经元数

本文由作者按照 CC BY 4.0 进行授权