Vision Transformer(ViT)は、自然言語処理で成功したTransformerを画像認識に適用したモデルです。画像をパッチ列として扱う発想と、CLS token・Position embedding、Swin Transformerで導入されたShifted windowを解説します。

📖 概要

Vision Transformer(ViT)は2020年に提案されたモデルで、CNNの畳み込みに頼らず、Transformerエンコーダで画像分類を行います。核心のアイデアは「画像を単語の列のように扱う」ことです。入力画像を16x16ピクセルなどの固定サイズの小領域(パッチ)に分割し、各パッチを平坦化して線形変換したベクトル(パッチ埋め込み)の系列をTransformerに入力します。これにより、自然言語処理のBERTとほぼ同じ構造で画像を処理できます。

ViTは畳み込みが持つ「近くの画素は関係が深い」といった構造的な事前知識(帰納バイアス)を持たないため、小規模データでは CNN に劣ることがある一方、大規模データで事前学習すると高い性能を発揮することが示されました。また、Self-Attentionの計算量は系列長の2乗に比例するため、高解像度画像への適用が課題となります。この課題に対し、ウィンドウ内に注意を限定しShifted windowでウィンドウ間の情報交換を行うSwin Transformerが提案され、物体検出やセグメンテーションにも使いやすい汎用バックボーンとして広まりました。

🔍 キーワード解説

パッチ分割とViTの基本構造

ViTは画像を固定サイズのパッチに分割し、各パッチを1つの「トークン」として埋め込みベクトルに変換します。得られたトークン列に後述のCLS tokenとPosition embeddingを加え、標準的なTransformerエンコーダ(Multi-Head Self-Attention+MLPの積み重ね)で処理します。Self-Attentionは画像全体のパッチ間の関係を最初の層から直接捉えられる点が、受容野を徐々に広げるCNNとの大きな違いです。

CLS token

CLS token(クラストークン)は、パッチ埋め込みの系列の先頭に追加される学習可能な特殊トークンです。BERTの[CLS]トークンに由来し、画像のどのパッチにも対応しない「集約用の席」として働きます。Transformerの各層でSelf-Attentionを通じて全パッチの情報を吸い上げ、最終層でのCLS tokenに対応する出力ベクトルを画像全体の表現とみなして、分類ヘッド(MLP)に入力しクラスを予測します。なお、CLS tokenを使わず全パッチ出力の平均(Global Average Pooling相当)を分類に使う設計も可能です。

Position embedding

Position embedding(位置埋め込み)は、各パッチが画像内のどの位置にあるかという情報をモデルに与えるため、パッチ埋め込みに加算されるベクトルです。Self-Attention自体は入力の並び順を区別しないため、位置情報を明示的に付与しないと「パッチの集合」としてしか扱えません。ViTでは学習可能な1次元の位置埋め込みが標準的に使われ、原論文では2次元的な位置関係を明示した埋め込みとの性能差は大きくなかったと報告されています。Transformer原論文の三角関数による固定のPositional Encodingと異なり、学習で獲得する点が特徴です。

Shifted window

Shifted window(シフトウィンドウ)は、Swin Transformerで導入された仕組みです。ViTのように全パッチ間でSelf-Attentionを計算すると計算量が系列長の2乗で増えるため、Swin Transformerは画像を重ならない小さなウィンドウに区切り、Attentionを各ウィンドウ内に限定して計算量を抑えます。しかしそれだけではウィンドウを越えた情報のやり取りができないため、次の層ではウィンドウの区切り位置を斜めにずらし(シフトし)、前の層で別ウィンドウだったパッチ同士が同じウィンドウに入るようにします。このウィンドウAttentionとShifted window Attentionを交互に繰り返すことで、計算量を抑えつつ画像全体の情報を統合します。Swin Transformerは階層的に解像度を下げながら特徴を抽出するため、CNNのように物体検出やセグメンテーションのバックボーンとしても使いやすい構造になっています。

📝 試験でのポイント

💡 ポイント
  • ViTの処理手順(パッチ分割→線形変換で埋め込み→CLS token追加→Position embedding加算→Transformerエンコーダ→CLS出力で分類)の並び替え・穴埋めが問われやすい
  • CLS tokenの役割=「全パッチの情報を集約し、その最終出力を分類に使う」ことを押さえる
  • Position embeddingが必要な理由(Self-Attentionは順序・位置を区別しない)はTransformer共通の頻出論点
  • Shifted windowの目的を2段階で説明できるようにする(ウィンドウ内Attentionで計算量削減/シフトでウィンドウ間の情報交換を実現)
  • ViTとCNNの対比(帰納バイアスの少なさ、大規模事前学習で有利、最初の層から大域的な関係を捉える)も選択肢に登場しやすい

📚 まとめ

ViTは画像をパッチ列に変換してTransformerで処理するモデルで、CLS tokenが画像全体の表現を集約し、Position embeddingが位置情報を補います。計算量の課題に対しては、Swin TransformerがウィンドウAttentionとShifted windowの交互適用で効率と大域性を両立しました。構成要素の役割を手順とセットで整理しておきましょう。