元バイオ系

元バイオウェット系がデータサイエンスやらを勉強していくブログ。 基本自分用のまとめ。

テンソルを使いこなしたい1(アインシュタインの縮約記法)

「ゼロから作るディープラーニング1」で、Affineレイヤの逆誤差伝播のために行列積の行列微分がシレっとでてきた。一旦書き下して納得はしたものの、行列の順序を意識しながら連鎖律を操るのはシンドイ。そこで、Einsteinの縮約記法でテンソルを扱えたらスッキリするのではと思ったので扱い方のメモ。以下がわかれば簡単な微分についても同様のノリで計算できるようになる。気が向いたら書く。

テンソルとは

ベクトルとか行列の多次元への拡張版。まとめてテンソルって呼ぶことにしましょうってノリで良いのでは(知らんけど)。

スカラー:0階テンソル
ベクトル:1階テンソル
行列  :2階テンソル

のような対応がある。

Einsteinの縮約記法

 \sum_iとか行列の次元とか、自明なものはどんどん省略しちゃおうぜってことらしい。

例)

 s    :0階テンソル
 \boldsymbol{u, v}  :1階テンソル
 \boldsymbol{T, A, B}:2階テンソル

とおくと、

$$ \begin{align} {\boldsymbol u}^T {\boldsymbol v} \longrightarrow \delta_{ij} u_{i} v_{j} = u_i v_i \label{tensor0} \end{align} $$

 \delta_{ij}クロネッカーのデルタ。直接対応しているわけではないが、この指標表示が意味するところは

$$ \begin{align} \mathrm{Tr}\hspace{1pt} \left({\boldsymbol u} {\boldsymbol v}^T \right) \end{align} $$

と同じようなものである。

$$ \begin{align} {\boldsymbol T} {\boldsymbol v} \longrightarrow T_{ij} v_j \label{tensor1} \end{align} $$

$$ \begin{align} {\boldsymbol u} {\boldsymbol v}^T &\longrightarrow u_i v_j \label{tensor2.1} \end{align} $$

$$ \begin{align} {\boldsymbol A} {\boldsymbol B} \longrightarrow A_{ij} B_{jk} \label{tensor2.2} \end{align} $$

ここで重要なのは、ベクトルや行列の成分を表す i, jなどの添字には特別な意味がない事で、次元の下限、上限を文脈から読み取ることになる。添字を表すのに無駄に文字を消費せずに済む。

また、計算結果に影響を与えないダミー指標がある。\eqref{tensor2.2}で言えば jがダミー指標で、計算の過程で総和をとるので計算結果に影響を与えない。つまり、計算のためだけに一時だけに導入された使い捨ての添字がダミー指標である。

テンソル積(Einsteinの縮約記法 ver.)

では、直積(クロス積*1、2つのベクトルのテンソル積)をEinsteinの縮約記法に書き直してみる。

$$ \begin{align} {\boldsymbol T} = {\boldsymbol u} \otimes {\boldsymbol v}^T \longrightarrow T_{ij} = {\boldsymbol u}_{i} {\boldsymbol v}_{j} = {\boldsymbol v}_{j} {\boldsymbol u}_{i} \label{outer} \end{align} $$

テンソルの成分を明示的に扱っているので行列積のように積の順序を気にしなくてよくなる。これだけでも大分スッキリする。

テンソル内積

そりゃそうだよねって形だけど念のため。

$$ \begin{align} {\boldsymbol A} \cdot {\boldsymbol B} = \delta_{ik} \delta_{jl} A_{ij} B_{kl} \end{align} $$

縮約記法から元々の記法へ

各成分へ基底をかけて和をとるだけ。
見たほうが早い。

$$ \begin{align} {\boldsymbol T} &= \left( \begin{array}{ccc} T_{11} & \ldots & T_{1n} \\ \vdots & \ddots & \vdots \\ T_{m1} & \ldots & T_{mn} \end{array} \right) \\ &= \sum_{i=1}^{m} \sum_{j=1}^{n} T_{ij} \left({\boldsymbol e}_i \otimes {\boldsymbol e}_j \right) \end{align} $$

なお、 {\boldsymbol e}_i,  {\boldsymbol e}_jは基底を表す。

まとめ

アインシュタイン先生に感謝

*1:内積に対して外積とも呼ばれることがある。ただし直積と外積は3次元では一致するが同義ではないことに注意が必要。また、outer productは直積の意味で使われるので日本語と英語の違いにも注意すること