- 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
- 博主主页: @Yaoyao2024
- 往期回顾:【科研小白系列】这些基础linux命令,你都掌握了嘛?
- 每日一言🌼: “脑袋想不明白的,就用脚想”——《走吧,张小砚》🌺
0、前言——关于这个问题
在之前的学习中,我自以为我对张量、矩阵、数组,已经十分清楚。就在近期我打算再好好学习一下张量各个操作的过程极其原理的时候,才发现之前的自己或许根本没有弄清楚张量到底是个啥?
为什么呢?我发现我学习的过程中发现对张量的各个操作有种说不上来的不明白。
我问了自己很久,到底是哪一点让自己感受到这种“不舒适”的学习感?我向来是一个喜欢追根溯源,刨根问底的人。于是我问我自己这个问题
区分这两个概念:
1. 一阶张量:[x,y,z]
,形状为(3,)
2. 3阶张量,形状为(m,n,k)
这不是很明显吗?我知道,前者是一阶张量,后者是三阶。前者是向量,后者是张量。前者是一维,后者是三维…欸等等,前者不应该是三维空间中的向量吗?这个三维,和张量的三维…我感受到它们之间肯定有某种联系,或者说区别。到底是哪里不同?我要弄明白。
1. 追根溯源——张量的基本概念
张量,本身就是标量(0阶张量)、向量(一阶张量)、数组/矩阵(二阶张量)的扩展概念。
-
从0阶张量说起:0阶张量就是一个数值,具体的数值,没有维度,也就是标量。比如:温度,最大值,最小值,它们都是1个具体的数值。
-
1阶张量,也就是高中最常见的向量。比如坐标:
[x,y,z]
,就是一个向量,在坐标系上有大小和方向。但它只是一阶张量,也就是一维的。为什么?因为它本身就只表示一个三维坐标系中的一个坐标点。
1.1 张量的阶数(维度)、元素的含义
🪧 张量的维度,就是张量的秩, 代表张量的“容器结构”(有多少层嵌套)。
类似于二维数组,张量本身就是一个数据结构!!用来存储数据的!那我们就可以把它看作一个容器!
每个维度的大小不同,代表这层“容器”的“容量”(元素个数)不同。
阶数,它是张量形状元组的长度。
比如一个三维张量:形状为:(2,3,4)
。阶数为3,代表3层嵌套;每个嵌套分几个格子呢?则是每个层数(维度)的大小。
- 第一个维度大小为
2
,代表这层容器有2个格子 - 第二个维度
3
,代表这两个格子又分为3个格子 - 第三个维度为
4
,代表这个格子又分为了4个格子
到这里,容器结构描述结束,最终的这个格子里面装的就是这个张量“容器”的一个元素。
每个维度,代表的是一个“容器”,有不同的长度,长度的大代表了张量在这个维度上的”范围“,也就是容器所能容纳的“元素”个数,或者说当前容器的“格子”数。
张量的 维数+每个维度的长度/范围共同决定张量的形状、元素个数。元素是张量的基本组成单位,元素值是该元素携带的具体数值,它在不同场景下有不同的含义。
Tips:这里我们可以看到,
- 张量的秩和矩阵的秩根本不是一个元意思,可以把矩阵理解为一个二维张量,但并不等同于!
- 张量的形状,其实就是这个数据结构的形状,也就是这个容器是怎么组织的。
- 对于灰度图像这个二维张量(矩阵),它有2个维度
(H,W)
。第一个维度代表这个图像的高(有几行),W
代表了图像的宽(每行有几列)。这个张量有H×W
个元素,每个元素代表一个具体的像素,这个元素的取值代表这个像素处的灰度值。当所有元素被取值时,一个具体的张量则代表一个具体的图像。
1.2:元素的维度(几何维度)
上面我们知道了
-
张量的维度(阶数)代表它这个容器的嵌套层数,每个维度代表的是当前嵌套层所能容纳的”格子数“,或者说”元素数“
-
张量的维度 = 张量的“形状”中有几个轴(axis),即形状元组的长度。
张量的元素,在深度学习框架中我们认为是一个标量。意思是,张量这个容器的最终一个个小格子里面,装的都是一个标量。就像二维灰度图像这个正方形的一个个格子里,装的都是一个个像素值。
这里让我们推广一下-> 元素值可以从标量推广到:向量、矩阵呢?
当然是OK的,把它看作一个容器,理应来说想装什么自然是可以的。
这种事我们在学习一维数组到二维数组的时候,那些课本老师也这么说:二维数组可以:可以看作每个元素是一个一维数组的一维数组。
放在张量里面自然也是可以的呗。
比如形状为 (6,3)
的张量(元素个数为标量),我们也可以看作是具有6个元素的一维数组,每个元素又是一个一维数组,这个一维数组里面有3个标量。
假如我们取出这六个元素中的其中一个,假如它的值是:[10,7,3]
。这个元素是一个一维张量,但是它也是向量!但它是有维度的向量!
到这里,我们也距离解开问题只剩一步之遥了。
🌸如果一个向量空间的基由n个线性无关的向量组成,那么这个向量空间是n维的,其中的向量就可以说是属于n维向量空间的向量。
可以看到,向量的维度和张量的维度并不等同。这里我们把向量看作张量的一个元素值,向量的维度本身也是向量本身的数学性质,是 元素所在的几何空间维度。
当我们把[10,7,3]
理解为张量时,张量维度也确实是1,但是这里的维度代表的是张量作为一个容器的嵌套层数,此时这个张量的元素值是标量。
2.总结
最开始问题的本质涉及张量的阶(秩)和张量元素的几何空间维度的区别
1. 张量的阶(Rank/Dimensions) vs 元素的几何空间维度
概念 | 描述 | 示例 |
---|---|---|
张量的阶(秩) | 张量的“形状”中有几个轴(axis),即形状元组的长度。 | (m,n,k) 是 3阶张量(3个轴)。 |
元素的几何维度 | 张量中每个元素本身的数学性质(标量/向量/矩阵等)。 | 若元素是标量,则几何维度为 0。 |
关键区别:
- 张量的阶:描述张量的“容器结构”(有多少层嵌套)。
- 元素的几何维度:描述张量中每个“格子”里存放的内容的数学维度。
2. 具体例子分析
(1) 一阶张量 [x, y, z]
- 形状:
(3,)
(1阶,1个轴)。 - 元素的几何维度:
- 如果
x, y, z
是标量(如x=1.0
),则元素几何维度为 0(标量)。 - 如果
x, y, z
是向量(如x=[1,2]
),则元素几何维度为 1(向量),此时实际是一个 2阶张量(形状类似(3, 2)
)。
- 如果
(2) 三阶张量 (m, n, k)
- 形状:
(m, n, k)
(3阶,3个轴)。 - 元素的几何维度:
- 如果每个元素是标量(如
0.0
),则几何维度为 0。此时张量是 纯3阶结构。 - 如果每个元素是向量(如
[1,2,3]
),则几何维度为 1,实际是一个 4阶张量(形状类似(m, n, k, 3)
)。
- 如果每个元素是标量(如
3. 几何空间中的张量
-
张量的阶 ≠ 元素所在的几何空间维度。
- 例如:一个形状为
(2, 3)
的矩阵(2阶张量),其元素可以是:- 标量(几何维度 0):
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
。 - 向量(几何维度 1):
[[[1,2], [3,4], [5,6]], [[7,8], [9,10], [11,12]]]
(实际形状(2, 3, 2)
)。
- 标量(几何维度 0):
- 例如:一个形状为
-
几何空间的维度由元素的数学性质决定:
- 标量:0维(点)。
- 向量:1维(线)。
- 矩阵:2维(面)。
4. PyTorch/Numpy 中的默认约定
在深度学习框架中:
- 默认情况下,张量的元素是标量(几何维度 0)。
- 例如:
torch.rand(2, 3)
生成的是一个 2×3 的标量矩阵。
- 例如:
- 如果需要存储向量/矩阵,需扩展轴:
- 存储向量:添加一个轴,形状变为
(m, n, k, d)
(d
是向量长度)。 - 存储矩阵:形状变为
(m, n, k, r, c)
(r×c
是矩阵形状)。
- 存储向量:添加一个轴,形状变为
5. 如何明确区分?
检查张量的实际内容:
import torch
# 案例1:3阶张量,元素是标量(几何维度 0)
x = torch.rand(2, 3, 4) # 形状 (2,3,4)
print(x[0, 0, 0]) # 输出一个标量(如 0.1234)
# 案例2:3阶张量,元素是向量(几何维度 1)
y = torch.rand(2, 3, 4, 5) # 形状 (2,3,4,5),元素是5维向量
print(y[0, 0, 0]) # 输出一个向量(如 tensor([0.1, 0.2, 0.3, 0.4, 0.5]))
数学表示:
- 标量元素: T ∈ R m × n × k \mathcal{T}\in\mathbb{R}^{m\times n\times k} T∈Rm×n×k
- 向量元素: T ∈ R m × n × k × d \mathcal{T}\in\mathbb{R}^{m\times n\times k\times d} T∈Rm×n×k×d
6. 总结
- 张量的阶:由形状元组的长度决定,表示“容器”的嵌套层级。
- 元素的几何维度:由每个元素本身的数学性质决定(标量/向量/矩阵等)。
- 关键结论:
(m,n,k)
是 3阶张量,但它的元素可以是标量(几何维度 0)或更高维对象。- 若元素是标量,则张量仅描述一个 离散的 m×n×k 数据集合,不直接对应几何空间维度。
通过这种区分,可以更清晰地设计神经网络中的张量结构(如区分批处理维度、特征维度等)。
回到之前的问题
-
一阶张量:
[x,y,z]
,形状为(3,)
- 当看作向量时候,它通常不会被理解为一个容器的数值集合,而是表示一个元素!这个元素所处的几何空间是三维的,也可以说这个向量是三维的,这个维度是它最为向量元素的几何形状。
- 当看作是张量时,它是一阶(一维)的,它有一个容器,三个元素,每个元素是标量。
-
三阶张量,形状为
(m,n,k)
- 可以看作是嵌套三层的容器,最终容器的格子装着一个个标量。一共是
m×n×k
个标量元素 - 可以看作是一层容器,有
m
个元素,每个元素是二维矩阵,矩阵的形状为(n,k)
- 也可以看作有两层容器,一共有
m×n
个元素,每个元素是一个向量,向量的集合维度是k
- 可以看作是嵌套三层的容器,最终容器的格子装着一个个标量。一共是
所以最终还是关于“维度”这个概念的文字游戏吗?到这里,感觉之前学的都是零散的知识点,通过自己努力研究似乎也都串起来了。
同时,发现在深度学习或者很多学科中,通一个事物的解释和概念往往太多,同时又少有把它们联系起来。只能在具体情况下具体分析。
比如这里还行提一嘴,二维矩阵可以看作是对一维向量的线性变换方案,它可以把一个空间线性变换到另一个空间(这也是矩阵乘法的其中一个含义)。这些在之后的张量系列的内容也有待探索。在了解如何工作的同时,去理解它存在的意义,为什么这么去运用,也很重要吧。