文章

24 多样本向量化(Vectorizing Across Multiple Examples)

24 多样本向量化(Vectorizing Across Multiple Examples)

1. 背景回顾:单个样本的前向传播

  在上一节课中,我们学习了如何对单个训练样本 $x^{(i)}$ 进行前向传播,计算一个含一个隐藏层的神经网络的输出 $\hat{y}^{(i)} = a^{[2]!(i)}$。其计算步骤如下:

\[\begin{aligned} z^{[1]\!(i)} &= W^{[1]} x^{(i)} + b^{[1]} \\ a^{[1]\!(i)} &= \sigma\left(z^{[1]\!(i)}\right) \\ z^{[2]\!(i)} &= W^{[2]} a^{[1]\!(i)} + b^{[2]} \\ a^{[2]\!(i)} &= \sigma\left(z^{[2]\!(i)}\right) = \hat{y}^{(i)} \end{aligned}\]

  其中:

  • $x^{(i)} \in \mathbb{R}^{n_x}$ 是第 $i$ 个训练样本;
  • $W^{[l]}$ 和 $b^{[l]}$ 是第 $l$ 层的权重和偏置;
  • $\sigma(\cdot)$ 是激活函数(如 sigmoid);
  • 上标 $[l]$ 表示第 $l$ 层,上标 $(i)$ 表示第 $i$ 个训练样本。

2. 问题:逐个处理效率低

  若共有 $m$ 个训练样本,则朴素实现需循环 $m$ 次:

1
2
3
4
for i in range(1, m+1):
    z[1](i) = W[1] @ x(i) + b[1]
    a[1](i) = sigma(z[1](i))
    ...

  这种写法计算效率低,无法利用现代硬件(如 GPU)的并行能力。


3. 解决方案:向量化(Vectorization)

  我们将所有训练样本按列堆叠成矩阵,从而一次性完成所有样本的前向传播。

3.1 数据矩阵定义

  • 输入矩阵:

    \[X = \begin{bmatrix} | & | & & | \\ x^{(1)} & x^{(2)} & \cdots & x^{(m)} \\ | & | & & | \end{bmatrix} \in \mathbb{R}^{n_x \times m}\]
  • 类似地,定义中间变量矩阵:

    \[Z^{[1]} = \begin{bmatrix} | & | & & | \\ z^{[1]\!(1)} & z^{[1]\!(2)} & \cdots & z^{[1]\!(m)} \\ | & | & & | \end{bmatrix} \in \mathbb{R}^{n^{[1]} \times m}\] \[A^{[1]} = \begin{bmatrix} | & | & & | \\ a^{[1]\!(1)} & a^{[1]\!(2)} & \cdots & a^{[1]\!(m)} \\ | & | & & | \end{bmatrix} \in \mathbb{R}^{n^{[1]} \times m}\]

关键约定

  • 水平方向(列) :不同训练样本(从左到右是样本 1 到 $m$);
  • 垂直方向(行) :不同神经元(从上到下是第 1 个到第 $n^{[l]}$ 个隐藏单元)。

4. 向量化后的前向传播公式

  将单样本公式中的小写字母(向量)替换为大写字母(矩阵),即可得到完全向量化的批量计算

\[\begin{aligned} Z^{[1]} &= W^{[1]} X + b^{[1]} \\ A^{[1]} &= \sigma\left(Z^{[1]}\right) \\ Z^{[2]} &= W^{[2]} A^{[1]} + b^{[2]} \\ A^{[2]} &= \sigma\left(Z^{[2]}\right) \end{aligned}\]

🔍 注意:这里的加法 $W^{[1]}X + b^{[1]}$ 中,$b^{[1]}$ 是一个列向量($\in \mathbb{R}^{n^{[1]} \times 1}$),但在 NumPy 等框架中会自动进行广播(broadcasting) ,将其加到每一列上,等价于对每个样本加上相同的偏置。


5. 广播机制说明(Broadcasting)

  例如,设:

  • $W^{[1]} \in \mathbb{R}^{n^{[1]} \times n_x}$
  • $X \in \mathbb{R}^{n_x \times m}$
  • $b^{[1]} \in \mathbb{R}^{n^{[1]} \times 1}$

  则:

  • $W^{[1]} X \in \mathbb{R}^{n^{[1]} \times m}$
  • $b^{[1]}$ 会被广播为 $\mathbb{R}^{n^{[1]} \times m}$,每列都是 $b^{[1]}$

  因此:

\[Z^{[1]}[:, i] = W^{[1]} x^{(i)} + b^{[1]} \quad \text{对所有 } i=1,\dots,m\]

  这正是我们想要的!


6. 总结:向量化的优势

方法是否使用循环计算效率代码简洁性是否适合 GPU
朴素实现是(for 循环)
向量化高(并行)

💡 重要提示:深度学习框架(如 TensorFlow、PyTorch)内部高度依赖此类向量化操作。掌握此技巧是写出高效、正确模型的基础。


7. 补充:符号规范回顾

符号含义
$x^{(i)}$第 $i$ 个训练样本(列向量)
$X$所有训练样本组成的矩阵($n_x \times m$)
$a^{[l]!(i)}$第 $i$ 个样本在第 $l$ 层的激活值
$A^{[l]}$所有样本在第 $l$ 层的激活矩阵($n^{[l]} \times m$)
$W^{[l]}$第 $l$ 层的权重矩阵($n^{[l]} \times n^{[l-1]}$)
$b^{[l]}$第 $l$ 层的偏置向量($n^{[l]} \times 1$)

✅ 结语

  通过将训练样本按列堆叠,并将单样本前向传播公式直接推广到矩阵形式,我们实现了无循环、高效率的批量前向传播。这一思想不仅适用于两层神经网络,也适用于更深的网络和更复杂的架构,是深度学习工程实践的核心技能之一。

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