张量基础学习(四 张量代数运算——下)
1. 张量缩并:高维数据的降维手术
张量缩并(Tensor Contraction)是张量代数中最具实用价值的运算之一,它就像给高维数据做"降维手术"。想象你手里有个五阶魔方(3×3×3×3×3),通过缩并运算可以把它压缩成三阶魔方(3×3×3),同时保留最关键的数学特征。
缩并的本质是对指定维度进行求和。具体操作时,我们需要选择两个具有相同维度的指标进行求和。例如,对于一个三阶张量 ( T_{ijk} ) 和一个二阶张量 ( M_{kl} ) 进行缩并:
import numpy as np # 创建三阶张量 (2×3×4) T = np.random.rand(2, 3, 4) # 创建二阶张量 (4×5) M = np.random.rand(4, 5) # 使用einsum进行缩并运算 result = np.einsum('ijk,kl->ijl', T, M) # 结果形状为 (2,3,5)这里的关键点是:
- 我们选择对T的第三个维度(k)和M的第一个维度(k)进行求和
- 结果张量的维度是 (i,j,l),即2×3×5
- 这个过程类似于矩阵乘法的高维推广
实际应用中,缩并运算在量子力学中计算态叠加、在计算机视觉中处理多通道特征图时都非常有用。比如在图像处理中,我们可以用缩并运算将RGB三个通道的特征融合为一个灰度特征图。
2. 张量内积:高维空间的角度测量
张量内积(Tensor Inner Product)是向量点积的自然推广。它不仅告诉我们两个张量有多"相似",还能计算它们在高维空间中的"夹角"。在机器学习中,内积常用于核方法、相似度计算等场景。
数学上,两个同阶张量A和B的内积定义为它们对应分量乘积的总和。以二阶张量为例:
$$ A:B = \sum_{i}\sum_{j} A_{ij}B_{ij} $$
Python实现非常直观:
A = np.random.rand(3, 3) B = np.random.rand(3, 3) # 方法1:直接计算 inner_product = np.sum(A * B) # 方法2:使用einsum inner_product = np.einsum('ij,ij->', A, B)特殊性质值得注意:
- 内积结果为标量(0阶张量)
- 满足交换律:A:B = B:A
- 可以定义张量的范数:||A|| = √(A:A)
在弹性力学中,应力张量与应变张量的内积表示应变能密度;在深度学习中,内积常用于计算注意力机制中的相似度得分。
3. 爱因斯坦求和约定:张量运算的语法糖
爱因斯坦求和约定(Einstein Notation)是张量运算中的"语法糖",它能极大简化表达式。规则很简单:重复的指标意味着求和。例如矩阵乘法 ( C_{ik} = A_{ij}B_{jk} ) 可以省略求和符号Σ。
这种表示法在处理高维张量时优势明显。比如计算三阶张量的模:
T = np.random.rand(2, 3, 4) # 普通方法 norm = np.sqrt(np.sum(T**2)) # Einstein表示法 norm = np.sqrt(np.einsum('ijk,ijk->', T, T))实用技巧:
- 自由指标(不重复的)决定输出张量的维度
- 哑指标(重复的)表示要进行求和
- 可以组合多个运算步骤,如
np.einsum('ij,jk,kl->il', A, B, C)
在相对论中,时空度规的张量表达式就是通过爱因斯坦约定简洁表示的;在深度学习的自动微分系统中,这种表示法也能高效实现梯度计算。
4. 张量积与缩并的组合应用
将张量积(并积)与缩并运算结合,可以构建复杂的张量网络。这种技术在量子计算和深度学习中有广泛应用,比如TensorFlow的底层运算就是基于这种原理。
一个典型例子是张量链网络(Tensor Train Network):
# 创建三个核心张量 A = np.random.rand(2, 3, 4) # 形状 (r0, n1, r1) B = np.random.rand(4, 5, 6) # 形状 (r1, n2, r2) C = np.random.rand(6, 7) # 形状 (r2, n3) # 构建张量链网络 result = np.einsum('ijk,klm,mn->ijlmn', A, B, C) final = np.einsum('ijlmn->iln', result) # 缩并中间维度关键点:
- 每个核心张量的相邻维度大小必须匹配
- 最终结果的维度由自由指标决定
- 这种表示可以极大节省存储空间(从2×5×7=70参数降到2×3+3×5×4+4×7=14+60+28=102参数)
在推荐系统中,张量网络用于处理用户-物品-上下文的三维交互数据;在量子化学中,它用于表示多电子波函数。
5. 张量运算的物理意义与实际案例
张量运算不是纯粹的数学游戏,它在物理和工程中有深刻意义。以应力分析为例,柯西应力张量σ描述材料内部受力状态,应变张量ε描述形变程度,二者的双点积表示应变能密度:
$$ U = \frac{1}{2}\sigma:\epsilon $$
Python实现示例:
# 应力张量 (3×3) stress = np.array([[2, 1, 0], [1, 3, 0], [0, 0, 1]]) # 应变张量 (3×3) strain = np.array([[0.01, 0.005, 0], [0.005, 0.02, 0], [0, 0, 0.005]]) # 计算应变能密度 energy_density = 0.5 * np.einsum('ij,ij->', stress, strain)典型应用场景:
- 广义相对论:爱因斯坦场方程中的曲率张量
- 流体力学:纳维-斯托克斯方程中的应力张量
- 电磁学:麦克斯韦应力张量
- 计算机图形学:各向异性材质的BRDF表示
在材料科学中,通过张量运算可以预测复合材料在不同方向上的力学性能;在气象学中,张量运算用于分析大气流动的多维数据。
