Tensor Lab · SimLabs Visual

张量 Tensor 可视化实验室

“张量”这个词听起来像高等数学,但在深度学习里,它最常见的含义其实很朴素:一个带有多个轴的数值容器。标量是 0 阶张量,向量是 1 阶,矩阵是 2 阶,到了 3 阶及以上,就可以自然地表示批次、时间步、通道、头数、位置、隐藏维等更复杂结构。

先看 rank 和 shape 再看索引和切片 最后看常见操作

先把“张量”看成不同维度的数据盒子

点击下面的阶数按钮。你会看到:张量并不是另一种神秘对象,而是“数组维度继续往上长”之后的自然延续。理解了 rank 和 shape,你就已经抓住了一大半。

张量外观
一个很实用的记忆法: rank 说的是“有几个轴”,shape 说的是“每个轴有多长”。比如 [batch, seq, hidden] = [2, 4, 8],就是一个 3 阶张量。

自己搭一个 3D 张量,点一个元素看看它在哪里

下面这个实验把 3D 张量拆成了“多个切片矩阵”。你可以改 shape、切换语义预设、选择切片,再点击某个元素看它的坐标、值和在展平顺序中的位置。

轴 0

最外层轴。它常常表示 batch、head 或 channel。

长度 2

轴 1

中间轴。它常表示 token 序列、行数或高度。

长度 3

轴 2

最里层轴。它常表示 hidden dim、列数或宽度。

长度 4
切片视图
当前选中的元素

4 个最常见的张量操作,直接看数据怎么变

这部分不是公式堆砌,而是把深度学习里最常见的张量操作拆成你能直接观察的过程。每个实验都保留了“操作前”和“操作后”的可视化对照。

1. Reshape:只改外形,不改元素总数

你可以把同一组数据重排成不同 shape,但元素总数和顺序不会变。

原始形状 [3, 4]

目标形状

2. Transpose:交换轴的位置

在二维矩阵里,转置最直观的效果是“行变列,列变行”。点击左侧任意元素,看它在转置后的新坐标。

原矩阵 X

转置后 XT

3. Reduce:沿着某个轴做汇总

深度学习里经常会沿某个轴做 summean。点击右侧结果矩阵中的任意格子,左侧会高亮它来自哪些原始元素。

原始 3D 张量

汇总后

参与当前汇总的原始元素 当前结果单元

4. Broadcast:让小 shape 自动扩展去参与运算

Broadcast 最常见的用法,就是把一个偏置向量加到矩阵的每一行上。你可以调每一维偏置,看结果如何联动变化。

bias[0]

2

bias[1]

0

bias[2]

-2

bias[3]

3

矩阵 A

偏置向量 b

A + b

在大模型里,常见 shape 大概长这样

输入表示

[batch, seq, hidden]

一批句子,每个句子有若干 token,每个 token 又有隐藏维向量。这是 Transformer 里最常见的主干形状之一。

注意力得分

[batch, heads, query_len, key_len]

每个 head 都会产出一张“query 看 key”的分数表,所以它天然是更高维的张量。

分类或下一个 token 概率

[batch, vocab][batch, seq, vocab]

输出层常常要给出对整个词表的打分,所以最后一维很大。

多模态输入

[batch, channel, height, width]

图像、视频和音频的输入张量通常会带有更多空间或时间维度,本质还是“多轴数组”。

核心直觉: 只要你能先说清楚“每个轴分别表示什么”,读模型 shape 就会轻松很多。很多报错看上去复杂,其实都是 shape 不匹配。

概念介绍与相关公式

概念 1:张量的阶与形状

一个张量可以记作 X。如果它有 r 个轴,我们常说它是 r 阶张量;它的 shape 记作 (d1, d2, ..., dr)

rank(X) = r shape(X) = (d1, d2, ..., dr) 元素总数 = d1 × d2 × ... × dr

概念 2:索引一个元素

张量里的单个元素需要用多个下标来定位。比如 3 阶张量的一个元素可以写成 x[i, j, k]

X[i1, i2, ..., ir] 是一个具体元素 0 <= ik < dk

概念 3:reshape

reshape 只改变“怎么看这些数”,不改变元素值和元素总数。因此 reshape 前后的总元素数必须完全相等。

