画像認識の大革命。AI界で話題爆発中の「Vision Transformer」を解説！

* **2020/10/24: [公式実装](https://github.com/google-research/vision_transformer)の追加**

**オミータです。[ツイッター](https://twitter.com/omiita_atiimo)で人工知能のことや他媒体の記事など** を紹介していますので、人工知能のことをもっと知りたい方などは **[@omiita_atiimo](https://twitter.com/omiita_atiimo)をご覧ください！**
他にも次のような記事を書いていますので興味があればぜひ！

> * [深層学習界の大前提Transformerの論文解説！](https://qiita.com/omiita/items/07e69aef6c156d23c538)
> * [自然言語処理の王様「BERT」の論文を徹底解説](https://qiita.com/omiita/items/72998858efc19a368e50)
> * [Self-Attentionを全面的に使った新時代の画像認識モデルを解説！](https://qiita.com/omiita/items/f4fad6371747e718310e)
> * [パラメータ数10億！最新の巨大画像認識モデル「BiT」爆誕 & 解説](https://qiita.com/omiita/items/90abe0799cf3efe8d93d)
> * [画像認識の定番データセットImageNetはもう終わりか](https://qiita.com/omiita/items/e1e377f30f624ad705b2)

# 画像認識の大革命。AI界で話題爆発中の「Vision Transformer」を解説！

遂に訪れてしまいました。今度こそ本当に畳み込みがさよならしてしまうかもしれません。提案モデルの名前はVision Transformer、通称**ViT**です。ViTは、**Transformer[[拙著解説]](https://qiita.com/omiita/items/07e69aef6c156d23c538)をほぼそのまま画像分類タスクに用いることで**、ImageNet/ImageNet-ReaL[[拙著解説]](https://qiita.com/omiita/items/e1e377f30f624ad705b2)/CIFAR-100/VTABでSoTAモデルと同程度またはそれを**上回る性能を達成**したのです。しかもSoTAモデルたち(BiT[[拙著解説]](https://qiita.com/omiita/items/90abe0799cf3efe8d93d)/NoisyStudent[[拙著解説]](https://ai-scholar.tech/articles/treatise/noisy-student-ai-379))と比べて**計算コストは$\frac{1}{15}$程度**にまで落としています(SoTAをさらに上回ったモデルでも$\frac{1}{4}$~$\frac{1}{5}$程度にまで落としてる)。今回取り扱う[論文](https://openreview.net/forum?id=YicbFdNTTy)はICLR2021のOpenReviewで登場しまだレビュー中ではありますが、NLPでTransformerがRNNを駆逐したように、**画像認識でもTransformerがCNNを駆逐するのではないか**ということでものすごく注目されています。それでは**期待の新モデルViTについて見ていきましょう**。

<img src="https://i.imgur.com/AUO8PCY.png" alt="vit_img?" width="500">





**本記事の流れ**:

- **忙しい方へ**
- **Vision Transformerの解説**
- **Vision Transformerによる実験結果**
- **まとめと所感**
- **参考**


> 原論文: ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)](https://openreview.net/forum?id=YicbFdNTTy)
> 公式実装: [JAX/FLAX](https://github.com/google-research/vision_transformer) 
> 実装: [PyTorch](https://github.com/lucidrains/vit-pytorch)(非公式)


|略称|名称|
|:--:|:--|
|**ViT**|Vision Transformer|
|**BiT**|Big Transfer|
|**LN**|Layer Normalization|
|**SA**|Self Attention|



## 0. 忙しい方へ

* **完全に畳み込みとさようならしてSoTA達成**したよ
* Vision Transformerの重要なことは次の**3つ**だよ
  * **画像パッチ**を単語のように扱うよ
  * アーキテクチャは**Transformerのエンコーダー**部分だよ
  * **巨大なデータセット**JFT-300Mで事前学習するよ
* SoTAを上回る性能を**約$\frac{1}{15}$の計算コスト**で得られたよ
* 事前学習データセットとモデルをさらに大きくすることで**まだまだ性能向上する余地があるよ**

<img alt="vit_fig1l" src="https://i.imgur.com/61w6ZQL.png" width=500>

## 1. Vision Transformerの解説
Vision Transformer(=**ViT**)の重要な部分は次の3つです。

1. **入力画像**
2. **アーキテクチャ**
3. **事前学習とファインチューニング**

それぞれについて見ていきましょう。

### 1.1 入力画像

まず入力画像についてです。ViTはTransformerをベースとしたモデル(というより一部を丸々使っている)ですが、そんなViTに画像をどうやって入力するのでしょうか。まず、Transformerでは各単語がベクトル表現となっている文を一気に入力していましたね。

<img alt="vit_van" src="https://i.imgur.com/nYBrHcz.png" width=500>

しかし今回はTransformerで画像を扱いたいです。どうすれば良いのでしょうか。

<img alt="vit_img?" src="https://i.imgur.com/AUO8PCY.png" width=500>

答えは簡単で、下図のように**画像をパッチに分けて各パッチを単語のように扱う**だけです。

<img alt="vit_patch" src="https://i.imgur.com/x8AIPhz.jpg" width=500>

各パッチを単語のように扱うので、実際は**パッチをベクトルにFlattenしています**。下図では左から2枚目のパッチに対する例のみを示していますが、全てのパッチが同様にベクトルへとFlattenされてからエンコーダーへと入力されています。

<img alt="vit_flatten" src="https://i.imgur.com/WOaRwAy.png" width=500>

最後にこれを記号を用いて表します。元画像が$\mathbf{x}\in\mathbb{R}^{H\times W\times C}$だとすると、FlattenしてからViTに入力するということは **$\mathbf{x}_p\in\mathbb{R}^{N\times (P^2\cdot C)}$というベクトルにしてから入力する**ということです。ここで$N$はパッチ数で、$P$はパッチの大きさになります。ここでパッチは正方形であり、$N$はつまり$N=HW/P^2$とも表せます。上図で元画像のサイズが256だとすると、$N=4, P=128$ということになります。それではアーキテクチャを見てみましょう。

### 1.2 アーキテクチャ

#### 1.2.1 アーキテクチャの説明
続いてアーキテクチャに入っていきます。と言っても、**ほぼTransformerのエンコーダーと同じ**です(つまり、ほぼBERT[[拙著解説]](https://qiita.com/omiita/items/72998858efc19a368e50)です)。エンコーダーの中身は下図のようになっています。参考までに[[Vaswani, A.(NIPS'17)]](https://arxiv.org/abs/1706.03762)で提案されたオリジナルのTransformerのエンコーダーも右上に載せました。

<img alt="vit_enc" src="https://i.imgur.com/6zxCAoD.png" width=500>

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))改変

ここでNormはLayer Normalization(=**LN**)[[Ba, J.(2016)]](https://arxiv.org/abs/1607.06450)を指しています。上図を見るとわかるように、**ほぼオリジナルのエンコーダーと同じ**です。ただオリジナルとの相違点は2つあり、

* **Pre-Norm**[[Wang, Q.(ACL'19)]](https://arxiv.org/abs/1906.01787): NormがMulti-Head Attention / MLPの前に位置する。
* **GELU**[[Hendrycks, D.(2016)]](https://arxiv.org/abs/1606.08415):MLPは2層で活性化関数にGELUを採用(BERTも同様。オリジナルはReLUを使用。)。

くらいです(他にもあれば[ツイッター](https://twitter.com/omiita_atiimo)かコメントで教えて下さい！)。
上図で、ViT Encoderの入力を見ると **"Embedded"** Patchesとなっています。つまり、第1ブロック目の**ViT Encoderへの入力は「1.1入力画像」で用意したPatchベクトルたちをさらに埋め込んだもの**になります。これもオリジナルTransformerと同様です。ここでの埋め込みには、$\mathbf{E}\in\mathbb{R}^{(P^2\cdot C)\times D}$と(ViTはSelf-Attentionのみのためパッチの位置情報がないため、)位置エンコーディング$\mathbf{E}_{pos}\in\mathbb{R}^{(N+1)\times D}$の2つを用います。具体的には次のように用います。

* **$\mathbf{E}$で各パッチを長さ$(P^2\cdot C)$から$D$のベクトルに埋め込む**
* **各パッチに位置エンコーディング$\mathbf{E}\_{pos}$を加算**

ここでもしかしたら、位置エンコーディングの$\mathbf{E}\_{pos}$が$\mathbf{E}\_{pos}\in\mathbb{R}^{(N+1)\times D}$のようにパッチ数の$N$ではなく、$(N+1)$となっていることに気づいた方も居るかもしれません。これは、実は$\mathbf{E}$で埋め込んだ後に実は**入力の先頭に`[CLS]`トークンを連結する**からです。これはBERTと全く同じですね。`[CLS]`トークンにも位置エンコーディングを足すので「パッチ$+$`[CLS]`$=N+1$」となるわけです。ちなみに**位置エンコーディングも学習可能**になっています。**画像分類では`[CLS]`トークンの出力を識別器(MLP)に入れることで最終的な予測が出せます**。ここまでを全てまとめると下図のようになり、ViTが完成します。

<img alt="vit_fig1l" src="https://i.imgur.com/61w6ZQL.png" width=500>

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))

#### 1.2.2 式でまとめ

ここまでの流れを式でまとめます。式と言ってもここまで理解していればかなり単純です。

##### 1.2.2.1 **パッチの埋め込みと位置エンコーディング**

```math
\mathbf{z}_0 = [\mathbf{x}_{\text{class}};\ \mathbf{x}_p^1\mathbf{E};\ \mathbf{x}_p^2\mathbf{E};\ \cdots;\ \mathbf{x}_p^N\mathbf{E}] + \mathbf{E}_{pos}, \qquad \mathbf{E} \in \mathbb{R}^{(P^2 \cdot C) \times D}, \mathbf{E}_{pos} \in \mathbb{R}^{(N + 1) \times D} \tag{1}
```

$\mathbf{x}\_p^k$は$k$個目のパッチを表しています。上述したとおり、各パッチ$\mathbf{x}\_p^k$を$\mathbf{E}$で埋め込み、`[cls]`トークンを連結したのち、位置エンコーディング$\mathbf{E}\_{pos}$を加算しています。ちなみに **$\mathbf{E}$の代わりにResNetで各パッチを埋め込んでも良さそう**です。この場合、パッチはFlattenさせずにResNetへと入力し、その出力に対してFlattenを行います。論文中ではパッチの最初の埋め込みにResNetを用いる手法のことを**ハイブリッド**と呼んでいます。

##### 1.2.2.2 **エンコーダー**

```math
\begin{align}
\mathbf{z}'_l &= \text{MSA}(\text{LN}(\mathbf{z}_{l - 1})) + \mathbf{z}_{l - 1}, & l &= 1 \ldots L \tag{2} \\
\mathbf{z}_l &= \text{MLP}(\text{LN}(\mathbf{z}'_l)) + \mathbf{z}'_l, & l &= 1 \ldots L \tag{3}
\end{align}
```

式(2)はマルチヘッドAttentionを表し、式(3)はMLPを表しています。しっかりとスキップ結合も行われていますね。

##### 1.2.2.3. **MLPヘッド**

```math
\mathbf{y} = \text{LN}(\mathbf{z}_L^0) \tag{4}
```

そして最後に式(4)です。$\mathbf{z}\_L^0$は最終層の出力における前から0番目のベクトル表現のことなので、つまり`[cls]`トークンの最終出力ですね。これをLNに入れて、$\mathbf{y}$を得ます。MLPヘッド自体の式は論文中には出てこないのですが、あとはこの$\mathbf{y}$をMLPに入れるだけで最終的な予測まで出せます。これでアーキテクチャの説明は終わりになります。

### 1.3 事前学習とファインチューニング

<img alt="vit_pre_fine" src="https://i.imgur.com/4tZYgM7.png" width=500>

ここではViTの重要な部分の3つ目の事前学習とファインチューニングについて説明します。ViTでは、今までの画像認識モデルたちと同様に **「巨大なデータセットで事前学習 + ファインチューニング」** という手順で学習をします。**ファインチューニングの際には、ViTのMLPヘッドを取り替えます**。このほかに3点ほど工夫を加えています。

* 事前学習時の解像度(e.g 224)よりも**ファインチューニング時の解像度を大きく**(e.g 384)する。[[Touvron, H.(NeurIPS'19)]](https://arxiv.org/abs/1906.06423)
* **パッチの大きさは事前学習とファインチューニングで一定**。(つまり、ファインチューニング時は解像度が大きいのでパッチの数が増える。)
* 事前学習で学習した**位置エンコーディングはファインチューニング時には足りないところを内挿で補う**。

これだけです。それではこのViTがどれだけすごいのかを実験で見てみましょう。


## 2. Vision Transformerの実験結果
### 2.1 実験条件
ViTでの実験ではImageNetが小規模データセットとして扱われています。規模がドデカすぎます。

* **データセット**:
    * **事前学習**:
        * **ILSVRC-2012 ImageNet**: 小規模。クラス1,000個の計130万枚。
        * **ImageNet-21k**: 中規模。クラス21,000個の計1,400万枚。
        * **JFT-300M**: 大規模。クラス18,000個の計3億枚。Googleにあるプライベートデータセット。
    * **ファインチューニング**:
        * ImageNet
        * ImageNet-ReaL: より正確にアノテーションされた評価用ラベル。[[拙著解説]](https://qiita.com/omiita/items/e1e377f30f624ad705b2)
        * CIFAR-10/100
        * Oxford-IIIT Pets
        * Oxford Flowers-102
        * VTAB: モデルの転移学習を評価する19個の画像データセット群[[記事]](https://ai.googleblog.com/2019/11/the-visual-task-adaptation-benchmark.html)
            * Natural: 一般的な画像データセット。7個がこれに属す。
            * Specialized: 医療データなどの専門的な画像データセット。4個がこれに属す。
            * Structured: 人工3D空間などの画像データセット。

* **モデル**:
![vit_tab1](https://i.imgur.com/M0XrkzD.png)
モデルはBase(B)/Large(L)/Huge(H)の3つを用います。層の数なども[BERT](https://qiita.com/omiita/items/72998858efc19a368e50#131-bert%E3%81%AE%E6%A6%82%E8%A6%81)に倣ってますね。それにしてもHugeのパラメータ数6億は化け物です。
  
||事前学習|ファインチューニング|
|:--:|:--:|:--:|
|**オプティマイザー**|Adam|モーメンタム付きSGD|
|**バッチサイズ**|4096|512|
|**画像サイズ**|224|384(†)|

* (†) ImageNetでのファインチューニングでのみ画像サイズに512や518が用いられています。
* ViT-Hにおいてのみ重みは係数0.9999の移動平均[[Polyak, B.(1992)]](https://www.researchgate.net/publication/236736831_Acceleration_of_Stochastic_Approximation_by_Averaging)になっています。(こちらの[記事](https://coffee-g9.hatenablog.com/entry/Polyak_averaging)がわかりやすかったです。)
* **モデルは「ViT-(1)/(2)」という名前**で表され(1)にはモデルサイズB/L/Hが入ります。(2)にはパッチの大きさの16や14などが入ります。ViT-L/16であればViT-Largeで入力画像のパッチの1つの大きさが16であるモデルのことです。
* (余談ですが、ImageNetを小規模と言っているのに驚きました。)

実験は大きく分けて以下の3つです。

* **SoTAとの比較**
* **事前学習の考察**(データサイズや計算コスト) 
* **ViTの考察**

### 2.2 SoTAとの比較

![vit_tab2](https://i.imgur.com/ovKWnY6.png)

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))


まずViT-H/14とViT-L/16をJFT-300Mで事前学習させた場合の結果をSoTAモデルの[BiT-L](https://qiita.com/omiita/items/90abe0799cf3efe8d93d)と[NoisyStudent](https://ai-scholar.tech/articles/treatise/noisy-student-ai-379)と比較します。SoTAモデルたちはもちろんCNNです。上表を見ると一目瞭然で、**ほぼ全てでVision TransformerがSoTAを更新**してしまっています。CIFAR-100においては1%も更新しています。ただImageNetにおいてNoisy Studentにわずかに及んでいませんが、より正確にアノテーションされたReaLでは上回っているので**ViTの方が優れている**と言えそうです。

また、ViTは計算時間も大幅に削減しています。上表のTPUv3-daysはJFT-300Mでの事前学習にかかった時間を表しています。BiTとNoisyStudentではおよそ1万TPUv3-日かかっていたものが、**ViT-H/14では約$\frac{1}{4}$~$\frac{1}{5}$ほど**にまで削減され**ViT-L/16においてはBiT-Lよりも少し良い性能が約$\frac{1}{15}$程度の日数**で得られています。(と言ってもViT-H/14は2,500TPUv3-日もかかるので私のような庶民には再現性皆無です。)

![vit_fig2](https://i.imgur.com/3NdHP4V.png)

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))


さらにVTABのNatural/Specialized/Strucuterdそれぞれでの性能を比較してみます。比較にはViT-H/14とBiT-Lの他にVTABにおいて前までSoTAだったVIVI[[Tschannen, M.(CVPR'20)]](https://arxiv.org/abs/1912.02783)とS4L[[Zhai, X.(ICCV'19)]](https://arxiv.org/abs/1905.03670)の4つを用いています。上図を見ると**VTAB全体/Specialized/StructuredではViT-H/14が最も良い**ことがわかります。NaturalにおいてのみBiT-Lに少し劣ってしまっていますが、論文ではこれを誤差の範囲内としています。このようにViTは幅広い転移学習でとても有効であることがわかりますね。

### 2.3 事前学習の考察

さきほどJFT-300Mという巨大なデータセットで事前学習した結果、見事ViTでSoTAを達成することができました。それでは**事前学習で用いるデータセットのサイズはどれほど重要なのでしょうか**。また、**上述したHybrid(=入力パッチをResNetで埋め込むViT)とのコスパも比較**してみます。

#### 2.3.1 事前学習でのデータセットサイズ

まず、事前学習のデータセットとしてImageNet(小)/ImageNet-21k(中)/JFT-300M(大)をそれぞれ用いた場合の、ImageNetへのファインチューニングの性能を見てみます。

<img alt="vit_fig3" src="https://i.imgur.com/lIIiBZM.png" width=500>

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))


比較としてBiTでの結果(BiT-Lともう1つは[ここ](https://qiita.com/omiita/items/90abe0799cf3efe8d93d#141-%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%95)を参考にするとResNet50っぽいです。)も示されています。ここから言えるのは、**ViTは小さいデータセットでの事前学習ではあまりよくはないが、巨大なデータセットで真価を発揮する**ということです。ViTの事前学習には巨大なデータセットが必須なようですね。


続いて事前学習のJFT-300Mを小さくした場合でも実験をしています。ここではJFT-300Mのうち9M/30M/90M/300Mを用いた場合の結果は以下図です。

<img alt="vit_fig4" src="https://i.imgur.com/ojdbEO3.png" width=500>

ViT-bとは、ViT-Bの幅(つまり、隠れ層の次元)を半分にしたものだそうです。こちらでも先ほどと同じような傾向が見られ、**90M以上でViTが本領発揮してくることがわかります**。一方で**9MではViTはボロボロ**ですね。ここから言えることは、畳み込みが持つ「局所性」のようなバイアスはデータ数が少ない場合には有効だが、**データ数が大きい場合にはむしろ不要**となるということです。これはおもしろいですね。

#### 2.3.2 Hybridとのコスパの比較

Hybridとのコスパ比較も見てみましょう。大小様々なResNet(5つ)/ViT(6つ)/Hybrid(4つ)をJFT-300Mで事前学習させます。この時の計算量と転移学習での精度をプロットしたものが下図です。転移学習の結果はAverage-5(左図)とImageNet(右図)のものです。ここで、Average-5がどの5つかという言及は論文中にはありませんでしたが、ImageNet/CIFAR10/CIFAR100/Pets/Flowersの5つのデータセットに対する平均値だと思われます(表2の値からそう思われます)。

![vit_fig5](https://i.imgur.com/nifg2rC.jpg)

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))改変

この図から言えるのは3つあります。上表の番号が下の3つに対応しています。

1. **ViTはBiTよりもコスパが良い**。(低コストで同じ性能を達成)
2. **コストが限られている場合はHybridが有効**。(高コストではHybridもViTも差がなくなる)
3. **ViTがまだ飽和しておらず、さらなる性能向上**が期待できる

### 2.4 ViTの考察

ViTについて理解するためにさらなる分析を行っています。ここでは次の4つを行っています。

1. **ViTの埋め込み層**
2. **ViTの位置エンコーディング**
3. **Attentionの適用範囲**
4. **自己教師あり学習**

#### 2.4.1 ViTの埋め込み層

<img alt="vit_fig7l" src="https://i.imgur.com/pj2XHfR.png" width=500>

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))


ViTでは初めに埋め込み層を用いていました。その埋め込み層で学んだものを可視化したものが上図になります。一切畳み込みを用いていないのにもかかわらず、横線や縦線など**CNNの低レイヤーで学ぶようなものをしっかりと学習**できています。

#### 2.4.2 ViTの位置エンコーディング

![vit_fig7c](https://i.imgur.com/XngXHxi.png)

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))


ViTでは埋め込んだあとにさらに学習可能な位置エンコーディングを加算していました。位置エンコーディング同士がどれだけ似ているのかを表しているのが上図です。ぱっと見では少しわかりづらいかもしれないので、例を用いてこの図の見方を説明します。

そもそも上図はViT-L/32を用いた時の位置エンコーディングを表しており、上図からも1枚の画像に対するパッチ数が全部で49個(=7x7)あることがわかります(つまり元画像の大きさは32x7=224なので224x224と推測されます)。ここで、上図内の位置(1,1)(つまり一番左の一番上)にある1マスを見てみましょう。そこだけを抜き出すと下図です。

<img alt="vit_pos11" src="https://i.imgur.com/NgdzOER.png" width=500>

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))


これは、**位置(1,1)の位置エンコーディングと他の位置たちの位置エンコーディングたちとの類似度を全部表したもの**になります。上図を下のように書けばもっとわかりやすいと思います。

<img alt="vit_pos11_grid" src="https://i.imgur.com/yRB7OYk.png" width=500>

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))改変


これは上述したように位置(1,1)と他の位置たちとのコサイン類似度を表していおり、上図の(1,1)は自分自身ですのでもちろん1(黄色)となっています。一方で位置(7,7)は遠いのでしっかりと類似度が低く(濃い緑色)なっていますね。ここで位置(1,1)と同じ行または列の位置エンコーディングは比較的似ています(黄緑色)。この同じ行/列の位置エンコーディング同士は似るという傾向は、いずれの位置でも見られます。その証に、先ほどの全体像に戻ると**どのマスも十字のような模様**が出ていますね。これがまさに、**同じ行/列の位置エンコーディング同士は似た値になるように学習されている**ことを表しています。

![vit_fig7c](https://i.imgur.com/XngXHxi.png)

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))


#### 2.4.3 Attentionの適用範囲

ViTはAttentionをフルに使っています。畳み込みと比較してAttentionの良さの1つに**全体を俯瞰できる**ことがあります。実際にViTはAttentionを用いて画像全体を俯瞰しているのでしょうか。それを調べるためにまず論文では「Attention距離」というものを定義しています。Attention距離とは、AttentionスコアによるAttention適用位置の加重和になっており、感覚的にはある位置から遠い位置ばかりAttentionスコアが大きい場合にはAttention距離も大きくなり、逆に近い位置たちにばかりAttentionスコアが偏っていたらAttention距離も小さくなります。つまり、**Attention距離はCNNで言うと「Receptive Fieldの大きさ」** ということになります。

このAttention距離を各層のヘッドごとに表したものが下図になります。横軸が各層、縦軸がAttention距離で点がヘッドを表しています。

![vit_fig10](https://i.imgur.com/RpY4cJn.png)

> ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)]((https://openreview.net/forum?id=YicbFdNTTy))改変

左図がViT-L/16で右図がHybridを表しています。この図から言えることは3つです。下の番号は上図内の番号と対応しています。

1. 低レイヤーではAttention距離が小さいヘッドが一定数存在する。つまり、**低レイヤーではCNNのように局所的な特徴量を抽出**している。
2. 低レイヤーでもAttention距離が大きいヘッドが一定数存在する。つまり、**低レイヤーでは大域的な特徴量も抽出**している。
3. Hybridの低レイヤーではAttention距離の小さいヘッダーが激減することからも、**低レイヤーでのAttention距離が小さいヘッドたちはCNNのような役割を果たしていた**ことがわかる。

#### 2.4.4 自己教師あり学習

最後に、論文ではJFT-300Mのラベルをフルに用いた事前学習の代わりにBERTにならって**Masked Patch Prediction**による事前学習も行っています。これによりMasked Patch Predictionで事前学習したViT-16/BがImageNetを**スクラッチから学習させたモデルよりも2%ほど高い**性能を示したようですが、JFT-300Mの**ラベルをフルに用いた事前学習よりは4%低い**結果になったようです。ただ、BERTに倣っただけのMasked Patch Predictionで性能向上が認められたので、より最適な自己教師あり学習による事前学習タスクを探すことで、この先JFT-300Mのようなラベル付けにかなりのコストがかかるデータセットを必要とせずにかなり高い性能が得られる可能性があります。

## 3. まとめと所感

今回こそ文句なしで**畳み込みを一切使わないモデルが完成し、しかもSoTAを達成**しています。これからは画像認識でもTransformerが猛威をふるってきそうです。次はモデルサイズも事前学習のデータセットサイズもさらに大きくしたBig-ViTなどが出てくるのでしょうか。個人的にはこのViTを小さくしていく方向で研究が行われて欲しいですが、これからの画像認識にも目が離せないことは間違いないですね！**転移学習で高い性能を示しているので重みが公開されるのが楽しみ**です。非公式ではありますが[実装](https://github.com/lucidrains/vit-pytorch)(PyTorch)もあるので、そちらもご覧ください！

**Twitterで人工知能のことや他媒体の記事などを紹介していますので[@omiita_atiimo](https://twitter.com/omiita_atiimo)もご覧ください。**

こちらもどうぞ：
> * [深層学習界の大前提Transformerの論文解説！](https://qiita.com/omiita/items/07e69aef6c156d23c538)
> * [自然言語処理の王様「BERT」の論文を徹底解説](https://qiita.com/omiita/items/72998858efc19a368e50)
> * [Self-Attentionを全面的に使った新時代の画像認識モデルを解説！](https://qiita.com/omiita/items/f4fad6371747e718310e)
> * [パラメータ数10億！最新の巨大画像認識モデル「BiT」爆誕 & 解説](https://qiita.com/omiita/items/90abe0799cf3efe8d93d)
> * [画像認識の定番データセットImageNetはもう終わりか](https://qiita.com/omiita/items/e1e377f30f624ad705b2)



## 4. 参考
* ["An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale",(2021)](https://openreview.net/forum?id=YicbFdNTTy)
原論文
* [The Visual Task Adaptation Benchmark](https://ai.googleblog.com/2019/11/the-visual-task-adaptation-benchmark.html)  
VTABデータセットについてのGoogleの記事。
* [Polyak Averaging](https://coffee-g9.hatenablog.com/entry/Polyak_averaging)  
モデルの重みを移動平均を用いながら決定する手法についての記事。
* [An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (Paper Explained)](https://youtu.be/TrdevFK_am4)  
論文解説動画。