张量分析 · 哑标和自由标 | 爱因斯坦求和约定、应用及代码实现

爱因斯坦求和约定详解

注:本文为 “张量分析 · 哑标和自由标 | 爱因斯坦求和约定” 相关合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。


张量分析:爱因斯坦求和约定

柯宇 编辑于 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=13Aixi=i=13j=13Aijxiyj=i=13j=13k=13Aijkxiyjzk

约定 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 记号克罗内克记号 的定义,推导两个记号联合构成的 恒等式,并给出该恒等式的 另一种证明方法(基于读书札记整理)。随后,利用爱因斯坦求和约定中的哑标,严谨证明 混合积的轮换对称性及其几何意义,以及 三矢量叉乘化简为矢量点乘之差的形式。在此基础上,明确张量阶数与自由标个数的对应关系:张量的阶数等于其所含自由标的个数。最后,对 并矢 概念进行深入分析,指出并矢含两个不重复指标,故为二阶张量;同时,可通过 类比线性代数 的相关概念,理解并矢这一特殊的矢量运算。

img

重要恒等式的另一种证明

img

恒等式的应用

img

img

张量阶数与自由标个数的关系、并矢的深入理解

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

img

参考文献

  1. 刘连寿,《物理学中的张量分析》:该书内容通俗易懂,入门难度低,适用于张量分析的初学者。
  2. 《微分几何入门与广义相对论》:可在掌握张量分析基础的前提下,用于深入理解微分几何与广义相对论的相关理论。
  3. B 站王青老师《电动力学》课程的数学补充部分:该部分内容讲解了抽象指标的概念,对理解张量分析具有辅助作用。
  4. 童哲 校长,万门大学《向量分析》课程 [EB/OL]. (2022-01-01).

爱因斯坦求和约定

posted @ 2022-01-17 20:36 牙疼脖子痛

爱因斯坦求和约定(Einstein summation convention)是张量分析中一种重要的符号标记约定,又称为爱因斯坦标记法(Einstein notation)。该约定可简化张量运算表达式的书写形式,使表达式更加简洁明了。其概念包括 哑指标(dummy index)自由指标(free index)

定义

哑指标

在表达式的某一项中,若某一指标重复出现两次,则表示对该指标在其取值范围内进行遍历求和,此类重复出现的指标称为哑指标,简称哑标。未参与求和运算的指标称为自由指标。

自由指标

在表达式的某一项中,若某一指标仅出现一次,且当该指标在其取值范围内轮流取任一值时,关系式均成立,则此类指标称为自由指标。

举例说明

  1. 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 ab=a1b1+a2b2+a3b3=i=13aibi=aibi

  1. 由于哑标的作用仅为标记求和运算,其符号选择不影响求和结果,因此上式中的 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

  1. 对于如下线性变换:

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 为哑标。

补充说明

  1. 对自由标进行换标时,需对整个表达式中所有相同的自由标同时换标,以保证关系式的一致性。
  2. 若同一表达式中出现两对(或多对)不同的哑标,则表示进行多重求和运算。例如: 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=13j=13aijxixj
  3. 哑标必须成对出现,若某指标重复出现次数不为两次,则需明确添加求和符号或特别说明。例如: ∑ 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
  4. 由等式 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,需结合具体条件进一步分析。
  5. 若重复出现的指标不参与求和运算,需在表达式前特别声明。
  6. 通常情况下,默认英文字母标号 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=13aibii=13j=13aijxiyj=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]])

其中,ij 分别标记矢量 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]])

该运算的具体步骤如下:

  1. 维度广播与匹配:标记 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)
  2. 元素乘法:张量 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) 的张量。
  3. 求和与输出:对 n n n m m m 维度的元素进行求和,消去这两个维度;最终输出张量的形状由标记 ->ba 指定,即 ( b , a ) = ( 2 , 3 ) (b, a) = (2,3) (b,a)=(2,3),与代码运行结果一致。

爱因斯坦求和约定与代码实现注意事项

双线性变换在实际工程中应用频率较低,且逻辑相对复杂;为保证代码可读性,建议在非必要情况下,通过分步书写明确运算逻辑,避免直接使用复杂的 einsum 标记。

  1. 指标标记与维度映射:数学表达式中的哑标对应代码中 einsum 标记的重复下标(如 ij,jk->ik 中的 j j j),用于标记求和维度;自由标对应代码中仅出现一次的下标(如 ij,jk->ik 中的 i , k i,k i,k),用于标记输出维度。

  2. 运算逻辑一致性:无论是数学推导中的求和、点积、矩阵乘法,还是代码中的 einsum 操作,逻辑均为“对哑标维度求和,保留自由标维度”,二者在运算规则上完全一致。

  3. 简化性与通用性:爱因斯坦求和约定通过省略求和符号简化数学表达式,einsum 则通过统一的下标标记简化代码,二者均避免了传统方法中多次嵌套循环或调用不同函数(如 torch.matmultorch.t)的繁琐操作,可覆盖矢量点积、矩阵迹、外积、转置、批量运算等多种场景,具有极强的通用性。

  4. 下标标记规范性:同一 einsum 表达式中,相同下标需严格对应相同维度大小,避免维度不匹配错误(如 ij,jk->ik 中,第一个张量的列维度 j j j 需与第二个张量的行维度 j j j 大小一致)。

  5. 可读性平衡:对于简单运算(如矢量点积、矩阵乘法),直接使用 torch.dottorch.matmul 等专用函数的可读性高于 einsum;仅在复杂运算(如多张量混合运算、特定维度求和)中,建议使用 einsum 简化代码。

  6. 性能考量einsum 虽在代码简洁性上有优势,但在部分场景下(如大规模批量运算),专用函数的底层优化更充分,性能更优;需根据实际数据规模与运算场景选择合适的实现方式。


via:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值