· 线性代数 · 第 6 / 10 讲

8 · 张量与深度学习

向量是 1 维、矩阵是 2 维。深度学习里的数据经常是 3 维、4 维甚至更高——这就是张量。

向量是 1 维、矩阵是 2 维。深度学习里的数据经常是 3 维、 4 维甚至更高——这就是张量(Tensor)。本节把前面的线代升维到真实深度学习代码里的形态。


一、什么是张量

张量就是「多维数组」,阶数(轴的个数)决定维度:

名称例子
0标量一个 loss 值
1向量一个词的 embedding
2矩阵一句话(词数×embedding)
3三阶张量一批句子(batch×词数×embedding)
4四阶张量一批图像(batch×通道×高×宽)

深度学习框架(PyTorch、TensorFlow名字里的 Tensor 就是它)把所有数据都表示为张量,计算全是张量运算。

二、广播(Broadcasting)

不同形状的张量运算时,维度会自动「拉伸对齐」。比如一个 m×nm\times n 矩阵加一个长为 n 的向量,向量会被复制到每一行。这让 Wx+b\mathbf{W}\mathbf{x}+\mathbf{b} 里的偏置 b\mathbf{b} 能自动加到一整批样本上,无需写循环。

三、批量矩阵乘法(Batched Matmul)

训练时一次处理一批样本。三阶张量乘法就是「对 batch 里每一个矩阵各自做一次矩阵乘法」。Transformer 的注意力 softmax(QK/d)V\text{softmax}(\mathbf{Q}\mathbf{K}^\top/\sqrt{d})\mathbf{V} 在实现上就是多个批量矩阵乘法叠加。GPU 擅长的正是这种大规模并行的张量乘法。

四、计算图中的线代

神经网络前向传播 = 一串张量运算;反向传播求梯度,本质是链式法则 + 雅可比矩阵连乘。权重更新 WWηWL\mathbf{W}\leftarrow\mathbf{W}-\eta\,\nabla_{\mathbf{W}}L 里的梯度也是一个与 W\mathbf{W} 同形的矩阵/张量。

五、代码:从向量到批量张量

import numpy as np

# 一批 32 句话,每句 10 个词,每词 64 维 embedding
x = np.random.randn(32, 10, 64)        # 三阶张量 (batch, 词, 维)
W = np.random.randn(64, 128)           # 线性层
b = np.random.randn(128)

# 批量线性变换 + 广播加偏置
y = x @ W + b                          # 结果 (32, 10, 128)
print("输出形状 =", y.shape)

# 简化版自注意力
Q = K = V = np.random.randn(32, 10, 64)
scores = Q @ K.transpose(0, 2, 1) / np.sqrt(64)   # (32,10,10)
attn = np.exp(scores) / np.exp(scores).sum(-1, keepdims=True)
out = attn @ V                                     # (32,10,64)
print("注意力输出形状 =", out.shape)

六、动手想一想

  1. 一张 RGB 图像 224×224,用几阶张量表示?形状是什么?
  2. batch 维度为什么能大幅加速训练?跟矩阵乘法有什么关系?

答案:(1) 三阶,形状 (3, 224, 224)(通道×高×宽);加上 batch 则是四阶。(2) 把多个样本堆成一个大张量一次过,让 GPU 用一次大矩阵乘法并行完成,比逐个样本循环快很多。