注:本文为 “张量分析 · 哑标和自由标 | 爱因斯坦求和约定” 相关合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。
张量分析:爱因斯坦求和约定
柯宇 编辑于 2021-06-01 13:27
约定 1:哑标
若公式中同一字母分别以重复一次的上角标与下角标形式出现,则该指标视为求和指标(即哑标),其求和运算可省略求和符号 ∑ \sum ∑,具体形式如下:
A i x i = ∑ i = 1 3 A i x i A i j x i y j = ∑ i = 1 3 ∑ j = 1 3 A i j x i y j A i j k x i y j z k = ∑ i = 1 3 ∑ j = 1 3 ∑ k = 1 3 A i j k x i y j z k \begin{aligned} A_{i}x^{i}&=\sum_{i=1}^{3}A_{i}x^{i}\\ A_{ij}x^{i}y^{j}&=\sum_{i=1}^{3}\sum_{j=1}^{3}A_{ij}x^{i}y^{j}\\ A_{ijk}x^{i}y^{j}z^{k}&=\sum_{i=1}^{3}\sum_{j=1}^{3}\sum_{k=1}^{3}A_{ijk}x^{i}y^{j}z^{k} \end{aligned} AixiAijxiyjAijkxiyjzk=i=1∑3Aixi=i=1∑3j=1∑3Aijxiyj=i=1∑3j=1∑3k=1∑3Aijkxiyjzk
约定 2:自由标
在公式的每一项中,仅出现一次的下角标称为自由标。自由标的取值个数对应方程的个数,具体示例如下:
A i j x j = { A 1 j x j A 2 j x j A 3 j x j A_{ij}x^{j}= \begin{cases} A_{1j}x^{j}\\ A_{2j}x^{j}\\ A_{3j}x^{j} \end{cases} Aijxj=⎩ ⎨ ⎧A1jxjA2jxjA3jxj
约定 3:指标高度
规定张量指标的高度分为上、下两级,其中上角标的高度高于下角标。指标的升降操作定义为:指标上升指指标由下角标形式转换为上角标形式,指标下降指指标由上角标形式转换为下角标形式。
爱因斯坦求和哑标、Levi-Civita 记号与克罗内克记号的恒等式、混合积的轮换对称性及其几何意义、三矢量叉乘化简、并矢
愛物理的无双麓叶 编辑于 2021-11-06 12:10
摘要
本文首先阐述 Levi-Civita 记号、克罗内克记号 的定义,推导两个记号联合构成的 恒等式,并给出该恒等式的 另一种证明方法(基于读书札记整理)。随后,利用爱因斯坦求和约定中的哑标,严谨证明 混合积的轮换对称性及其几何意义,以及 三矢量叉乘化简为矢量点乘之差的形式。在此基础上,明确张量阶数与自由标个数的对应关系:张量的阶数等于其所含自由标的个数。最后,对 并矢 概念进行深入分析,指出并矢含两个不重复指标,故为二阶张量;同时,可通过 类比线性代数 的相关概念,理解并矢这一特殊的矢量运算。

重要恒等式的另一种证明

恒等式的应用


张量阶数与自由标个数的关系、并矢的深入理解
标量无指标,属于零阶张量;矢量含一个指标,属于一阶张量;二阶张量含两个不同指标。并矢含两个不重复指标,因此显然为二阶张量;此外,可通过类比线性代数的相关理论,理解并矢这一特殊的矢量运算,具体推导过程参见下图笔记:

参考文献
- 刘连寿,《物理学中的张量分析》:该书内容通俗易懂,入门难度低,适用于张量分析的初学者。
- 《微分几何入门与广义相对论》:可在掌握张量分析基础的前提下,用于深入理解微分几何与广义相对论的相关理论。
- B 站王青老师《电动力学》课程的数学补充部分:该部分内容讲解了抽象指标的概念,对理解张量分析具有辅助作用。
- 童哲 校长,万门大学《向量分析》课程 [EB/OL]. (2022-01-01).
爱因斯坦求和约定
posted @ 2022-01-17 20:36 牙疼脖子痛
爱因斯坦求和约定(Einstein summation convention)是张量分析中一种重要的符号标记约定,又称为爱因斯坦标记法(Einstein notation)。该约定可简化张量运算表达式的书写形式,使表达式更加简洁明了。其概念包括 哑指标(dummy index) 与 自由指标(free index)。
定义
哑指标
在表达式的某一项中,若某一指标重复出现两次,则表示对该指标在其取值范围内进行遍历求和,此类重复出现的指标称为哑指标,简称哑标。未参与求和运算的指标称为自由指标。
自由指标
在表达式的某一项中,若某一指标仅出现一次,且当该指标在其取值范围内轮流取任一值时,关系式均成立,则此类指标称为自由指标。
举例说明
- 设 a \boldsymbol{a} a、 b \boldsymbol{b} b 为两个矢量,其分量分别记为 a i a_i ai、 b i b_i bi(其中 i = 1 , 2 , 3 i=1,2,3 i=1,2,3),则矢量 a \boldsymbol{a} a 与 b \boldsymbol{b} b 的点积可表示为:
a ⋅ b = a 1 b 1 + a 2 b 2 + a 3 b 3 = ∑ i = 1 3 a i b i = a i b i \boldsymbol{a} \cdot \boldsymbol{b} = a_1b_1 + a_2b_2 + a_3b_3 = \sum_{i=1}^{3}a_ib_i = a_ib_i a⋅b=a1b1+a2b2+a3b3=i=1∑3aibi=aibi
- 由于哑标的作用仅为标记求和运算,其符号选择不影响求和结果,因此上式中的 a i b i a_ib_i aibi 可替换为 a j b j a_jb_j ajbj 或 a k b k a_kb_k akbk,即:
a i b i = a j b j = a k b k a_ib_i = a_jb_j = a_kb_k aibi=ajbj=akbk
- 对于如下线性变换:
x 1 ′ = a 11 x 1 + a 12 x 2 + a 13 x 3 x 2 ′ = a 21 x 1 + a 22 x 2 + a 23 x 3 x 3 ′ = a 31 x 1 + a 32 x 2 + a 33 x 3 x'_1 = a_{11}x_1 + a_{12}x_2 + a_{13}x_3 \\ x'_2 = a_{21}x_1 + a_{22}x_2 + a_{23}x_3 \\ x'_3 = a_{31}x_1 + a_{32}x_2 + a_{33}x_3 x1′=a11x1+a12x2+a13x3x2′=a21x1+a22x2+a23x3x3′=a31x1+a32x2+a33x3
利用爱因斯坦求和约定,可将上述线性变换简化表示为:
x i ′ = a i j x j x'_i = a_{ij}x_j xi′=aijxj
其中, i i i 为自由指标, j j j 为哑标。
补充说明
- 对自由标进行换标时,需对整个表达式中所有相同的自由标同时换标,以保证关系式的一致性。
- 若同一表达式中出现两对(或多对)不同的哑标,则表示进行多重求和运算。例如: a i j x i x j = ∑ i = 1 3 ∑ j = 1 3 a i j x i x j a_{ij}x_ix_j = \sum_{i=1}^{3}\sum_{j=1}^{3}a_{ij}x_ix_j aijxixj=∑i=13∑j=13aijxixj。
- 哑标必须成对出现,若某指标重复出现次数不为两次,则需明确添加求和符号或特别说明。例如: ∑ i = 1 3 a i b i c i \sum_{i=1}^{3}a_ib_ic_i ∑i=13aibici 不可简写为 a i b i c i a_ib_ic_i aibici。
- 由等式 a i b i = a i c i a_ib_i = a_ic_i aibi=aici 无法推出 b i = c i b_i = c_i bi=ci,需结合具体条件进一步分析。
- 若重复出现的指标不参与求和运算,需在表达式前特别声明。
- 通常情况下,默认英文字母标号 i , j , k , ⋯ i,j,k,\cdots i,j,k,⋯ 的取值范围为 1 , 2 , 3 1,2,3 1,2,3,拉丁文字母标号 α , β , γ , ⋯ \alpha,\beta,\gamma,\cdots α,β,γ,⋯ 的取值范围为 1 , 2 1,2 1,2。
EOF
爱因斯坦求和约定(含代码实现)
阿里云开发者社区 发布日期:2024-05-13 发布地点:吉林
一、简介
爱因斯坦求和约定(Einstein summation convention)是张量分析与多维线性代数中的一种符号标记约定,又称为爱因斯坦标记法(Einstein notation)。该约定基于特定规则简化多维线性代数数组操作的表达式书写,通过省略求和符号 ∑ \sum ∑ 使表达式更加简洁明了。
1. 自由标
自由标是在表达式两侧均出现,且不遵循求和约定的指标。自由标的作用是指示表达式结果张量中保留的维度,其顺序决定结果张量的维度顺序。以下示例中, i i i 为自由标, j j j 为哑标:
y 1 = a 11 x 1 + a 12 x 2 + a 13 x 3 y 2 = a 21 x 1 + a 22 x 2 + a 23 x 3 y 3 = a 31 x 1 + a 32 x 2 + a 33 x 3 y_1 = a_{11}x_1 + a_{12}x_2 + a_{13}x_3\\ y_2 = a_{21}x_1 + a_{22}x_2 + a_{23}x_3\\ y_3 = a_{31}x_1 + a_{32}x_2 + a_{33}x_3 y1=a11x1+a12x2+a13x3y2=a21x1+a22x2+a23x3y3=a31x1+a32x2+a33x3
利用爱因斯坦求和约定,可将上述表达式简化为:
y i = a i j x j y_i = a_{ij}x_j yi=aijxj
2. 哑标
哑标是在表达式同侧重复出现两次的指标,遵循求和约定,即对该指标在其取值范围内进行求和运算。哑标在张量运算中仅起辅助标记作用,不影响最终结果张量的形状,相同哑标表示对对应位置的元素进行求和。以下示例中, i i i 与 j j j 均为哑标:
∑ i = 1 3 a i b i = a i b i ∑ i = 1 3 ∑ j = 1 3 a i j x i y j = a i j x i y j \begin{aligned} \sum_{i=1}^{3}a_ib_i &= a_ib_i\\ \sum_{i=1}^{3}\sum_{j=1}^{3}a_{ij}x_iy_j &= a_{ij}x_iy_j \end{aligned} i=1∑3aibii=1∑3j=1∑3aijxiyj=aibi=aijxiyj
综上,自由标用于确定张量运算结果的维度,哑标用于标记求和操作的维度。
二、基于 PyTorch 的实现
Einsum(爱因斯坦求和约定的代码实现)在 PyTorch、TensorFlow 与 NumPy 中均有支持,且用法基本一致。本节以 PyTorch 为例,介绍 torch.einsum 方法的使用。该方法的思想是:通过下标标记输入张量的各维度,定义输出张量的维度;对下标不属于输出维度的元素先进行乘积运算,再进行求和运算,最终得到输出张量。需注意的是,torch.einsum 会自动调整张量乘法顺序以匹配运算需求,并自动处理张量维度匹配问题,因此输入参数的顺序不影响最终结果。
1. 计算矩阵的迹
torch.einsum('ii', torch.randn(4, 4))
# tensor(-1.2104)
其中,ii 表示对输入方阵的第一个维度与第二个维度取相同索引,对所有相同索引对应的元素进行求和,即计算方阵的迹(对角元素之和)。由于未显式指定输出维度,该运算先完成求和再输出标量结果。
2. 提取矩阵的对角线元素
torch.einsum('ii->i', torch.randn(4, 4))
# tensor([-0.1034, 0.7952, -0.2433, 0.4545])
其中,ii 表示对输入方阵的第一个维度与第二个维度取相同索引;->i 表示输出张量为一维张量,其元素为输入方阵中各相同索引对应的对角元素。
3. 计算两个矢量的外积
x = torch.randn(5)
y = torch.randn(4)
torch.einsum('i,j->ij', x, y)
# tensor([[ 0.1156, -0.2897, -0.3918, 0.4963],
# [-0.3744, 0.9381, 1.2685, -1.6070],
# [ 0.7208, -1.8058, -2.4419, 3.0936],
# [ 0.1713, -0.4291, -0.5802, 0.7350],
# [ 0.5704, -1.4290, -1.9323, 2.4480]])
其中,i 与 j 分别标记矢量
x
x
x(一维张量)与
y
y
y(一维张量)的维度;->ij 表示输出张量为二维张量,其形状为
(
len
(
x
)
,
len
(
y
)
)
(\text{len}(x), \text{len}(y))
(len(x),len(y)),元素为矢量
x
x
x 与
y
y
y 对应元素的乘积,即两矢量的外积。
4. 批量矩阵乘法
As = torch.randn(3,2,5)
Bs = torch.randn(3,5,4)
torch.einsum('bij,bjk->bik', As, Bs)
# tensor([[[-1.0564, -1.5904, 3.2023, 3.1271],
# [-1.6706, -0.8097, -0.8025, -2.1183]],
#
# [[ 4.2239, 0.3107, -0.5756, -0.2354],
# [-1.4558, -0.3460, 1.5087, -0.8530]],
#
# [[ 2.8153, 1.8787, -4.3839, -1.2112],
# [ 0.3728, -2.1131, 0.0921, 0.8305]]])
其中,bij 标记输入张量
A
s
As
As(形状为
(
3
,
2
,
5
)
(3,2,5)
(3,2,5))的维度(
b
b
b 为批量维度,
i
i
i 为行维度,
j
j
j 为列维度);bjk 标记输入张量
B
s
Bs
Bs(形状为
(
3
,
5
,
4
)
(3,5,4)
(3,5,4))的维度(
b
b
b 为批量维度,
j
j
j 为行维度,
k
k
k 为列维度);->bik 表示输出张量的形状为
(
b
,
i
,
k
)
(b,i,k)
(b,i,k),即对每个批量中的矩阵
A
s
A_s
As(形状为
(
2
,
5
)
(2,5)
(2,5))与
B
s
B_s
Bs(形状为
(
5
,
4
)
(5,4)
(5,4))进行矩阵乘法,得到批量矩阵乘法结果。
5. 含子列表与省略号的维度标记
As = torch.randn(3,2,5)
Bs = torch.randn(3,5,4)
torch.einsum(As, [..., 0, 1], Bs, [..., 1, 2], [..., 0, 2])
# tensor([[[-1.0564, -1.5904, 3.2023, 3.1271],
# [-1.6706, -0.8097, -0.8025, -2.1183]],
#
# [[ 4.2239, 0.3107, -0.5756, -0.2354],
# [-1.4558, -0.3460, 1.5087, -0.8530]],
#
# [[ 2.8153, 1.8787, -4.3839, -1.2112],
# [ 0.3728, -2.1131, 0.0921, 0.8305]]])
其中,[..., 0, 1] 表示对张量
A
s
As
As 进行维度标记:省略号 ... 匹配任意数量的前置维度,0,1 标记张量的最后两个维度;[..., 1, 2] 表示对张量
B
s
Bs
Bs 进行维度标记:省略号 ... 匹配任意数量的前置维度,1,2 标记张量的最后两个维度;[..., 0, 2] 表示输出张量的维度标记:省略号 ... 匹配与输入张量一致的前置维度,0,2 标记输出张量的最后两个维度。该运算本质是对输入张量进行切片后完成乘法与求和,最终输出与批量矩阵乘法一致。
6. 张量维度变换(转置)
A = torch.randn(2, 3, 4, 5)
torch.einsum('...ij->...ji', A).shape
# torch.Size([2, 3, 5, 4])
其中,...ij 为输入张量
A
A
A(形状为
(
2
,
3
,
4
,
5
)
(2,3,4,5)
(2,3,4,5))的维度标记:省略号 ... 匹配前
N
N
N 个任意维度(此处为前 2 个维度
2
,
3
2,3
2,3),ij 标记最后两个维度(此处为
4
,
5
4,5
4,5);->...ji 为输出张量的维度标记:省略号 ... 保持前
N
N
N 个维度不变,ji 表示交换最后两个维度的顺序。该运算实现对张量最后两个维度的转置,输入张量最后两个维度为
(
4
,
5
)
(4,5)
(4,5),输出后变为
(
5
,
4
)
(5,4)
(5,4),整体形状由
(
2
,
3
,
4
,
5
)
(2,3,4,5)
(2,3,4,5) 变为
(
2
,
3
,
5
,
4
)
(2,3,5,4)
(2,3,5,4)。
7. 双线性变换(类比 torch.nn.functional.bilinear)
l = torch.randn(2,5) # 形状为 (b, n),b=2 为批量维度,n=5 为特征维度
A = torch.randn(3,5,4) # 形状为 (a, n, m),a=3 为输出特征数,n=5、m=4 为中间维度
r = torch.randn(2,4) # 形状为 (b, m),b=2 为批量维度,m=4 为特征维度
torch.einsum('bn,anm,bm->ba', l, A, r)
# tensor([[-0.3430, -5.2405, 0.4494],
# [ 0.3311, 5.5201, -3.0356]])
该运算的具体步骤如下:
- 维度广播与匹配:标记
bn(对应张量 l l l)与bm(对应张量 r r r)中的 b b b 为批量维度,二者批量大小均为 2,满足维度匹配;对 l l l 与 r r r 进行广播操作,得到中间张量形状为 ( b , n , m ) = ( 2 , 5 , 4 ) (b, n, m) = (2,5,4) (b,n,m)=(2,5,4)。 - 元素乘法:张量
A
A
A 的标记
anm中, n = 5 n=5 n=5、 m = 4 m=4 m=4 与中间张量的 n n n、 m m m 维度一致,对三者在 n n n、 m m m 维度上进行元素乘法,得到形状为 ( b , a , n , m ) = ( 2 , 3 , 5 , 4 ) (b, a, n, m) = (2,3,5,4) (b,a,n,m)=(2,3,5,4) 的张量。 - 求和与输出:对
n
n
n、
m
m
m 维度的元素进行求和,消去这两个维度;最终输出张量的形状由标记
->ba指定,即 ( b , a ) = ( 2 , 3 ) (b, a) = (2,3) (b,a)=(2,3),与代码运行结果一致。
爱因斯坦求和约定与代码实现注意事项
双线性变换在实际工程中应用频率较低,且逻辑相对复杂;为保证代码可读性,建议在非必要情况下,通过分步书写明确运算逻辑,避免直接使用复杂的 einsum 标记。
-
指标标记与维度映射:数学表达式中的哑标对应代码中
einsum标记的重复下标(如ij,jk->ik中的 j j j),用于标记求和维度;自由标对应代码中仅出现一次的下标(如ij,jk->ik中的 i , k i,k i,k),用于标记输出维度。 -
运算逻辑一致性:无论是数学推导中的求和、点积、矩阵乘法,还是代码中的
einsum操作,逻辑均为“对哑标维度求和,保留自由标维度”,二者在运算规则上完全一致。 -
简化性与通用性:爱因斯坦求和约定通过省略求和符号简化数学表达式,
einsum则通过统一的下标标记简化代码,二者均避免了传统方法中多次嵌套循环或调用不同函数(如torch.matmul、torch.t)的繁琐操作,可覆盖矢量点积、矩阵迹、外积、转置、批量运算等多种场景,具有极强的通用性。 -
下标标记规范性:同一
einsum表达式中,相同下标需严格对应相同维度大小,避免维度不匹配错误(如ij,jk->ik中,第一个张量的列维度 j j j 需与第二个张量的行维度 j j j 大小一致)。 -
可读性平衡:对于简单运算(如矢量点积、矩阵乘法),直接使用
torch.dot、torch.matmul等专用函数的可读性高于einsum;仅在复杂运算(如多张量混合运算、特定维度求和)中,建议使用einsum简化代码。 -
性能考量:
einsum虽在代码简洁性上有优势,但在部分场景下(如大规模批量运算),专用函数的底层优化更充分,性能更优;需根据实际数据规模与运算场景选择合适的实现方式。
via:
-
张量分析1 爱因斯坦求和约定 - 知乎
https://zhuanlan.zhihu.com/p/372689235 -
爱因斯坦求和哑标、Levi-civita记号和克罗内克记号的恒等式、混合积的轮换对称性及其几何意义、三矢量叉乘化简、并矢 - 知乎
https://zhuanlan.zhihu.com/p/353870644 -
爱因斯坦求和约定 - 牙疼脖子痛 - 博客园
https://www.cnblogs.com/guanzhijin/p/15815229.html -
爱因斯坦求和约定 含代码-阿里云开发者社区
https://developer.aliyun.com/article/1507804
爱因斯坦求和约定详解
3412

被折叠的 条评论
为什么被折叠?



