概述
本文为 Pytorch 学习笔记,讲解爱因斯坦简记法。欢迎在评论区与我讨论????
爱因斯坦简记法
是爱因斯坦提出的对向量、矩阵、张量求和运算的简记法。
被省略的部分是求和符号和求和号的下标。
省略规则:默认成对出现的下标为求和下标。
举例
-
用 x i , y i x_i,y_i xi,yi 简化表示内积 < x , y > <x,y> <x,y>:
x i y i : = ∑ i x i y i = o x_iy_i:=sum_ix_iy_i=o xiyi:=i∑xiyi=o
其中 o o o 为输出。 -
用 X i k , Y k j X_{ik},Y_{kj} Xik,Ykj 简化表示矩阵乘法 X ⋅ Y Xcdot Y X⋅Y:
X i k Y k j : = ∑ k X i k Y k j = O i j X_{ik}Y_{kj}:=sum_kX_{ik}Y_{kj}=O_{ij} XikYkj:=k∑XikYkj=Oij
其中 O i j O_{ij} Oij 为输出矩阵的第 i j ij ij 个元素。求和简记法能以一种统一的方式表示各种张量运算,包括内积、外积、转置、点乘、矩阵的迹及其他自定义运算,为不同运算实现提供了统一模型.numpy 和 pytorch 中对其进行了实现,两者语义一致。
-
Torch 矩阵乘法:
print(a_tensor) tensor([[11, 12, 13, 14], [21, 22, 23, 24], [31, 32, 33, 34], [41, 42, 43, 44]]) print(b_tensor) tensor([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]) # 'ik, kj -> ij'语义解释如下: # 输入a_tensor: 2维数组,下标为ik, # 输入b_tensor: 2维数组,下标为kj, # 输出output:2维数组,下标为ij。 # 隐含语义:输入a,b下标中相同的k,是求和的下标,对应上面的例子2的公式 output = torch.einsum('ik, kj -> ij', a_tensor, b_tensor) print(output) tensor([[130, 130, 130, 130], [230, 230, 230, 230], [330, 330, 330, 330], [430, 430, 430, 430]])
-
高阶张量:
a = np.arange(60.).reshape(3,4,5) b = np.arange(24.).reshape(4,3,2) # 语义解析: # 输入a:3阶张量,下标为ijk # 输入b: 3阶张量,下标为jil # 输出o: 2阶张量,下标为k和l # 隐含语义:对i,j进行求和,公式在后面 o = np.einsum('ijk,jil->kl', a, b) print(o) array([[4400., 4730.], [4532., 4874.], [4664., 5018.], [4796., 5162.], [4928., 5306.]]) # 验证: print(np.sum(a[:,:,0]*b[:,:,0].T)) 4400.0 print(np.sum(a[:,:,1]*b[:,:,0].T)) 4532.0
公式为:
A i j k B j i l : = ∑ i ∑ j A i j k B j i l = O k l A_{ijk}B_{jil}:=sum_isum_jA_{ijk}B_{jil}=O_{kl} AijkBjil:=i∑j∑AijkBjil=Okl
O O O 第 k , l k,l k,l 个元素为矩阵A[:,:,k]
和矩阵B[:,:,l]
转置,对应元素相乘再求和。
参考
有帮助的话点个赞加关注吧 ????
最后
以上就是高高枫叶为你收集整理的【Pytorch】einsum爱因斯坦简记法举例的全部内容,希望文章能够帮你解决【Pytorch】einsum爱因斯坦简记法举例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复