アインシュタインの縮約記とアインシュタイン

驚いたことに、インターネットのロシア語セグメントでは、アインシュタインの総和合意を理解できる言語で説明する資料はほとんどありませんロシア語を話すインターネットでeinsum関数がどのように機能するかを理解するための資料がさらに少ないことは驚くべきことではありません。英語では、スタックオーバーフローでのeinsumの作業についてかなり詳細な回答があり、ロシア語では、この回答の曲線変換を提供するサイトはごくわずかです。資料不足でこの問題を解決し、興味のある方はぜひ読んでみてください!






アインシュタイン合意について議論する

まず、アインシュタインの合意はテンソル解析とその応用で最も頻繁に使用されることに注意したいと思います。したがって、この記事ではさらにテンソルへの言及がいくつかあります。

テンソルを使い始めたばかりのときは、通常の下付き文字に加えて、上付き文字も使用されていることに混乱する可能性があります。上付き文字は、最初は一般的にべき乗と見なすことができます。例:

「上付き文字iのあるa」は、と記述されa ^ i、「上付き文字iのある正方形のa」はと記述され(a ^ i)^ 2ます。最初は混乱して不快かもしれませんが、時間の経過とともに慣れることができます。





合意:この記事では、このタイプのオブジェクトa_ix_iまたはa_ix ^ i私はそれらを用語と呼びます





アインシュタインの合意は何ですか?

アインシュタインの合意は、式の総和記号の数を減らすように設計されています。アインシュタインの縮約記で式がどの程度正確に記述されるかを決定する3つの簡単なルールがあります。





ルール#1:合計は、1つの用語で2回繰り返されるすべてのインデックスに対して実行されます。



例:次のような式について考えてみます。





\ sum_ {i = 1} ^ 3 a_ix_i = a_1x_1 + a_2x_2 + a_3x_3

アインシュタインの縮約記法を使用すると、この式は次のように書き直すことができます。





a_ix_i \ text {または} a_ix ^ i

したがって、合計記号を取り除き、単一の項を記述するだけです。この用語では、インデックスiが2回繰り返されることに注意してください。つまり、最初のルールに従って、合計はインデックスiに対して、つまりこのインデックスがとるすべての可能な値に対して実行されることを理解しています。







: A \ in \ mathbb {R} ^ {m \ times n} v \ in \ mathbb {R} ^ {n}. b \ in \ mathbb {R} ^ {m}. :





b_i = \ sum \ Limits_ {j = 1} ^ n A_ {ij} v_j、〜i = 1、\ ldots、m

:





b_i = A_ {ij} v_ {j} = A_ {ij} v ^ {j}

, i , j , , j.





1. , , .





2. , .





, , ,





  1. .





  2. , .





, Python:





for i in range(M):
    for j in range(N):
        b[i] += A[i, j] * v[j]
      
      



, , . j , i – . . j .





№ 2. .





, a_ {ij} b_ {ij}, a_ {ii} b_ {ij} a_ {ij} b_ {jj}, , .

:





a_i ^ i– i , .. ;





a_i ^ {jj}– i , j – ;





a_ {ii} ^ {jj}– i, j ;





a_ {ij} ^ {ij}– i, j ;





a_ {ii} ^ {ij}– ( i );





, , , . :





a_ {ij} b_ {i} + a_ {ji} b_ {j}

, , . , , , i 3 , j, , , ( ), , .





№ 3. , .





:





b_i = A_ {ij} v_ {j}– , i , ;





a_i = A_ {ki} B_ {kj} x_ {j} + C_ {ik} u_ {k}– . : k j , , , i , , . k , i – , , k – , i – . i , , . : i , , 3 .





, :





x_i = A_ {ij}– i , i j;





x_j = A_ {ik} u_k– j, i. ;





x_i = A_ {ik} u_k + c_j– i, i, j;





:

A – . , :





A_ {i_1i_2i_3i_4i_5} = \ sum_ {j_4 = 1} ^ {R_4} \ sum_ {j_3 = 1} ^ {R_3} \ sum_ {j_2 = 1} ^ {R_2} \ sum_ {j_1 = 1} ^ {R_1} G ^ {(1)} _ {i_1j_1} G ^ {(2)} _ {j_1i_2j_2} G ^ {(3)} _ {j_2i_3j_3} G ^ {(4)} _ {j_3i_4j_4} G ^ {(5)} _ {j_4i_5}

, G ^ {(k)}, R_i. – . , .

, i_1、i_2、i_3、i_4、i_5, , j_1、j_2、j_3、j_4. , , , , . , G ^ {(k)}, (k). , , . :





