-
アインシュタインの縮約記法
-
テンソル積を書くと大量の $\Sigma$が出てきてうざい
-
なので, $\Sigma$を省略しよう, というのが事の始まり
-
$\sum_{j} a_{i,j}b_{j,k}$ なら
ij,jk → ik
-
プログラム的に考えれば, 単純にfor を外しただけ
- 例えば
- ドット積
z[i,j](https://scrapbox.io/yuwd/i%2Cj) += x[i,j](https://scrapbox.io/yuwd/i%2Cj) * y[i,j](https://scrapbox.io/yuwd/i%2Cj)
np.einsum("ij,ij->ij", x, y)
- 内積
z[j,k](https://scrapbox.io/yuwd/j%2Ck) += x[j,i](https://scrapbox.io/yuwd/j%2Ci) * y[i,k](https://scrapbox.io/yuwd/i%2Ck)
np.einsum("ji,ik->jk", x, y)
-
軸の入れ替えなどでも使える
y = torch.einsum('nchw->nhwc', y).detach().cpu()
-
-
実際は遅いからやめたほうが良さそう
-
でもMAEの実装で使われてるからなぁ…
JavaScriptを有効にしてください
einsum
· ☕ 1 min read