d1 × d2 × ... × dr = d'1 × d'2 × ... × d's reshape: X -> Y

概念 4:transpose / permute

transpose 的本质是交换轴顺序。二维时最直观:行列互换。更高维时则是更一般的轴置换。

二维:Y[j, i] = X[i, j] 更一般:permute 会重新排列轴顺序

概念 5:reduce

沿某一轴做求和或平均,就是把那一轴“压掉”。这也是池化、loss 汇总、batch 平均里常见的操作。

sum: Y[...] = Σj X[..., j, ...] mean: Y[...] = (1 / n) × Σj X[..., j, ...]

概念 6:broadcast

broadcast 允许更小 shape 的张量在满足规则时自动扩展去参与运算。最常见情形之一,就是向量加到矩阵每一行。

如果某一维相等,或其中一方该维为 1,则可广播 Z = X + b, b 的 shape 可以是 [d]
一句话总结: 张量不是“比矩阵更可怕的东西”,它只是把“带轴的数据结构”继续推广到了更高维。只要抓住 rank、shape、索引、轴操作 这几个关键点,很多深度学习代码就会一下子清楚很多。

张量的标准介绍与通俗介绍

标准介绍:数学里的张量

更严格地说,张量不是“很多数字随便堆在一起”,而是一类在坐标变换下满足特定变换规律的数学对象。在线性代数和微分几何里,它常被看成一种多线性映射,也可以写成带多个上标、下标的分量对象。

如果只看深度学习里最常用的工程表示,我们常把一个张量写成 X ∈ R^(d1 × d2 × ... × dr),表示它是一个 shape 为 (d1, d2, ..., dr) 的实数张量。

工程中常写: X ∈ R^(d1 × d2 × ... × dr) 更严格的数学写法之一: T : V1 × V2 × ... × Vr -> R 如果写成分量形式,常见记法是: T[i1, i2, ..., ir]

标准介绍:为什么“高维数组”只是工程近似

在机器学习代码里,把张量当成“高维数组”几乎总是够用,所以大家会直接说 Tensor 就是多维数组。但从更严格的数学角度看,真正重要的不只是它有多少维,而是它在不同基底或坐标系之间变换时,分量如何一起变化。

也就是说,高维数组是张量最常见、最容易操作的“存储形式”;而张量本身更强调一种结构和规则。

二维矩阵只是张量的一个特例 向量、矩阵、更高维数组都可以作为张量的分量表示 深度学习里常直接把: Tensor ≈ 带 shape 的多维数值容器

通俗介绍:把张量理解成“带标签的数字仓库”

如果完全不从抽象数学出发,最容易理解的方法是把张量想成一个“数字仓库”。仓库里装着很多数,每一层标签都在回答一个问题:这是第几个样本?第几个 token?第几个通道?第几个隐藏维?

一旦这些轴标签说清楚了,张量就不神秘了。你看到的不是一团数字,而是“按多个维度组织起来的数据”。

例如: X[batch, seq, hidden] 可以读成: 第几个样本 × 第几个位置 × 第几个特征

通俗介绍:从点、线、表,到数据立方体

一个数,是标量;一排数,是向量;一张表,是矩阵;很多张表按新方向叠起来,就是更高阶张量。你也可以把它想成 Excel 表不断“再加一个维度”:先有行和列,再加上批次、时间、头数、通道,就变成张量了。

所以张量并不是一种和向量、矩阵完全不同的怪东西,而是它们的自然推广。

0 阶:x 1 阶:[x1, x2, ..., xn] 2 阶:X[i, j] 3 阶:X[i, j, k] n 阶:X[i1, i2, ..., in]
把两种说法对齐: 在数学上,张量强调“多线性结构和变换规则”;在深度学习工程里,张量通常就是“带 shape 的多维数组”。写代码时你大多数时候用的是后者,但理解概念边界时,知道前者会更严谨。
通俗地说: 张量就是“按多个轴组织起来的一堆数字”。标准地说: 张量是一类可以用多维分量表示、并满足特定变换规律的数学对象。深度学习把这两件事连接起来了:我们一边把它当多维数组来算,一边用它承载更高维的数据结构。