A_ {i_1i_2i_3i_4i_5} = \左(G ^ {(1)} \右)_ {i_1j_1} \左(G ^ {(2)} \右)_ {i_2j_2} ^ {j_1} \左(G ^ {( 3)} \ right)_ {i_3j_3} ^ {j_2} \ left(G ^ {(4)} \ right)_ {i_4j_4} ^ {j_3} \ left(G ^ {(5)} \ right)_ { i_5} ^ {j_4}

, !





einsum

einsum , Python (NumPy, TensorFlow, PyTorch). , , ( , ), , einsum . NumPy. einsum . , , , , .





: A \ in \ mathbb {R} ^ {3 \ times5}, B \ in \ mathbb {R} ^ {5 \ times2} – , . M \ in \ mathbb {R} ^ {3 \ times2}, , :





M_ {ij} = \ sum_ {k = 1} ^ {5} A_ {ik} B_ {kj} = A_ {ik} B_ {kj}

. , :





M = np.zeros((3, 2))
for i in range(3):
    for j in range(2):
        for k in range(5):
            M[i, j] += A[i, k] * B[k, j]
      
      



, einsum :





M = np.einsum("ik,kj->ij", A, B)
      
      



, . einsum : , . :





"{, },{, }->{, }"





einsum :





  • ( ), ;





  • , ;





  • 3 ;





, einsum , , , . , , , , einsum . , einsum.





, einsum:





einsum,

1. :





vector = np.array([1, 2, 3, 4, 5])
result = np.einsum("i->", vector)
print(result)
      
      



Output

15





2. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->", matrix)
print(result)
      
      



Output

21





3. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->j", matrix)
print(result)
      
      



Output

[9, 12]





4. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->i", matrix)
print(result)
      
      



Output

[3, 7, 11]





5. ( , , , ):





matrix = np.array([[1, 2], [3, 4], [5, 6]])
result = np.einsum("ij->ji", matrix)
print(result)
      
      



Output

[[1, 3, 5], [2, 4, 6]]





6. :





matrix = np.array([[1, 2], [3, 4], [5, 6]])
vector = np.array([[1, 2]])
result = np.einsum("ij,kj->ik", matrix, vector)
print(result)
      
      



, 1 \倍2, , . einsum , , , .





Output

[[5], [11], [17]]





7. :





matrix1 = np.array([[1, 2], [3, 4], [5, 6]])
matrix2 = np.array([[1, 0], [0, 1]])
result = np.einsum("ik,kj->ij", matrix1, matrix2)
print(result)
      
      



Output

[[1, 2], [3, 4], [5, 6]]





8. :





vector1 = np.array([[1, 2, 3]])
vector2 = np.array([[1, 1, 1]])
result = np.einsum("ik,jk->", vector1, vector2)
print(result)
      
      



Output

6





9. :





matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
result = np.einsum("ii->", matrix1)
print(result)
      
      



Output

15





10. () :





matrix1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
matrix2 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
result = np.einsum("ij,ij->ij", matrix1, matrix2)
print(result)
      
      



, , : , einsum – :





result = np.zeros(matrix1.shape, dtype="int32")
for i in range(result.shape[0]):
    for j in range(result.shape[1]):
        result[i, j] += matrix1[i, j] * matrix2[i, j]
print(result)
      
      



Output

[[1, 0, 0], [0, 5, 0], [0, 0, 9]]





11. () :





vector1 = np.array([1, 2, 3])
vector2 = np.array([1, 0, 0])
result = np.einsum("i,j->ij", vector1, vector2)
print(result)
      
      



Output

[[1, 0, 0], [2, 0, 0], [3, 0, 0]]





12. :





A = np.array([[[0, 1], [1, 2], [2, 3]], [[1, 2], [2, 3], [3, 4]], [[2, 3], [3, 4], [4, 5]]])
result = np.einsum("ijk->jki", A)
print(result)
      
      



Output

[[[0, 1, 2], [1, 2, 3]], [[1, 2, 3], [2, 3, 4]], [[2, 3, 4], [3, 4, 5]]]





13. :





A = np.array([[[0, 1], [1, 2], [2, 3]], [[1, 2], [2, 3], [3, 4]], [[2, 3], [3, 4], [4, 5]]])
U = np.array([[1, 2], [2, 3]])
result = np.einsum("ijk,nk->ijn", A, U)
print(result)
      
      



Output

[[[2, 3], [5, 8], [8, 13]], [[5, 8], [8, 13], [11. 18]], [[8, 13], [11, 18], [14, 23]]]





, einsum . , (np.dot, np.outer, np.tensordot, np.transpose, np.cumsum ..), einsum. , , , , , .





einsum ( ).





アインシュタインの合意(ベース)





アインシュタインの合意(前編)








All Articles