Vision Transformer(ViT)とパッチ埋め込み
画像をパッチ列に変えれば Transformer がそのまま画像に効く理由を、パッチ埋め込み・位置埋め込み・帰納バイアスの欠如・大規模事前学習の必要性まで原理から押さえられる。
- 1.ViT は画像を固定サイズのパッチに切り、各パッチを線形射影してトークン化する。位置埋め込みと cls トークンを足し、あとは標準 Transformer エンコーダをそのまま適用する。
- 2.CNN が持つ局所性・並進不変性という帰納バイアスを ViT はほぼ持たず、関係をデータから学ぶ。そのぶん中小データでは CNN に負け、JFT-300M 級の大規模事前学習で初めて逆転する。
- 3.Swin は窓内アテンション+窓のシフト+階層的ダウンサンプリングで計算量を画素数に対し線形化し、局所性と多解像度を再導入して検出・セグメンテーションに適合させた。
出発点:画像をトークン列に変換できれば Transformer はそのまま使える
Transformer はもともと「トークン列」を入力とする系列モデルです(Transformer アーキテクチャ全体の構造)。ViT(An Image is Worth 16x16 Words, 2020)の発想は単純で、画像をトークン列に変換してしまえば、Transformer エンコーダを構造変更なしにそのまま画像に適用できる、というものです。CNN のような畳み込みを一切使わず、ほぼ素の Transformer で ImageNet 級の分類に到達した点が衝撃でした。
鍵は「画像をどうトークン化するか」です。テキストなら単語やサブワードが自然なトークンですが、画像にはそれがありません。ViT は画像を格子状のパッチに切り分け、各パッチを1トークンとして扱うことでこれを解決します。
パッチ分割と線形埋め込み:画像をトークン列にする
入力画像を H×W×C(高さ・幅・チャンネル)とし、これを P×P の正方パッチに重なりなく分割します。パッチ数(系列長)は N = (H/P)·(W/P) です。例えば 224×224 の画像を 16×16 パッチに切ると 14×14 = 196 トークンになります。各パッチは P·P·C 次元のベクトルに平坦化され、学習可能な線形射影で d_model 次元に写像されます。これが**パッチ埋め込み(patch embedding)**です。
# パッチ埋め込みの概念
x : (H, W, C) # 入力画像
patches : (N, P*P*C) N = (H/P)*(W/P) # 重なりなしに分割し平坦化
emb : patches @ W_E # W_E: (P*P*C, d_model) 学習可能
# emb: (N, d_model) ← これが N 個のパッチトークン
実装上この「分割→平坦化→線形射影」は、カーネルサイズ=ストライド= P の畳み込み1層とちょうど等価です。受容野が重ならずパッチ同士が独立に射影されるため、CNN のように画素近傍を畳み込んで階層を作るのとは性質が違います。ここで効くのは局所構造の抽出ではなく、**「画像を N 個の独立トークンに離散化する」**ことだけです。
セルフアテンションの計算量はトークン数 N に対し O(N²·d) です。パッチを小さくすると N が増えて表現は細かくなりますが、計算量は2乗で跳ね上がります。P=16 が定番なのは、解像度と計算コストの妥協点だからです。P=14 や P=8 にすると精度は上がる傾向ですが、コストも急増します。
cls トークンと位置埋め込み:順序と「画像全体」を注入する
パッチ埋め込みだけでは2つ足りないものがあります。
第一に位置情報。アテンションは集合演算で、トークンの並び順を入れ替えても結果が対応して入れ替わるだけで本質的に区別できません。そこで各トークンに位置埋め込み(position embedding)を加算します。ViT は2次元構造を明示的にエンコードせず、学習可能な1次元位置埋め込みを使うのが基本形です。それでも事前学習を通じてパッチの2次元的な近接関係を内部的に学ぶことが、可視化で確認されています。
第二に分類用の集約点。ViT は BERT に倣い、学習可能な cls トークンをパッチ列の先頭に1個追加します。エンコーダを通したあと、この cls 位置の出力ベクトルだけを取り出し、MLP ヘッドに通してクラスを予測します。cls トークンはどのパッチにも対応しない「画像全体の要約を集める器」で、アテンションを通じて全パッチから情報を吸い上げます。
# 入力トークン列の組み立て
z0 = [cls; emb_1; emb_2; ...; emb_N] + E_pos
# ↑先頭に cls ↑N 個のパッチ ↑位置埋め込みを全トークンに加算
# z0: (N+1, d_model) → 標準 Transformer エンコーダへ
cls トークンの代わりに、最終層の全パッチ出力を平均プーリング(GAP)して分類しても、ハイパーパラメータを揃えればほぼ同等の精度が出ます。cls 方式は BERT との設計統一が主目的で、原理的に不可欠なわけではありません。実際 GAP を採用する派生も多くあります。
CNN との決定的な差:帰納バイアスの有無
ViT を理解する核心は**帰納バイアス(inductive bias)**の差です。帰納バイアスとは「モデルが構造として持ち込む、データに対する事前の仮定」を指します。
CNN は畳み込みという演算そのものに、強い帰納バイアスを2つ埋め込んでいます(畳み込みの数学)。
| 帰納バイアス | CNN がどう持つか | ViT の扱い |
|---|---|---|
| 局所性 | 小さなカーネルで近傍画素だけを混ぜる | 持たない。1層目から全パッチを大域参照 |
| 並進不変(同変) | 同じカーネルを全位置で共有(重み共有) | 持たない。位置ごとに異なる関係を学べる |
| 階層的スケール | プーリングで段階的に受容野を拡大 | 持たない。全層が同一解像度・同一トークン数 |
CNN は「近くの画素ほど関係が深く、特徴は画像のどこにあっても同じように検出すべき」という、画像に対して妥当な仮定を構造として最初から持っています。これは少ないデータでも効率よく学べる強力な先験情報です。
一方 ViT は、セルフアテンションが1層目から全パッチ対を平等に参照するため、局所性も並進同変性も構造には組み込まれていません。「どのパッチがどのパッチと関係するか」をすべてデータから学ぶしかないのです。これは弱みであると同時に、CNN の固定的な局所性に縛られず大域的な関係を浅い層から捉えられるという強みにもなります。
データ効率:なぜ大規模事前学習が要るのか
帰納バイアスが弱いことの直接の帰結がデータ効率の悪さです。ViT 論文の中心的な観察は明快でした。
| 事前学習データ規模 | ViT vs CNN(ResNet) | 理由 |
|---|---|---|
| ImageNet-1k(約130万枚)のみ | ViT は同規模 CNN に負ける | バイアスがない分、足りない仮定をデータで補えない |
| ImageNet-21k(約1400万枚) | ほぼ拮抗 | 学習でバイアス相当を獲得しはじめる |
| JFT-300M(約3億枚) | ViT が CNN を上回る | 大規模データから局所性等を自前で学習しきる |
つまり ViT は、CNN が構造で「無料で」持っている仮定を、大量データから学習で「買って」いるのです。データが小さいと買いきれず CNN に劣りますが、データが十分大きいと CNN の固定バイアスがむしろ天井になり、ViT が逆転します。この「規模で殴れば構造の素朴さが報われる」関係は、スケーリング則 の文脈とも整合します。
手元の数千〜数万枚で ViT をゼロから学習すると、ほぼ確実に CNN に負けます。実務では「大規模事前学習済み ViT を転移学習」が基本線です。あるいは DeiT のように、強い data augmentation と CNN 教師からの蒸留で ImageNet-1k だけでも CNN 級に届かせる手法もあります。素の ViT を小データで回すのは原理的に不利だと理解しておくべきです。
ハイブリッドと階層型(Swin):局所性を計算効率とともに取り戻す
素の ViT には実務上2つの不満が残ります。(1) 計算量がトークン数の2乗で高解像度に弱い、(2) 全層が単一解像度で物体検出・セグメンテーションが要求する多スケール特徴を出しにくい。これらを補う2系統が生まれました。
ハイブリッド ViT は、入力をいきなりパッチ分割せず、CNN の特徴マップを先に通してからその出力をトークン化します。CNN 段で局所性の帰納バイアスを取り戻しつつ、上位で Transformer の大域モデリングを使う折衷案です。
Swin Transformer はより踏み込んで、ViT に階層構造と局所性を作り直しました。原理は3点です。
- 窓内アテンション(W-MSA):全パッチ対ではなく、画像を固定サイズの窓に区切り窓の中だけでアテンションを計算する。これで計算量が画素数
Nに対しO(N²)からO(N)(窓数に比例) へ線形化される。 - シフト窓(SW-MSA):窓を固定すると窓境界をまたぐ関係が切れる。そこで層ごとに窓の区切りを半窓ずらすことで、隣接窓間の情報を交換し大域性を回復する。
- 階層的マージ:CNN のプーリングに相当するパッチマージで段階的に解像度を下げ、
d_modelを増やす。これで1/4 → 1/8 → 1/16 → 1/32と多解像度の特徴ピラミッドができ、検出・セグメンテーションのバックボーンに使える。
| 観点 | ViT(素) | Swin Transformer |
|---|---|---|
| アテンション範囲 | 全パッチ(大域) | 窓内に限定+層ごとにシフト |
| 計算量(画素数 N) | O(N²) | O(N)(窓内に局所化) |
| 解像度 | 全層で単一 | 階層的にダウンサンプリング(多解像度) |
| 帰納バイアス | ほぼ持たない | 窓で局所性を、シフトで連結性を再導入 |
| 主用途 | 画像分類 | 検出・セグメンテーション含む汎用バックボーン |
Swin は「Transformer の表現力を保ちつつ、CNN が持っていた局所性・多解像度・線形計算量を設計で取り戻した」モデルだと理解すると見通しが良くなります。ViT が帰納バイアスを捨ててデータで補ったのに対し、Swin は有用なバイアスを選んで構造に戻したわけです。
まとめ:ViT の本質は「画像のトークン化」と「バイアスとデータのトレードオフ」
ViT の核心は2つです。第一に、画像をパッチに切って線形射影すればトークン列になり、Transformer がそのまま使えるという発想の単純さ。第二に、CNN の帰納バイアスを捨てた代償を大規模事前学習で支払うという明快なトレードオフ。このトレードオフを理解すれば、「なぜ小データでは負けるのか」「なぜ JFT 級が要るのか」「なぜ Swin が局所性を戻したのか」が一本の筋で繋がります。ViT が確立した「画像=パッチトークン列」という表現は、画像とテキストを同じ Transformer で扱う マルチモーダル VLM の土台にもなっています。
AI/機械学習 Article
Vision Transformer(ViT)とパッチ埋め込みを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
Vision Transformer
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 5
導入後に効く点
CNN が持つ局所性・並進不変性という帰納バイアスを ViT はほぼ持たず、関係をデータから学ぶ。そのぶん中小データでは CNN に負け、JFT-300M 級の大規模事前学習で初めて逆転する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 5
判断チェックリスト
- 自社の用途が「Vision Transformer / パッチ埋め込み」に近いか確認する。
- 強みである「ViT は画像を固定サイズのパッチに切り、各パッチを線形射影してトークン化する。位置埋め込みと cls トークンを足し、あとは標準 Transformer エンコーダをそのまま適用する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。