忙しい人のための「Vision Transformer」
本記事は、複雑な理論や数式を用いることなく、Vision Transformer(ViT)が画像分類をおこなう挙動を大まかに理解するためのものである。
Vision Transformerとは
画像分類にTransformerを利用したモデルの名称。
畳み込みに代わり「Self-Attention」を用いることで、提案以前のCNNに比べて高い分類精度を達成し注目を集める。
ViTの構成
ViTは大きく分けて以下の3つの部品で構成されている。
Input Layer
Encoder
MLP Head
それぞれの役割を明らかにしつつ、ViTの挙動を説明する。
①Input Layer
ViTのInput Layerは以下の役割を持つ。
画像をパッチに分割
パッチの埋め込み
クラストークンの付与
位置埋め込みの付与
それぞれの処理について深堀していく。
画像をパッチに分割
1枚の画像を、複数個のパッチに分割する。
この時点で、各パッチは高さ、幅、チャンネル数を持った3階テンソルである。
分割した各パッチを、flatten処理によって「ぺしゃんこ」にする。(ベクトル化)
この時、各パッチのベクトルの各要素は、0~255の整数値である。
パッチの埋め込み
flattenしたパッチのベクトルをよりよいものにする処理及び得られたベクトルを「埋め込み」という。
上記で得た各パッチのベクトルをニューラルネットワークに通すことで、埋め込みを得る。
「よりよいベクトル」とは、ニューラルネットワークの損失を小さくするベクトルである。(分類問題なので損失はクロスエントロピー損失)
クラストークンの付与
「クラストークン」とは、一言でいうと「画像全体の情報を凝縮したベクトル」である。
その正体は、パッチの埋め込みと同じ大きさを持ったベクトルである。
クラストークン自体が学習可能なパラメータであり、標準正規分布に従う乱数で初期値を設定する。
クラストークンは、パッチの埋め込みの先頭に結合される。
ViTは最終的に、クラストークンのみを用いて画像分類をおこなう。
位置埋め込みの付与
「位置埋め込み」とは、一言でいうと「各パッチが画像全体のどこに該当するのかを表すベクトル」である。
その正体は、「(トークン数)×(パッチのベクトルの長さ)」の大きさを持ったベクトルである。
ここで、「トークン数」とは、パッチの個数とクラストークンの個数(1つ)の和である。
位置埋め込み自体が学習可能なパラメータである、標準正規分布に従う乱数で初期値を設定する。
位置埋め込みは、クラストークン及び各パッチの埋め込みそれぞれに加算される。
このように、Input LayerではEncoderに入力可能な形に画像を変換する。
Input Layerの最終的な出力は、クラストークンと各パッチの埋め込みに位置埋め込みが加算された行列である。
②Encoder
ViTのEncoderは、「Self-Attention」によるパッチ間の類似度計算を主な役割とする。以下では、Self-Attentionの挙動を紹介し、ViTが画像全体の情報を集約していると言われる所以について説明する。
Self-Attentionのイメージ
ViTにおけるSelf-Attentionを一言でいうと、「画像全体を見て、各パッチの埋め込みをよりよいものにする処理」である。
あるパッチが、他の全てのパッチと自分との類似度を全て求め、似ているパッチは多めに、似ていないパッチは少なめに、自分に吸収するイメージ
Self-Attentionの動き
3つの異なる重みを持った線形層を用意し、それぞれにInput Layerから得られた行列を通す。
それぞれを「キー」「バリュー」「クエリ」と呼ぶ。
キー行列(転置)とクエリ行列の行列積を計算し、行方向にソフトマックス関数を適用すると、内積によってベクトル間の類似度を計算した行列ができあがる(Attention Weightという)
この時、各パッチと同様にクラストークンにもパッチ間の関係の情報が集約されていく為、最終的にクラストークンのみで画像分類が可能なのである。
このように、EncoderではSelf-Attentionによってパッチ間の関係をクラストークンに集約する。
なお、実際のViTでは、複数のキー、クエリ、バリューを一度に生成し、複数回Self-Attentionを適用することでパッチ間の複雑な関係を学習可能とした「Multi Head Self-Attetion」を採用している。
③MLP Head
ViTのMLP Headの役割は、Encoderで出力されたクラストークンを元に画像分類をおこなうことである。
その正体は、正規化層と線形層によって構成されたニューラルネットワークである。
MLP Headの出力ベクトルの次元数は、分類時のクラス数と同じである。(1,000クラス分類なら、1,000次元のベクトル)
まとめ
ViTの挙動をまとめると、「画像をパッチに分割し、パッチ間の類似度をSelf-Attentionで求め、画像全体の情報を集約したクラストークンによって画像分類をおこなう」である。
CNNが周辺の画素から情報を集約していくのに対し(畳み込み)、ViTは画像全体からパッチ間の類似度を計算していくため、画像全体の情報を使った処理がおこなわれているといえる。
コメント
図がないと想像しづらいと思われるため、スライド化する
大量の学習データ及び計算資源なしにViTが高い精度を出すことは難しいらしい(数億枚~)
今後紹介すること
事前学習済みモデルの使い方
追加学習のやり方
Attention-Mapによる画像分類の判断根拠可視化
参考書籍