免責事項:数学スタック交換または何らかの種類への投稿についてはしました。しかし、数学を専攻している友人から、彼らは Einstein Summation を実際にはあまり使用していないと聞きましたが、機械学習がそれを多く使用していることは知っています。したがって、この問題をここに投稿しました(アルゴリズムのパフォーマンスの最適化として)。
行列計算に関する調査を行っているとき (たとえば、要素ごとの乗算が少なくとも必要な回数)、次の勾配を計算しようとしていました。
ここでABC
は、最初の軸で 3 つの行列を縮小することを意味します(たとえば2x3
、2x4
、 、および2x5
は3x4x5
、 -2
軸が合計されます)。基本的に、 に対する 3-matrix-contraction のノルムの勾配を計算ABC
しA
ます。次に、再び に対する勾配のノルムを計算しA
ます。
これは次と同等です。
または少し単純化します (によって証明されていますautograd
):
これは Einstein Summation 形式で記述できます ( 、einsum
などの多くのパッケージの関数で使用されます)。numpy
tensorflow
np.einsum('ia,ib,ic,jb,jc,jd,je,kd,ke->ka', A, B, C, B, C, B, C, B, C)
これを書いているとき、私は行列を見つけB
てC
、合計を何度も繰り返しています。これらの「たくさんの B と C」を何らかの行列乗数に単純化できるのでしょうか? これにより、対数的に高速になるはずです。手動で単純化しようとしましたが、わかりませんでした。
どうもありがとう!私が言っていることが正しくない場合は、修正してください。