01-全景与张量基础 入门 预计 20 分钟 ★ 最小路径

张量:深度学习的数据语言

张量(Tensor)是向量和矩阵向任意维度的推广,是深度学习框架中统一的数据容器:标量是 0 维张量,向量是 1 维,矩阵是 2 维,图像批次是 4 维,依此类推。

一句话定义

张量(Tensor)是向量和矩阵向任意维度的推广,是深度学习框架中统一的数据容器:标量是 0 维张量,向量是 1 维,矩阵是 2 维,图像批次是 4 维,依此类推。

直觉

张量像「带形状标签的多维储物柜」:一维是一排格子,二维是一面格子墙,三维是一栋格子楼。深度学习里所有东西——数据、标签、参数、梯度——都住在同一种柜子里,区别只是维度和尺寸不同。

为什么重要

深度学习中一切皆张量:输入是张量、权重是张量、梯度是张量。形状(shape)错误是初学者报错的第一大来源;看懂并主动管理张量形状,是从「跑不通示例」到「自己写模型」的分水岭。后续 kp-004 的实践、kp-007 反向传播的张量公式、kp-017 卷积的形状推导都以它为地基。

前置知识

  • kp-001(深度学习全景)。
  • 库外前置:向量的分量记号、矩阵的行列结构。

核心概念

  • 阶/维度(rank / ndim):索引所需的下标个数;一个 4 维图像批次张量的形状记作 [N, C, H, W]。
  • 形状(shape):每个维度上的大小,如 [32, 3, 224, 224] 表示 32 张 3 通道 224×224 图像。
  • 数据类型(dtype):float32 是训练默认类型,float16/bfloat16 用于混合精度(见 kp-029)。
  • 广播(broadcasting):两个形状不同的张量运算时,按「从末维对齐、维度相等或为 1 可扩展」的规则自动复制扩展。
  • 轴/维度操作:reshape(改形状不挪数据)、transpose/permute(换轴)、squeeze/unsqueeze(增删长度为 1 的轴)。
  • 张量运算三件套:逐元素运算(+、*、激活函数)、矩阵乘法 matmul(线性层本质)、归约运算(sum/mean/max 沿某轴压缩)。

原理与机制

张量运算的可微性是深度学习的底层约定:框架对每个基本运算都登记了对应的求导规则(见 kp-003),因此只要网络由可微张量运算组成,整体就可微、可训练。广播的合法性规则从末维向前逐维检查:两维相等可直接运算;其中一维为 1 则沿该维复制;否则报错。矩阵乘法 [M,K] @ [K,N] → [M,N] 要求内维(K)严格相等,这是线性层 y = xW^T + b 的形状约束来源。reshape 只改变解释方式不搬动内存的前提是元素总数不变,例如 [2,3] 与 [3,2] 都是 6 个元素。常见约定:PyTorch 图像采用 NCHW(通道在第二维),而 TensorFlow 历史上用 NHWC,跨框架移植时要显式转换轴序。

公式或模型

卷积输出形状的通用公式(kp-017 会推导),此处作为形状思维的第一例:

输出边长 = floor( (输入边长 n + 2·padding p − 核尺寸 k) / 步幅 s ) + 1

变量说明:n 为输入单边长度,k 为卷积核边长,p 为零填充圈数,s 为步幅。所有形状计算本质都是这种「维度代数」。

图示

形状 [N, C, H, W] = [2, 3, 4, 4]        (2 张 RGB 小图)
 N ── 第 0 轴:样本维(批次)
 C ── 第 1 轴:通道维(R/G/B)
 H ── 第 2 轴:高(行)
 W ── 第 3 轴:宽(列)

广播示例:  [3, 1] + [1, 4]  →  [3, 4]
            [4] + [2, 4]  →  [2, 4]   (末维 4 对 4,前面的 2 直接保留)
            [3, 4] + [4]  →  [3, 4]   (末维对齐)
            [3, 4] + [3]  →  报错     (3 对不上末维 4)

直观类比

矩阵乘法像「配对求和的流水线」:左边每个工人(行)与右边每个工人(列)握手,每次握手做一次点积。广播像「复印机」:形状为 1 的维度被自动复印到需要的大小,没有额外显存消耗(逻辑上复制、物理上复用)。

实例或案例

MNIST 手写数字数据:一张 28×28 灰度图压平后是 784 维向量,一个批次 64 张就是形状 [64, 784] 的输入张量;一个把 784 维映射到 10 类的线性层,其权重矩阵形状为 [10, 784],偏置为 [10],前向即 [64,784] @ [784,10] → [64,10],加上广播的偏置 [10]。整个 MLP 的前向传播就是四次张量运算的串联,形状全部对得上,训练报错就少一半。

常见误区

  • 把「维度」当「尺寸」:形状 [10, 20] 是 2 维(阶)张量,第一维尺寸 10、第二维尺寸 20。
  • 以为 reshape 会重排元素:它按行优先(C 序)连续读取,先想清楚元素排布再改形状。
  • 混淆 [N, H, W, C] 与 [N, C, H, W]:通道位置不同是框架间迁移的头号 bug。
  • 滥用广播导致隐式语义错误:[B,1] 与 [B,N] 相乘合法,但究竟是「逐样本缩放」还是「逐元素相乘」要写注释说清。

与其他知识点的关系

本知识点是 kp-004(动手操作)的理论版;kp-003 的计算图节点上流动的就是张量;kp-017 卷积输出公式、kp-007 反向传播的张量梯度形状(梯度与参数同形状)都依赖此处的形状思维。

自测题

  1. 形状 [32, 3, 224, 224] 的张量有几个轴?各轴含义(NCHW 约定)?

答案要点:4 轴;32 张样本、3 通道、高 224、宽 224,共 32×3×224×224 个元素。

  1. [4, 1] 与 [1, 3] 相加的广播结果形状?[4, 3] 与 [4] 呢?

答案要点:[4, 3];[4] 从末维对齐广播为 [1, 4]→ 不匹配 3,报错(注意是从末维对齐,不是首维)。

  1. 为什么线性层的权重形状必须与输入末维匹配?

答案要点:矩阵乘法要求内维相等,[B, d_in] @ [d_in, d_out] 才能得出 [B, d_out]。

延伸阅读

  • Goodfellow 等《Deep Learning》第 2 章「线性代数」,配合本 KP 建立矩阵/张量视角。
  • PyTorch 官方文档 «Tensor Views / Broadcasting semantics» 章节(按名称检索,不在本库贴链接)。

学习状态

状态保存在浏览器本地,用于首页与路径页的进度统计。