VIT解説 Part1 InputLayer
1. VIT
1.1 VITとは
VIT(Vision Transformer)は、元々言語処理タスクのために開発されたTransformerを、画像認識タスクに適用する手法です。
Transformerの持つAttentionメカニズムにより、CNNよりも柔軟に入力の特徴を結びつける事ができます。
特にデータ数が多いタスクに有用であり、Kaggleでも利用される事がありますが、その分学習時間やモデルサイズは増加してしまいます。
画像認識関連のSOTAにおいて、上位手法をVITが占有しているものもあり、その注目度はますます上昇しています。
1.2 アーキテクチャ
VITは、主にInputLayer、Encoder、MLPHeadの三つの部品で構成されています。
・VIT
2. InputLayer
この章では、最初に画像を入力するInputLayerについて解説します。
ここでは、画像の埋め込みを行います。画像をトークンに変換し、トークンをベクトルに変換して並べます。
・InputLayer
2.1 パッチ分割 (Patch Split)
エンコーダデコーダ系モデルにおける自然言語処理のタスクでは、Embedding(埋め込み)と呼ばれる、入力を単語に分割してトークン化する工程が最初に行われる事が多いです。
VITでは、画像をトークン化するために、画像を均等に分割してそれらをパッチ(トークン)として扱います。
例えば32×32の画像を2×2(=4)個のパッチに分解すると、それぞれ上下左右を切り取った16×16の画像(パッチ)が4つ入手できます。
原論文では、224×224の画像を16×16(=256)個や14×14(196)個のパッチに分解しています。
・2×2パッチ化の例
↓ パッチ化
2.2 flatten
画像をパッチに分割した後、flatten処理でデータを一次元化し、1層の線形層による線形変換を行います。
Transformerは元々一次元の系列データを扱うためのモデルであるため、このflattenでフォーマットを合わせています。
2.3 Embedding
一次元に変換したデータの各要素を、ベクトルに変換します。これにより一次元データ二次元配列になります。
これはword2vecと同じ原理で、トークンが柔軟な意味を持てるようにベクトルに変換します。
2.4 クラストークン(CLS)
次に、上記処理によって埋め込みを終えたデータの先頭に、クラストークンを結合します。
クラストークンはSelf Attentionによって得られる、画像全体のデータの関係性を捉えたベクトルです。
その長さはEmbedding後の各ベクトル長と同じで、ベクトルの全データは学習可能なパラメータになっています。
一次元ベクトルの先頭にクラストークンが追加されて、入力のデータ長が「ベクトル長」分だけ増加するイメージです。
2.5 位置埋め込み(Positional Encoding)
最後に、これまでのデータに位置埋め込みを行います。
これは、各トークンに自分の位置を知らせる情報を追加することを意味します。
例えば、画像の左上に飛行機がある場合と、右下に飛行機がある場合では、画像の意味が異なると考えられます。
得られたトークンが同じでも、その位置によって画像の意味は変化します。この変化をとられるための情報が位置埋め込みによって追加されるのです。
以上でInputLayerは終了です。
今回はここまでになります。
次回はEncoderから続きを解説します。
参考
(1)An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (原論文)
(2)Vision Transformer 入門 株式会社技術評論社 2022/9/30 山本晋太郎,徳永匡臣,箕浦大晃,QIU YUE,品川政太郎
Discussion