在人工智能应用中,数据通常需要被组织成可以计算的形式。一个数可以表示损失值或学习率;一组数可以表示一个样本的多个特征;二维数表可以表示一批样本;更高维的数据结构则可以表示图像、语音、视频和模型中间结果。
标量、向量、矩阵和张量,正是描述这些数值结构的基本语言。理解它们的形状、维度、轴、索引、切片和基本运算,有助于看清数据如何进入模型、如何参与计算,以及为什么 shape 匹配在机器学习和深度学习中如此重要。
1、标量:一个数
标量(Scalar)就是一个单独的数。
例如:
都可以看作标量。
在机器学习中,一个损失值、一个学习率、一个温度参数、一个概率值,都可以是标量。
例如,学习率可以写成:
这里的 η 就是一个标量。
标量没有方向,也没有多个分量,它只是表示一个数值大小。
2、向量:一组有序数
向量(Vector)是一组有顺序的数。
例如:
是一个包含 3 个分量的向量。
也可以写成行向量:
在机器学习中,一个样本的多个特征经常表示为向量。
例如,一个房屋样本可以用三个特征表示:
面 积 房 间 数 楼 龄
向量中的每个位置都对应一个特征。顺序很重要,因为模型会按照位置读取这些数值。
3、矩阵:二维数表
矩阵(Matrix)是按行和列排列的二维数表。
例如:
这是一个 2 行 3 列的矩阵。
在机器学习中,如果有多个样本,每个样本又有多个特征,就可以把数据组织成矩阵。
例如:
可以表示 3 个样本,每个样本有 3 个特征。
通常可以把每一行看作一个样本,每一列看作一个特征。
4、张量:更高维的数据结构
张量(Tensor)在严格数学中有更一般的含义,在深度学习和数组计算中,通常可以先把它理解为多维数组。也就是说,张量是把数值按照不同维度组织起来的数据结构。
从这个角度看:
标量可以看作 0 维张量;
向量可以看作 1 维张量;
矩阵可以看作 2 维张量;
更高维的数据结构可以看作高阶张量。
图 1:标量、向量、矩阵与张量的层级关系
例如,一张彩色图片可以表示为一个三维数组:
其中,H 表示高度,W 表示宽度,C 表示颜色通道数。
如果是一批图片,则还会多出一个批量维度:
其中,N 表示图片数量。
需要注意,不同框架对图像张量的维度顺序约定可能不同。
例如,TensorFlow / Keras 中常见的是 N × H × W × C,而 PyTorch 中常见的是 N × C × H × W。
因此,在本文中讨论张量时,重点不是抽象定义,而是看清它的 shape 以及每个轴的含义。
二、形状、维度与轴
1、向量的维数与大小
在线性代数中,向量包含多少个分量,通常就称它是几维向量。
例如:
包含 3 个分量,因此它是一个三维向量。
在 NumPy 等数组计算工具中,这个向量通常表示为一维数组,其形状(shape)为:
这里的 3 表示数组在 axis 0 上有 3 个元素。
需要注意,向量的维数与向量的大小不是同一个概念。向量的大小通常用模或范数表示。
例如:
是一个二维向量,它的大小为:
因此,分量个数描述向量的维数,模则描述向量的大小。
2、矩阵的行与列
矩阵有行和列两个方向。
例如:
它有 2 行 3 列,形状为:
第一个数字表示行数,第二个数字表示列数。
当矩阵用于表示机器学习中的表格数据时,常见的组织方式是:
每一行表示一个样本;
每一列表示一个特征。
因此,如果一个数据矩阵的形状是 (100, 4),通常可以理解为有 100 个样本,每个样本包含 4 个特征。
3、张量的轴
轴(Axis)表示数组中用于组织和定位元素的不同维度。一个数组有几个维度,就有几个轴,轴通常从 axis 0 开始编号。
对于矩阵,行和列分别对应两个轴。
例如:
axis 0 对应第一个维度,也就是行索引所在的维度,长度为 2;
axis 1 对应第二个维度,也就是列索引所在的维度,长度为 3。
对于图像张量:
高 度 宽 度 通 道
可以认为有 3 个轴。
例如:
可以表示一张 28×28 的灰度图片。
4、shape 的含义
数组的形状(shape)表示各个轴的长度,在 Python 中通常写成一个按轴顺序排列的元组。
这里的 shape 不是指几何外形,而是指数组在各个轴上分别包含多少个元素。由于 NumPy、PyTorch 等框架都把 shape 作为属性名,本系列文章也将直接使用英文。
shape 中数字的位置对应轴的编号,数字本身表示该轴的长度。
例如 (3,) 表示一个一维数组,它只有一个轴 axis 0,这个轴的长度是 3。
再如,(2, 3) 表示一个二维数组,也就是一个 2 行 3 列的矩阵。它有两个轴 axis 0 和 axis 1,长度分别是 2 和 3。
在矩阵中,通常可以把 axis 0 理解为行方向,把 axis 1 理解为列方向。
对于更高维的数组,shape 仍然按照同样的规则理解。
例如 (2, 3, 4) 表示一个三维数组。它有 3 个轴:axis 0、axis 1 和 axis 2,长度分别是 2、3、4。
直观地看,可以把它理解为:沿 axis 0 方向有 2 个二维切片;每个切片有 3 行;每一行有 4 个元素。
图 2:shape、维度与轴的直观关系
需要注意,shape 只告诉我们每个轴的长度,并不自动规定每个轴的具体含义。某个轴表示样本、时间、高度、宽度、通道,还是深度,要根据具体数据约定来判断。
例如,形状为:
的数组,可以表示 4 张图片,每张图片高度为 28、宽度为 28,并且有 3 个颜色通道。这里的 4、28、28、3 分别对应不同轴上的长度。
在深度学习中,shape 是否匹配非常重要。例如,矩阵乘法要求前一个矩阵的列数等于后一个矩阵的行数:
如果 shape 不符合运算规则,计算就无法进行;即使程序可以通过广播机制自动运算,也要确认每个轴的含义是否符合任务要求。
三、索引与切片
1、向量索引
索引(Index)用于访问数组中的某个元素。
例如,向量:
数学中常从 1 开始编号:
但在 Python 等编程语言中,索引通常从 0 开始。
所以:
x[2] # 第 3 个元素这一点很重要。数学公式中的 x₁,通常对应 Python 中的 x[0]。
2、矩阵行列索引
矩阵中的元素需要用行号和列号定位。
例如:
数学中可以用:
表示第 i 行第 j 列的元素。
例如:
因为第 2 行第 3 列是 6。
在 Python 中,仍然从 0 开始:
A[1, 2] # 行索引为 1、列索引为 2 的元素,也就是第 2 行第 3 列这会取出 6。
3、张量多维索引
张量中的元素需要通过多个索引共同定位。每个索引对应一个轴,索引的排列顺序与 shape 中各个轴的顺序一致。
例如,一个形状为:
的三维张量,可以理解为有 2 个二维切片,每个切片有 3 行、4 列。
如果将其中的元素记作:
那么,i、j、k 分别表示元素在三个轴上的位置:
i 对应 axis 0;
j 对应 axis 1;
k 对应 axis 2。
在 Python 中,可以写成:
T[i, j, k]例如:
T[0, 1, 2]表示取出 axis 0 上索引为 0、axis 1 上索引为 1、axis 2 上索引为 2 的元素。
因此,张量索引可以理解为:按照各个轴的顺序分别指定位置,从而定位一个确定的元素。
4、切片操作的直观理解
索引用于取出一个确定位置的元素,切片(Slicing)则用于取出数组中的一部分,并保留相应的数据结构。
图 3:向量、矩阵与张量的索引和切片
例如,向量:
在 Python 中:
x[1:4]会取出索引 1、2、3 对应的元素:
[20, 30, 40]Python 切片通常包含起点,不包含终点,因此索引 4 对应的元素不会被取出。
对于矩阵:
A[:, 0]表示保留所有行,取出列索引为 0 的那一列,也就是第 1 列。
A[0, :]表示取出行索引为 0 的那一行,并保留这一行中的所有列。
其中,冒号 : 表示取该轴上的全部元素。
对于三维张量:
T[0, :, :]表示取出 axis 0 上索引为 0 的二维切片,并保留其中的所有行和列。
T[0, 1, :]表示在 axis 0 上索引为 0 的二维切片中,取出行索引为 1 的整行。
T[:, 1, 2]表示保留 axis 0 上的所有切片,并从每个切片中取出行索引为 1、列索引为 2 的元素。
因此,切片可以通过固定部分轴的位置,并保留其他轴上的一段或全部元素,从原数组中取出向量、矩阵或更高维的子结构。理解切片,有助于理解机器学习中的数据预处理、批量训练和特征选择。
四、向量基本运算
1、向量加法
两个形状相同的向量可以相加。
例如:
则:
向量加法是对应位置相加。
如果两个向量的分量个数不同,通常不能直接相加。
2、向量数乘
向量可以乘以一个标量。
例如:
则:
数乘会把向量中的每个分量都乘以同一个数。
在几何上,数乘会把向量的大小缩放为原来的 |k| 倍;如果标量 k < 0,向量方向会反向;如果 k = 0,结果是零向量。
3、点积
(Dot Product)是两个分量个数相同的向量之间的重要运算。
设:
它们的点积为:
例如:
点积的结果是一个标量。
在机器学习中,线性模型经常使用点积来计算加权求和:
也可以写成:
点积不仅是一种计算规则,也有一些重要性质。
首先,两个向量点积的顺序可以交换:
点积还与标量乘法相容。对于标量 k:
其次,点积满足分配律:
还有,一个向量与自身的点积,等于其大小的平方:
例如:
则:
所以:
这些性质使点积具有良好的代数结构,便于展开、合并和变换向量表达式。
一个非常重要的不等式是柯西—施瓦茨不等式(Cauchy-Schwarz Inequality):
它表示:两个向量点积的绝对值,不会超过两个向量大小的乘积。
从直观上看,点积同时受到向量大小和方向关系的影响。
当两个向量的大小固定时,夹角越小,点积越大;夹角越接近 90°,点积越接近 0;如果两个向量正交,则点积为 0;如果夹角大于 90°,则点积为负。
柯西—施瓦茨不等式是理解向量夹角、余弦相似度、投影和最小二乘的重要基础。
4、逐元素乘法
逐元素乘法(Element-wise Multiplication)指两个形状相同的向量在对应位置相乘。
例如:
则逐元素乘法为:
其中,⊙ 常用来表示逐元素乘法,也称 。
点积和逐元素乘法容易混淆。
点积是对应位置相乘后再求和,结果是一个标量;逐元素乘法只做对应位置相乘,结果仍是一个向量。
图 4:向量加法、点积与逐元素乘法的区别
五、矩阵基本运算
1、矩阵加法
两个形状相同的矩阵可以相加。
例如:
则:
矩阵加法也是对应位置相加。
按照严格的矩阵加法定义,两个矩阵必须形状相同才能相加。
在 NumPy、PyTorch 等框架中,某些形状不同的数组可以通过广播机制参与逐元素运算,但这已经不是普通意义上的矩阵加法。
2、矩阵数乘
矩阵也可以乘以一个标量。
例如:
数乘会把矩阵中的每个元素都乘以同一个数。
在图像处理中,改变整张图片的亮度,就可以理解为对像素矩阵进行某种整体缩放。
3、矩阵乘法
(Matrix Multiplication)与逐元素相乘不同。
设:
是一个 2×3 矩阵,另有:
是一个 3×2 矩阵。
因为 A 的列数等于 B 的行数,所以可以相乘:
矩阵乘法的结果为:
矩阵乘法的核心规则是:结果矩阵中的某个元素,来自左矩阵的一行与右矩阵的一列做点积。
如果:
那么:
此公式表示:结果中第 i 行第 j 列的元素,来自 A 的第 i 行与 B 的第 j 列对应相乘后求和。
图 5:矩阵乘法中的“行 × 列”规则
4、矩阵转置
矩阵转置(Transpose)是把矩阵的行和列互换。
例如:
则 A 的转置为:
原矩阵 A 的形状是:
转置后形状变为:
转置在矩阵乘法、线性模型、协方差矩阵和神经网络计算中非常常见。
六、形状匹配:让运算有意义
1、不同运算有不同的形状规则
在向量、矩阵和张量运算中,shape 是否匹配非常重要。
两个向量相加时,通常需要两个向量的分量个数相同:
这是对应位置相加。如果一个向量有 3 个分量,另一个向量有 4 个分量,就无法直接逐元素相加,因为没有办法一一对应。
矩阵加法也类似。两个矩阵做普通加法时,通常需要形状完全相同。
例如,两个形状都是 (2, 3) 的矩阵可以逐元素相加;形状分别为 (2, 3) 和 (3, 2) 的矩阵通常不能直接相加。
矩阵乘法的规则又不同。它要求左矩阵的列数等于右矩阵的行数:
所以,shape 匹配不是一个固定规则,而是要看具体运算。不同运算,对 shape 的要求不同。
2、标量与数组的逐元素运算
在 NumPy、PyTorch 等框架中,标量可以通过广播机制与向量、矩阵或张量中的每个元素分别运算。
例如:
这可以理解为:标量 2 被加到向量的每一个分量上。
矩阵也是一样:
标量乘数组也类似:
这类运算在机器学习中很常见。例如,对图像像素整体缩放、给特征统一加上偏移量、对损失值乘上权重,都可以看成标量与数组之间的运算。
需要注意,这里的标量加数组是 NumPy、PyTorch 等数组计算工具通过广播机制实现的逐元素运算,不是通常意义上的向量加法或矩阵加法。标量乘向量或矩阵则属于标准的数乘运算。
3、广播机制是数组计算中的简化规则
在 NumPy、PyTorch 等框架中,还存在一种常见数组计算规则,叫广播机制(Broadcasting)。
广播机制允许某些形状不同的数组在不显式复制数据的情况下进行逐元素运算。
例如,一个形状为 (2, 3) 的矩阵,可以和一个形状为 (3,) 的向量相加。直观上,这相当于把这个向量加到矩阵的每一行上。
广播机制常用于批量计算。
例如,给每个样本加同一个偏置向量,对每个特征减去均值,或用每个特征的标准差进行缩放。
但广播不是任意形状之间都能自动运算。简单地说,广播会从 shape 的末尾维度开始比较。对应维度相等或其中一个为 1 时,可以继续匹配;如果两个 shape 的长度不同,较短 shape 缺少的前导维度按 1 处理。
因此,广播机制虽然方便,但不能替代对 shape 的理解。在 AI 编程中,看到数组可以运算,还要进一步确认:广播发生在哪个轴上,计算含义是否符合任务要求。
七、Python 示例:用 NumPy 理解数组形状
1、创建向量、矩阵和三维数组
NumPy 是 Python 中处理数组的重要工具。
2、查看 shape
可以使用 .shape 查看数组形状。
输出结果为:
(2, 2, 2)含义分别是:
v 有 3 个元素;
A 有 2 行 3 列;
T 在 3 个轴上的长度分别为 2、2、2。
3、使用索引和切片
可以用索引取出数组中的元素。
print(T[0, 1, 1]) # 4也可以使用切片:
4、观察转置结果
矩阵转置可以使用 .T。
也可以观察形状变化:
5、观察简单广播运算
下面用 NumPy 观察简单广播运算。
先创建一个矩阵和一个向量:
因为 b 与 A 的末尾维度相同,所以可以把 b 加到 A 的每一行上:
输出结果为:
[14 25 36]]也可以创建一个列向量:
输出为:
[204 205 206]]这里,c 的形状是 (2, 1),它会在列方向上被扩展,相当于给第一行加 100,给第二行加 200。
广播机制的关键不是“数字能不能加”,而是 shape 是否符合广播规则。
如果形状不匹配,NumPy 会报错。例如:
A 的形状是 (2, 3),d 的形状是 (2,),它们不能直接按逐元素规则匹配,也不能自动广播成需要的形状。
八、容易混淆的几个问题
1、矩阵不只是二维表格
矩阵既可以看作按行和列排列的二维数表,也可以表示线性变换;在机器学习和深度学习中,它还常用于组织批量数据和存储模型参数。
例如,神经网络中的权重矩阵不仅存储参数,还决定输入向量如何变换为输出向量。
因此,理解矩阵时,既要看它的形状,也要理解它参与运算时的作用。
2、张量的关键是 shape 和轴
在深度学习编程中,张量通常可以先理解为多维数组。
真正重要的是看清张量的 shape 以及每个轴的含义。
例如,图像张量中的某个轴可能表示高度,某个轴表示宽度,某个轴表示颜色通道,批量数据中还会有表示样本数量的轴。
3、能计算不代表含义正确
数组运算不仅要看数字,也要看 shape。
形状不匹配时,程序可能直接报错;
形状可以广播时,程序虽然能运行,但结果未必符合预期。例如,本来想给每个特征加偏置,却可能因为 shape 设置不当而沿错误的轴进行广播。
因此,在 AI 编程中,遇到数组运算时应先确认三件事:shape 是什么,每个轴表示什么,运算是否符合任务含义。
小结
标量、向量、矩阵和张量是组织数值数据的基本结构。理解它们的 shape、轴、索引、切片和基本运算,有助于掌握数据的组织方式、运算规则及形状匹配,为后续学习矩阵变换和张量计算奠定基础。
“点赞有美意,赞赏是鼓励”
热门跟贴