张量运算全解析
前言
本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见《机器学习数学通关指南》
正文
📊 1. 张量的本质
-
基本定义:
张量是多维数组的推广,是现代深度学习模型的基本数据结构。在PyTorch等深度学习框架中,张量被用来编码模型的输入和输出数据,以及模型中的各种参数。 它的维度由**轴(axis)**的个数决定:- 0D张量:单个数值(标量),如
3.14
- 1D张量:一维数组(向量),如
[1, 2, 3]
- 2D张量:二维数组(矩阵),如
[[3, 6], [9, 12]]
- N维张量(N≥3):多层嵌套的数组(例如图像处理中的3D张量格式为 [高度, 宽度, 颜色通道])
- 0D张量:单个数值(标量),如
-
形状(shape)与维度:
- 张量形状是
shape
属性表征的各维度元素数量(如对[[1,2],[3,4]]
,shape=(2, 2)
) - 括号层次深度决定维数,例如
[[[1,1], [2,2]]]
是一个 3D张量,形状为(1,2,2)
- 轴的索引从外到内递增(最外层维度为
axis=0
) - 在实际应用中,数据通常表示为向量、矩阵或高阶张量,尤其在深度学习领域,数据维度越来越高
- 张量形状是
🔄 2. 张量运算的类型
1️⃣ 逐元素运算(Element-wise)
-
加减乘除等算术运算基于对应位置的元素独立计算,例如:
a = np.array([[1, 2], [3, 4]]) b = np.ones((2, 2)) a + b → [[2., 3.], [4., 5.]]
-
效率核心:依赖底层线性代数库(如BLAS),实现并行加速
-
现代GPU的张量核心专为此类运算设计,可以同时处理多个数值操作,使得大规模矩阵乘法、卷积运算等能以极高吞吐量执行
2️⃣ 降维操作(Reduction)
- 沿着指定轴聚合数据(如求和、求均值)
使用sum(axis=n)
移除第n
个轴(如对shape=(2,3,4)
沿axis=0
求和的形状变为(3,4)
) - 爱因斯坦求和(einsum):
用字符串语法灵活定义维度操作,如np.einsum("i->", arr)
对一维数组求和(等效于降维聚合)
3️⃣ 矩阵类运算
- 点乘(dot product):张量版本的矩阵乘积(如
a.dot(b)
) - 广播机制:不同形状张量通过维度扩展自动对齐进行运算
- 这些运算在专用硬件如TPU上执行效率更高,因为TPU是为满足深度学习算法在计算上的需求而特别研发的处理器,特别是在大规模并行张量运算方面表现出色
🔍 3. 张量运算的数学意义
🔢 数据表示
- 特征工程:如表格数据的2D张量(行=样本,列=特征)
- 深度学习:3D张量表示图像数据(批次大小×高度×宽度×通道)
- 在许多实际应用中,如自然语言处理,数据被编码为多维张量,例如文本数据可以表示为三维张量:批次×序列长度×嵌入维度
🧩 操作语义
- 维度对齐:运算前需保证参与运算的维度规则匹配(如
shape=(3,4)
和shape=(4,5)
可进行矩阵乘法) - 空缺维度兼容:标量与张量运算时自动填充(如张量
a
+ 标量1
等价于a + 1
作用于每个元素) - 在实际的框架实现中,张量操作通常由DirectML等API提供支持,这些API将张量资源绑定为输入和输出,以便进行高效计算
🧪 物理意义
- 线性代数扩展:如张量的逐元素指数运算、对数运算(函数功能化处理复杂数学变换)
- 模型参数优化:如神经网络的权重矩阵(2D张量)通过梯度下降更新
- 张量运算还可用于贝叶斯概率编程,支持不确定性建模,这是传统神经网络方法的一种补充,有助于对预测结果信度进行评估
💻 4. 实际应用场景
🧹 数据预处理
- 高维张量(如文本、图像)的降维(PCA)、标准化(基于均值和方差)
- 特征工程中,张量操作可以高效地提取和转换数据特征,为后续模型训练提供更好的输入
🤖 深度学习
- 卷积运算:通过对局部窗口的3D张量进行模式提取(如CNN中的滤波器)
- Transformer架构:注意力机制中的多维矩阵并行计算(三维张量:批次×序列长度×嵌入维度)
- 现代深度学习模型如GPT和BERT严重依赖于高效的张量运算,这也是为什么专用硬件加速(如GPU的张量核心)对于训练大型模型至关重要
🔬 科学计算与高级应用
- 矩阵分解、张量积:用于物理场的仿真(如流体力学中的压力场用3D张量表示)
- 量子计算模拟:高维张量网络用于模拟量子系统的状态
- 计算机视觉高级任务:如3D物体重建、视频分析中的时空张量处理
- 专用硬件加速:TPU(张量处理单元)是Google开发的专用集成电路,专为执行神经网络中的张量运算而设计,显著加速深度学习工作负载
🚀 5. 张量运算优化技术
🧠 硬件加速
- GPU张量核心:专为矩阵乘法和张量运算设计的硬件单元,能大幅提升深度学习计算效率
- 量化技术:将浮点张量转换为低精度格式(如int8),在保持模型性能的同时加速计算
⚡ 计算优化
- 内存布局优化:根据硬件特性调整张量存储格式,减少内存访问延迟
- 算法优化:如Winograd算法优化卷积运算,降低计算复杂度
- 并行处理技术使得GPU能够同时执行大量张量运算,这是大规模深度学习模型训练的关键
🔑 关键总结
张量运算的实质是对多维数据的结构化数学操作,通过维度对齐、聚合与广播机制,实现了高效的数学建模与计算。理解张量的形状、轴索引和操作语义是掌握机器学习算法的关键基础。
随着深度学习模型规模和复杂度的增加,高效的张量运算变得尤为重要,这也推动了专用硬件(如TPU)和优化算法的发展。掌握张量运算不仅是理解现代机器学习算法的必要条件,也是实现高效计算和模型优化的基础。
📝 实践练习
# 张量运算实践示例
import numpy as np
import matplotlib.pyplot as plt
# 创建一个3D张量 (2,3,4)
tensor_3d = np.arange(24).reshape(2, 3, 4)
print("3D张量形状:", tensor_3d.shape)
# 沿着第0轴求和(降维)
sum_axis0 = np.sum(tensor_3d, axis=0)
print("沿axis=0求和后的形状:", sum_axis0.shape)
# 使用einsum进行矩阵乘法
A = np.random.rand(3, 4)
B = np.random.rand(4, 5)
C1 = np.einsum('ij,jk->ik', A, B) # 等价于矩阵乘法
C2 = np.dot(A, B)
print("误差:", np.max(np.abs(C1-C2))) # 验证结果相同
# 广播机制演示
broadcast_example = tensor_3d + np.arange(4).reshape(1, 1, 4)
print("广播后的形状:", broadcast_example.shape)