概述
various product
- dot product
- element-wise product
- inner product
- outer product
- Kronecker product(克罗内克积)
torch.enisum
Einstein notation
1 dot product
线代中的矩阵乘法,A.dot(B)
,表示A的行乘以B的列,A的列数需要等于B的行数。
A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ) , B = ( b 11 b 12 ⋯ b 1 p b 21 b 22 ⋯ b 2 p ⋮ ⋮ ⋱ ⋮ b n 1 b n 2 ⋯ b n p ) {displaystyle mathbf {A} ={begin{pmatrix}a_{11}&a_{12}&cdots &a_{1n}\a_{21}&a_{22}&cdots &a_{2n}\vdots &vdots &ddots &vdots \a_{m1}&a_{m2}&cdots &a_{mn}\end{pmatrix}},quad mathbf {B} ={begin{pmatrix}b_{11}&b_{12}&cdots &b_{1p}\b_{21}&b_{22}&cdots &b_{2p}\vdots &vdots &ddots &vdots \b_{n1}&b_{n2}&cdots &b_{np}\end{pmatrix}}} A=⎝⎜⎜⎜⎛a11a21⋮am1a12a22⋮am2⋯⋯⋱⋯a1na2n⋮amn⎠⎟⎟⎟⎞,B=⎝⎜⎜⎜⎛b11b21⋮bn1b12b22⋮bn2⋯⋯⋱⋯b1pb2p⋮bnp⎠⎟⎟⎟⎞
C = ( c 11 c 12 ⋯ c 1 p c 21 c 22 ⋯ c 2 p ⋮ ⋮ ⋱ ⋮ c m 1 c m 2 ⋯ c m p ) {displaystyle mathbf {C} ={begin{pmatrix}c_{11}&c_{12}&cdots &c_{1p}\c_{21}&c_{22}&cdots &c_{2p}\vdots &vdots &ddots &vdots \c_{m1}&c_{m2}&cdots &c_{mp}\end{pmatrix}}} C=⎝⎜⎜⎜⎛c11c21⋮cm1c12c22⋮cm2⋯⋯⋱⋯c1pc2p⋮cmp⎠⎟⎟⎟⎞
c i j = a i 1 b 1 j + a i 2 b 2 j + ⋯ + a i n b n j = ∑ k = 1 n a i k b k j , {displaystyle c_{ij}=a_{i1}b_{1j}+a_{i2}b_{2j}+cdots +a_{in}b_{nj}=sum _{k=1}^{n}a_{ik}b_{kj},} cij=ai1b1j+ai2b2j+⋯+ainbnj=k=1∑naikbkj,
2 element-wise product
矩阵的形状需要一致,表示前后对应坐标的元素相乘得到的矩阵
( A ∘ B ) i j = ( A ⊙ B ) i j = ( A ) i j ( B ) i j . {displaystyle (Acirc B)_{ij}=(Aodot B)_{ij}=(A)_{ij}(B)_{ij}.} (A∘B)ij=(A⊙B)ij=(A)ij(B)ij.
[ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] ∘ [ b 11 b 12 b 13 b 21 b 22 b 23 b 31 b 32 b 33 ] = [ a 11 b 11 a 12 b 12 a 13 b 13 a 21 b 21 a 22 b 22 a 23 b 23 a 31 b 31 a 32 b 32 a 33 b 33 ] . {displaystyle {begin{bmatrix}a_{11}&a_{12}&a_{13}\a_{21}&a_{22}&a_{23}\a_{31}&a_{32}&a_{33}end{bmatrix}}circ {begin{bmatrix}b_{11}&b_{12}&b_{13}\b_{21}&b_{22}&b_{23}\b_{31}&b_{32}&b_{33}end{bmatrix}}={begin{bmatrix}a_{11},b_{11}&a_{12},b_{12}&a_{13},b_{13}\a_{21},b_{21}&a_{22},b_{22}&a_{23},b_{23}\a_{31},b_{31}&a_{32},b_{32}&a_{33},b_{33}end{bmatrix}}.} ⎣⎡a11a21a31a12a22a32a13a23a33⎦⎤∘⎣⎡b11b21b31b12b22b32b13b23b33⎦⎤=⎣⎡a11b11a21b21a31b31a12b12a22b22a32b32a13b13a23b23a33b33⎦⎤.
3 inner product
向量的内积,即点乘,结果是一个标量(scalar)。
⟨ u , v ⟩ = u T v {displaystyle leftlangle mathbf {u} ,mathbf {v} rightrangle =mathbf {u} ^{textsf {T}}mathbf {v} } ⟨u,v⟩=uTv
4 outer product
向量的外积,即叉乘,结果是一个向量(vector)。
( u ⊗ v ) i j = u i v j {displaystyle (mathbf {u} otimes mathbf {v} )_{ij}=u_{i}v_{j}} (u⊗v)ij=uivj
u ⊗ v = u v T = [ u 1 u 2 u 3 u 4 ] [ v 1 v 2 v 3 ] = [ u 1 v 1 u 1 v 2 u 1 v 3 u 2 v 1 u 2 v 2 u 2 v 3 u 3 v 1 u 3 v 2 u 3 v 3 u 4 v 1 u 4 v 2 u 4 v 3 ] . {displaystyle mathbf {u} otimes mathbf {v} = mathbf {u} mathbf {v} ^{textsf {T}}={begin{bmatrix}u_{1}\u_{2}\u_{3}\u_{4}end{bmatrix}}{begin{bmatrix}v_{1}&v_{2}&v_{3}end{bmatrix}}={begin{bmatrix}u_{1}v_{1}&u_{1}v_{2}&u_{1}v_{3}\u_{2}v_{1}&u_{2}v_{2}&u_{2}v_{3}\u_{3}v_{1}&u_{3}v_{2}&u_{3}v_{3}\u_{4}v_{1}&u_{4}v_{2}&u_{4}v_{3}end{bmatrix}}.} u⊗v=uvT=⎣⎢⎢⎡u1u2u3u4⎦⎥⎥⎤[v1v2v3]=⎣⎢⎢⎡u1v1u2v1u3v1u4v1u1v2u2v2u3v2u4v2u1v3u2v3u3v3u4v3⎦⎥⎥⎤.
5 Kronecker product(克罗内克积)
对应维度两两相乘,如下例子,
a
11
a_{11}
a11分别与
b
11
、
b
21
b_{11}、b_{21}
b11、b21相乘为纵向前两个元素,分别与
b
11
、
b
12
、
b
13
b_{11}、b_{12}、b_{13}
b11、b12、b13相乘为横向前三个元素
6 爱因斯坦求和
用字母标记待操作的向量或矩阵的维度,并用相应的字母标记需要的结果,中间用箭头连接。爱因斯坦求和相当于是一个矩阵处理的接口,可以计算矩阵的迹、对角矩阵、求和、点乘等等。“输入标记中重复字母表示沿这些轴的值将相乘”,“输出标记中省略字母表示沿该轴的值将被求和”
np.einsum('ij,jk->ik', A, B)
可以看作是:2D矩阵乘法:
np.einsum('ij,jk->ijk', A, B)
,注意此时的输出是三维的ijk
,根据下图推测出计算方式是:用第一个矩阵i
维度上的三个向量,即j
向量,分别乘第二个矩阵沿着j
方向的整个矩阵。
AB均是向量
AB均是矩阵
我自己的理解
A = np.arange(18).reshape(3,2,3)
B = np.arange(24).reshape(2,3,4)
x = np.einsum('ijk,jil->kl',A,B)
print(A,'n',B,'n',x)
"""
[[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]]]
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
[[600 645 690 735]
[660 711 762 813]
[720 777 834 891]]
"""
# 第一个600的计算方法:12*3+16*9+4*6+12*8+15*20
还不明白的话,看我下面的图帮助理解,我认为矩阵问题,特别是高维tensor问题,一定要形象的画出来才方便理解。
下面是一个代码中的具体例子:
torch.manual_seed(1)
x = torch.randn(1, 2, 3,4)
A = torch.randn(3, 2)
print(x,'n',A.T)
"""
tensor([[[[-1.5256, -0.7502, -0.6540, -1.6095],
[-0.1002, -0.6092, -0.9798, -1.6091],
[ 0.4391, 1.1712, 1.7674, -0.0954]],
[[ 0.1394, -1.5785, -0.3206, -0.2993],
[-0.7984, 0.3357, 0.2753, 1.7163],
[-0.0561, 0.9107, -1.3924, 2.6891]]]])
tensor([[ 3.5870, 1.5987, 0.3255],
[-1.8313, -1.2770, -0.4791]])
"""
x = torch.einsum('ncvl,vw->ncwl', x, A)
# x.contiguous()
>>> x
"""
tensor([[[[-5.4895, -3.2838, -3.3369, -8.3767],
[ 2.7113, 1.5907, 1.6020, 5.0480]],
[[-0.7948, -4.8289, -1.1631, 2.5454],
[ 0.7913, 2.0256, 0.9027, -2.9320]]]])
"""
# 据验证:sum(A.T[0]*x[0][0][:,1]) = tensor(-3.2838)
Reference:
- 小夕的知乎
- wikipedia
kipedia.org/wiki/Einstein_notation#Common_operations_in_this_notation) - Baidu baike
最后
以上就是活泼大神为你收集整理的爱因斯坦求和~enisum~以及各种矩阵乘法product公式~最后有手绘enisum理解的全部内容,希望文章能够帮你解决爱因斯坦求和~enisum~以及各种矩阵乘法product公式~最后有手绘enisum理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复