愛因斯坦求和~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=(a11a12a1na21a22a2nam1am2amn),B=(b11b12b1pb21b22b2pbn1bn2bnp){\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}}}

C=(c11c12c1pc21c22c2pcm1cm2cmp){\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}}}

cij=ai1b1j+ai2b2j++ainbnj=k=1naikbkj,{\displaystyle c_{ij}=a_{i1}b_{1j}+a_{i2}b_{2j}+\cdots +a_{in}b_{nj}=\sum _{k=1}^{n}a_{ik}b_{kj},}

2 element-wise product

矩陣的形狀需要一致,表示前後對應座標的元素相乘得到的矩陣

(AB)ij=(AB)ij=(A)ij(B)ij.{\displaystyle (A\circ B)_{ij}=(A\odot B)_{ij}=(A)_{ij}(B)_{ij}.}

[a11a12a13a21a22a23a31a32a33][b11b12b13b21b22b23b31b32b33]=[a11b11a12b12a13b13a21b21a22b22a23b23a31b31a32b32a33b33].{\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}}.}

3 inner product

向量的內積,即點乘,結果是一個標量(scalar)。

u,v=uTv{\displaystyle \left\langle \mathbf {u} ,\mathbf {v} \right\rangle =\mathbf {u} ^{\textsf {T}}\mathbf {v} }

4 outer product

向量的外積,即叉乘,結果是一個向量(vector)。

(uv)ij=uivj{\displaystyle (\mathbf {u} \otimes \mathbf {v} )_{ij}=u_{i}v_{j}}

uv=uvT=[u1u2u3u4][v1v2v3]=[u1v1u1v2u1v3u2v1u2v2u2v3u3v1u3v2u3v3u4v1u4v2u4v3].{\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}}.}

5 Kronecker product(克羅內克積)

對應維度兩兩相乘,如下例子,a11a_{11}分別與b11b21b_{11}、b_{21}相乘爲縱向前兩個元素,分別與b11b12b13b_{11}、b_{12}、b_{13}相乘爲橫向前三個元素
在這裏插入圖片描述

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章