画像の空間方向にConvもAttentionもMLPもしないでShiftするだけの論文まとめ

この頃増えているMLP系構造の画像認識向けネットワークで、とうとう空間方向にConvもAttentionもMLPもしない論文が出てきたので、まとめる。
---
追記（2022/10/4）:　
気付いてないだけで、MLP系以外でもシフトはいろいろと合った・・・。

そもそもConvの時代に、ResNetのConvをシフトでやれば軽いという最初の論文
[Shift: A Zero FLOP, Zero Parameter Alternative to Spatial Convolutions](https://openaccess.thecvf.com/content_cvpr_2018/papers/Wu_Shift_A_Zero_CVPR_2018_paper.pdf)(2018 CVPR)
とはいえ、シフトで動かしまくるとmemory footprintがやばいってのから、派生して
[TSM: Temporal Shift Module for Efficient Video Understanding](https://openaccess.thecvf.com/content_ICCV_2019/papers/Lin_TSM_Temporal_Shift_Module_for_Efficient_Video_Understanding_ICCV_2019_paper.pdf)(2019 ICCV)
どれだけどこにシフトするかも学習させちゃえ(active shift)って派生
[Constructing Fast Network through Deconstruction of Convolution](https://proceedings.neurips.cc/paper/2018/file/9719a00ed0c5709d80dfef33795dcef3-Paper.pdf)(2019 NeurIPS)
シフトするのは、全チャンネルじゃなくてちょっとで良い(Sprse shift)という派生
[All You Need is a Few Shifts: Designing Efficient Convolutional Neural Networks for Image Classification](https://openaccess.thecvf.com/content_CVPR_2019/papers/Chen_All_You_Need_Is_a_Few_Shifts_Designing_Efficient_Convolutional_CVPR_2019_paper.pdf)(2019 CVPR)

で、こっちの流れからViTにシフトをいれたやつ
[When Shift Operation Meets Vision Transformer: An Extremely Simple Alternative to Attention Mechanism](https://arxiv.org/abs/2201.10801v1)(2022 arXiv)

なんなら昔バズったLocal Binary CNNも、この一部
Filterの方は、LBP encodingと言ってセンターが‐1で、それ以外が0と１のみの学習をしないConvフィルターを使い、その後で普通の1x1Conv
[Local binary convolutional neural networks](https://openaccess.thecvf.com/content_cvpr_2017/papers/Juefei-Xu_Local_Binary_Convolutional_CVPR_2017_paper.pdf)(2017 CVPR)
つかそもそも、フィルターは1か‐1でランダムで良くね？　って、ことで同じ人たちが、学習なしbinaryフィルターを全体にかけて、その後で普通の1x1Conv
[Perturbative neural networks](https://openaccess.thecvf.com/content_cvpr_2018/papers/Juefei-Xu_Perturbative_Neural_Networks_CVPR_2018_paper.pdf)(2018 CVPR)
そもそも、Weightを1と‐1にしたいのは、入力のピクセルが$x_i$で、そのWeightが$b_i=\\{1, -1\\}$の場合
1. $A= \sum_{b_i = 1} x_i$
1. $N = \sum_{i} x_i$
1. $\sum_{i} b_i x_i = 2A-N$

が使えて、ANDとシフトオペレーションで済むから。
更に言うと、この方法を使えば、入力$x_i$に対して、フィルターの値が$y_i$なら、以下の[binary approximation手法](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.294.6884&rep=rep1&type=pdf)が使える
1. $y_i = s^1 b_i^1 + d_i$ 全体を$s$でスケールする
1. $y_i = (\sum_j^n s^j b_i^j) + d_i^n$ 大きい値からスケールすることで、あまりの$d$が小さくなる
1. $\sum_{i} b_i x_i = (\sum_j^n s^j (\sum_i b_i^j x_i)) + \sum_i d_i^n x_i$



---

MLP系ネットワークってなんぞという人は、こちらから。
[画像向けMLP系初期ネットワーク構造まとめ](https://qiita.com/TeamN/items/4135f9a8971d5185ea74)

2021年の6月と7月の基本同時期、Arxivに、以下の3本の論文が中国から出ている。

- [S2-MLP: Spatial-Shift MLP Architecture for Vision](https://arxiv.org/abs/2106.07477)
- [AS-MLP: An Axial Shifted MLP Architecture for Vision](https://arxiv.org/abs/2107.08391)
- [CycleMLP: A MLP-like Architecture for Dense Prediction](https://arxiv.org/abs/2107.10224)

今までの（と、言っても2021年5月に始まったばっかだけど）MLP系は、TokenとChannelをバラバラに混ぜていたけれど、ここでは、Tokenは混ぜない。Channelで混ぜるときに、Channelごとに同じTokenを混ぜるのではなく、ちょっとずらして混ぜる。Tokenを混ぜるときに、ちょっとずらす（Shiftする）だけでOKというのが基本的なアイディア。

## S2-MLPについて

一応（ほぼほぼ同時期だけど）、一番最初に出たBaiduの論文。
図が一目瞭然でわかりやすい！
![S2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/a2a7f14b-fa19-f708-b63a-27668f9df58b.png)
基本的にMLP-mixerの形状をしているが、fully-connectedは全てChannelの方向で行う。
spatial-shiftは、下の図にあるように、チャンネル方向に４つのグループに分けして1 token違う方向にShiftするだけ。動かさないってのはないらしい。考え方としては、Depthwise Convで一つの方向から１を取り、残りが０というKernelを使うのと同義で、空間方向ではConvと同じで、全ての場所で同じLocalな（小さい）Kernelが使われる。
Channel方向では、MLP-mixerは、全て同じ空間カーネルが使われ、Depthwise Convは全て違う空間カーネルが使われるが、S2-MLPではグループごとに同じShiftになる。

こんな感じで、パーツごとに何が重要かを分類し、別のMLP系のネットワークを構築し、同じチームが2週間後にArxivに乗せている。その名も
[Rethinking Token-Mixing MLP for MLP-based Vision Backbone](https://arxiv.org/abs/2106.14882)
いろいろと速い・・・。
こっちでは、 Circulant Channel-Specific（CCS）というのを提案していて、MLP-mixer系、Depthwise Conv系、上のS2と比較したのが、以下。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/00a44a80-fb6c-febf-728d-53f4fb2096c9.png" width="80%">
CCSの方は、Token MixingをChannel方向に回転させて、計算をFFTで行う。とはいえ、パッチの数が小さいときは、速さの恩恵は受けられないとのこと。

S2-MLPの方に戻って、こっちは空間方向の計算がないので、軽い！　これで、他のMLP系と比較すると同規模でImageNet-1Kの精度が上がっている。
Shiftの方向に関しては、ImageNet100でAblation studyをしている。
![S2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/2dba37d4-fc76-5a18-1980-c929b6331b20.png)
ということで、左右と上下のみがちょうど良さそう。　

こいつ、8月には、Version 2が出てまして、
[S2-MLPv2: Improved Spatial-Shift MLP Architecture for Vision](https://arxiv.org/abs/2108.01072)
以下二つにあるようなピラミッドとsplit attentionぽくすると（以下図）self-attentionなしでSOTAとのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/36a63b3f-712f-d334-eb26-bc246d53f5df.png)


## AS-MLPについて

基本的には、上の構造と同じだが、Shiftをまとめてやらずに、縦Shiftと横Shiftにわけて組み合わせる。

![AS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/4cb23cf2-84e3-069c-9c7d-f13ad43bf37c.png)
どうも、バラバラにやって足し合わせる方が、順番にやって行くより精度が良かったらしい。
![as_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/f54843af-6a37-8b10-3f26-d0162b65cea6.png)
こちらは、以下のように縦横Shiftのみだが、いろいろなサイズや、穴あき版（Dilation）なども調べている。
![as_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/2d065b3f-9135-333a-c911-5b7e835f1806.png)
Shift size (1, 1)というのは、Channel-mixingのみと同じになる。
また、Shiftすることで出来る空間のPaddingもいろいろと試している。
![as_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/f48c21fe-7e96-6748-397e-0a416944153e.png)
S2-MLPと同じように、1 tokenシフトするだけで、十分良い結果が出ている。

AS-MLPでは、オリジナルのMLP系と違い、ピラミッド構造を使用していろいろな絵のサイズに対応できるようにしてある。ImageNet-1Kにおいては、同規模で、他のMLP系より良く、Transformer系と同程度になった。また、ピラミッド構造により、COCOのObject detectionや、ADE20KのSemantic segmentationにも対応できるようなり、Transformer系と同程度の精度が出せるようになった。

## CycleMLPについて

S2-MLPとほぼ同じ構造で、AS-MLPと同じようにピラミッドが入っている。AS-MLPの3日後にArxivに入っていて、結果はImageNetで同等、COCOとADE20Kで、AS-MLPかな。ともあれ、MLP系でもObject detectionとSemantic segmentationに適用可ということが示され、また新たな戦いがここから始まる。

というか、この競争の激しさは、いったい何なのかと。
![cycle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730426/fdd9cc73-2f0f-a4a7-9aae-64dfd6ff7faf.png)
とうとう、出版月まで書き始めているのに、すでに3日提出が遅れて負けるという・・・。
 
## まとめ

ということで、あれだけ重要だと思われていた空間上の計算もシフトすればOKという衝撃的な内容が同時期に3本。
組み込み系では、ゲームチェンジャーになるかもしれないし、組み込まない人には割とどうでも良い結果かもしれない。