我是靠谱客的博主 活泼大神,最近开发中收集的这篇文章主要介绍爱因斯坦求和~enisum~以及各种矩阵乘法product公式~最后有手绘enisum理解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

various product

  1. dot product
  2. element-wise product
  3. inner product
  4. outer product
  5. Kronecker product(克罗内克积)
  6. torch.enisumEinstein 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=a11a21am1a12a22am2a1na2namn,B=b11b21bn1b12b22bn2b1pb2pbnp

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=c11c21cm1c12c22cm2c1pc2pcmp

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=1naikbkj,

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}.} (AB)ij=(AB)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}}.} a11a21a31a12a22a32a13a23a33b11b21b31b12b22b32b13b23b33=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}} (uv)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}}.} uv=uvT=u1u2u3u4[v1v2v3]=u1v1u2v1u3v1u4v1u1v2u2v2u3v2u4v2u1v3u2v3u3v3u4v3.

5 Kronecker product(克罗内克积)

对应维度两两相乘,如下例子, a 11 a_{11} a11分别与 b 11 、 b 21 b_{11}、b_{21} b11b21相乘为纵向前两个元素,分别与 b 11 、 b 12 、 b 13 b_{11}、b_{12}、b_{13} b11b12b13相乘为横向前三个元素
在这里插入图片描述

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:

  1. 小夕的知乎
  2. wikipedia
    kipedia.org/wiki/Einstein_notation#Common_operations_in_this_notation)
  3. Baidu baike

最后

以上就是活泼大神为你收集整理的爱因斯坦求和~enisum~以及各种矩阵乘法product公式~最后有手绘enisum理解的全部内容,希望文章能够帮你解决爱因斯坦求和~enisum~以及各种矩阵乘法product公式~最后有手绘enisum理解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部