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)
不同形状的张量运算时,维度会自动「拉伸对齐」。比如一个 矩阵加一个长为 n 的向量,向量会被复制到每一行。这让 里的偏置 能自动加到一整批样本上,无需写循环。
三、批量矩阵乘法(Batched Matmul)
训练时一次处理一批样本。三阶张量乘法就是「对 batch 里每一个矩阵各自做一次矩阵乘法」。Transformer 的注意力 在实现上就是多个批量矩阵乘法叠加。GPU 擅长的正是这种大规模并行的张量乘法。
四、计算图中的线代
神经网络前向传播 = 一串张量运算;反向传播求梯度,本质是链式法则 + 雅可比矩阵连乘。权重更新 里的梯度也是一个与 同形的矩阵/张量。
五、代码:从向量到批量张量
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)
六、动手想一想
- 一张 RGB 图像 224×224,用几阶张量表示?形状是什么?
- batch 维度为什么能大幅加速训练?跟矩阵乘法有什么关系?
答案:(1) 三阶,形状 (3, 224, 224)(通道×高×宽);加上 batch 则是四阶。(2) 把多个样本堆成一个大张量一次过,让 GPU 用一次大矩阵乘法并行完成,比逐个样本循环快很多。