アインシュタインの総和

Python での Tensor 演算、Einstein 合計手法、Numpy および Tensor フローの例
アインシュタインの総和 cover image

アインシュタインの総和表記は、物理学や機械学習でよく使用される、テンソル演算を表現するための簡潔かつ強力な方法です。これにより、テンソルに関する複雑な計算をコンパクトな形式で記述することができます。 Einstein 合計の基本、Python で Numpy および Tensorflow を使用して Einstein 合計を使用する方法を説明し、その使用法を説明する例を示します。

アインシュタイン総和の基本

アインシュタインの総和表記 (Einsum) は、テンソル式で繰り返されるインデックスを合計するという考えに基づいています。これは次の 2 つのルールに基づいています。

1.繰り返されるインデックスの合計: インデックスが用語内に 2 回出現する場合、合計されます。

2.フリー インデックス: 1 回だけ出現するインデックスはフリー インデックスであり、出力テンソルの軸を表します。

2 つの行列 A と B を乗算する例でこれを説明しましょう。結果の行列 C は次のように定義されます。

Cik=jAijBjkC_{ik} = \sum\limits_{j}^{}A_{ij}B_{jk}

Python では、Numpy ライブラリと Tensorflow ライブラリの両方が einsum 関数を提供します。

ナンピー

import numpy as np

# Define two matrices A and B
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# Perform matrix multiplication using einsum
C = np.einsum('ij,jk->ik', A, B)

print(C)
# [[19 22]
#  [43 50]]

上の例では、ij,jk->ik が einsum 文字列です。

ij は行列 A のインデックスを表します

jk は行列 B のインデックスを表します

->ik は出力行列 C のインデックスを指定します

演算はインデックス j の合計を計算します。

Tensorflow の同じコードは次のようになります。

import tensorflow as tf

# Define two matrices A and B
A = tf.constant([[1, 2], [3, 4]], dtype=tf.float32)
B = tf.constant([[5, 6], [7, 8]], dtype=tf.float32)

# Perform matrix multiplication using einsum
C = tf.einsum('ij,jk->ik', A, B)

print(C)
# tf.Tensor(
# [[19. 22.]
#  [43. 50.]], shape=(2, 2), dtype=float32)

その他の例

ベクトルの内積

2 つのベクトル a と b の内積 (ドット積) は次のように定義されます。

c=iaibic = \sum\limits_{i}^{}a_{i}b_{i}

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

c = np.einsum('i,i->', a, b)

print(c)  # Output: 32

ベクトルの外積

2 つのベクトル a と b の外積は次のように求められます。

Cij=aibjC_{ij} = a_{i}b_{j}

C = np.einsum('i,j->ij', a, b)

print(C)
# Output
# [[4 5 6]
#  [8 10 12]
#  [12 15 18]]

行列の転置

行列 A の転置は、インデックスを交換することで取得できます。

A_transpose = np.einsum('ij->ji', A)

print(A_transpose)
# Output
# [[1. 3.]
#  [2. 4.]]

マトリックスのトレース

行列 A のトレースは、その対角要素の合計です。

Tr(A)=iAiiAiiTr(A) = \sum\limits_{i}^{}A_{ii}A_{ii}


trace = np.einsum('ii->', A)

print(trace)
# Output: 5.0

バッチ行列乗算

Einsum は、バッチ操作に特に役立ちます。行列 A と B のバッチがあり、バッチ内の対応する行列を乗算したいとします。


A = np.random.rand(3, 2, 2)
B = np.random.rand(3, 2, 2)

# Perform batch matrix multiplication
C = np.einsum('bij,bjk->bik', A, B)

print(C)

ここで、「b」はバッチの次元を表します。

Einsum 記法の利点

1.簡潔さ: Einsum 表記はコンパクトで、複雑な演算を簡潔に表現できます。

2.柔軟性: 配列を明示的に再形成または転置することなく、さまざまなテンソル演算を処理できます。

3.効率: 多くのライブラリは einsum 操作を内部的に最適化し、パフォーマンスの向上につながる可能性があります。


Career Services background pattern

キャリアサービス

Contact Section background image

連絡を取り合いましょう

Code Labs Academy © 2025 無断転載を禁じます.