JavaScriptを有効にしてください

einsum

 ·  ☕ 1 min read
  • アインシュタインの縮約記法

    • テンソル積を書くと大量の $\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の実装で使われてるからなぁ…

共有

YuWd (Yuiga Wada)
著者
YuWd (Yuiga Wada)
機械学習・競プロ・iOS・Web