みんなのAI
機械学習AI論文
読み込み中…

学ぶ

🏅マイ実績

Ch.05

Vision Transformer(ViT)と画像パッチ

画像を小さなマス(パッチ)に切ります。各マスはピクセルを1列に並べて数ベクトルにし (zi=Exiz_i=Ex_izi​=Exi​)、先頭の要約スロット(CLS)とどこにあったかの位置情報を足して1列にし、Encoderと分類へ送ります。

パッチ分割線形埋め込みトークン列Encoder分類
入力画像パッチ格子123456789パッチ埋め込み平坦化してベクトル化(線形)先頭の要約スロットCLSP1P2P3…位置情報を足すEncoder注意・FFN を複数層分類ヘッド
入力画像パッチ格子123456789パッチ埋め込み平坦化してベクトル化(線形)先頭の要約スロットCLSP1P2P3…位置情報を足すEncoder注意・FFN を複数層分類ヘッド

学習の流れ

  1. ① パッチ化: 画像を格子に分割。
  2. ② トークン化: 各パッチを埋め込み、位置を足す。
  3. ③ Encoder: MHA+FFN を繰り返す。
  4. ④ 分類: CLS(またはプーリング)からヘッドへ。
Chapter 01〜03で学んだTransformer(トランスフォーマー)は、もともと「順序のある単語(トークン)」の列を扱うために設計されました。では画像をこのモデルにどう渡すか?ビジョン・トランスフォーマー(Vision Transformer, ViT)の出発点は、とてもシンプルです。「一枚の写真を小さなジグソー(パッチ)に切り、各ピースを単語のように扱う」という発想です。
従来の CNN が局所フィルタを滑らせて特徴を積むのに対し、ViT は画像を細かく切り並べ、ピース同士がセルフアテンションで互いを見ます。医療画像や衛星写真など、広い文脈が重要な最新ビジョン AI の中核がこのモデルです。
つづき: パッチ iii をベクトル xix_ixi​ に展開し zi=Exiz_i=Ex_izi​=Exi​、hi=zi+PEih_i=z_i+PE_ihi​=zi​+PEi​ としたあとエンコーダに入れる流れは、下の節と数式ボックスで続きます。解像度を上げるとパッチ数が増え、Chapter 04 の N2N^2N2 規模の注意コスト・メモリ問題と直結します。

数式でたどる ViT の流れ

パッチベクトルと線形埋め込み
パッチを長さ P⋅CP\cdot CP⋅C のベクトル xxx に平坦化し、線形写像 EEE でモデル次元 ddd に写します。
z=Ex,E∈Rd×(P⋅C)z = E x,\quad E\in\mathbb{R}^{d\times(P\cdot C)}z=Ex,E∈Rd×(P⋅C)
zzz は「このパッチの見た目」を ddd 次元で表したトークンです。
位置を足す
トークン iii に位置情報を加えます(学習型または固定型)。
hi=zi+PEih_i = z_i + PE_ihi​=zi​+PEi​
PEiPE_iPEi​ があることで、セルフアテンションが空間上どこにあったパッチかを間接的に反映できます。
セルフアテンション・ブロック
パッチトークン行列 HHH に対し Q,K,VQ,K,VQ,K,V を作り
Attn(H)=softmax(QKTdk)V\mathrm{Attn}(H)=\mathrm{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttn(H)=softmax(dk​​QKT​)V
Chapter 01 と同じ式です。入力が単語ではなくパッチなだけです。
CLS と分類ヘッド
先頭トークン h0(L)h_0^{(L)}h0(L)​ を取り、線形分類器でクラスロジットを出します。
y^=Wclsh0(L)+b\hat{y} = W_{\mathrm{cls}} h_0^{(L)} + by^​=Wcls​h0(L)​+b
h0h_0h0​ がタスク向けに画像全体を要約するベクトルとして学習されます。

ビジョン・トランスフォーマー: 画像をパッチ・トークンに

1. なぜパッチ? 画像を「単語」のように読む
概念: Transformer は入力トークン同士の関係を学習します。画像を Transformer に入れるため、ViT は画像を碁盤のような格子に切ります。この小さな四角はパッチです。
直感: 風景写真を16分割したジグソーを想像してください。各ピースが文における「単語」の役割をします。ピース内のピクセルを一列に並べ、モデルが扱える次元のベクトルに変換して入力します。
実務: ピースを大きく切るとトークン数は減るが細部が落ちる。小さく切ると細部は残るがトークンが増え計算負荷が跳ねる(メモリ爆発)。Chapter 04 の トークン数・N2N^2N2 コストと直結します。
2. パッチに名札:埋め込みと位置
概念: Transformer は一度にすべてのピースを見るため、元の位置が分からなくなります。そこで各ベクトルに「左上の最初のピースです」といった位置情報(位置埋め込み)を足します。また先頭に全体をまとめる[CLS] トークンを置きます。
数式の習慣: パッチ iii のピクセルデータを xix_ixi​、線形変換 EEE で zi=Exiz_i=Ex_izi​=Exi​、位置 PEiPE_iPEi​ を足して hi=zi+PEih_i=z_i+PE_ihi​=zi​+PEi​。これがエンコーダへの入力です。
実務: セグメンテーション・検出などはパッチ以外のトークン化(ピクセル・クエリ等)の変形が多いです。
3. CNN との決定的差:拡大鏡 vs 円卓会議
概念: 従来の CNN は局所ピクセルだけを見る畳み込みを積み上げます。一方 ViT は大域的セルフアテンションで離れたパッチ同士の関係を一度に計算します。初期に小さな conv stem を付けるハイブリッドもよくあります。
比喩: CNN が「小さな拡大鏡で写真を動かしながら探す」なら、ViT は「すべてのピースを円卓に並べ同時に話し合う」イメージです。
実務: データが十分か強い事前学習があれば ViT が強く、小データでは増強・事前学習・CNN 的帰納バイアスが役立つこともあります。
4. 学習と推論の現実的な壁
概念: 損失は分類なら通常クロスエントロピー。問題は解像度で、パッチ列の長さに比例して計算・メモリが増えます。
実務: 高解像度ではパッチ数が急増します。トランスフォーマーの計算量はトークン数の二乗(N2N^2N2)に比例するため、解像度が少し上がるだけで GPU メモリ不足(OOM)になり得ます。Swin Transformer のようにウィンドウで区切る変形や、Chapter 04 の効率的注意・パッチ統合設計とセットで考えます。

重要性

テキストと画像をつなぐ鍵
NLP で成功したエンコーダ/注意/転移学習の発想を画像にそのまま持ち込めます。画像を見てテキストで答えるマルチモーダル AI では、視覚タワーとして ViT がよく使われます。
森を先に見る(大域の文脈)
CNN は狭い領域から始めて徐々に広げますが、ViT は最初から画像全体の文脈を同時に扱います。医療画像や衛星のように広い文脈が効く場面で強みを発揮します。
解像度 ↔ トークン数 ↔ コスト
「解像度↑=パッチ数↑=計算爆発」が成り立ちます。トークン数 NNN に対し注意はおおよそ N2N^2N2 に連動するため、入力解像度・パッチサイズ・カーネル効率がサービス運用コストを左右します。
Chapter 01〜04 とのつながり
内部はセルフアテンション・位置・FFN とテキスト用 Transformer とほぼ同じで、入力がパッチ埋め込みになっただけです。Chapter 04 のメモリ・長さの問題は高解像度 ViTでそのまま再登場します。

使い方

学習: 事前学習+ファインチューニング
ImageNet 等で事前学習した ViT を取り、分類ヘッドだけ付け替えてファインチューニングします。データが少ないときは強いデータ拡張・正則化・より小さいモデルも検討します。
推論: 解像度とバッチ
入力サイズを固定するか、大きい画像はスライディングウィンドウで分割処理します。GPU 限界に当たったらバッチ・解像度・混合精度(AMP)を調整します。
バックボーンの選び方
Swin・ConvNeXt・CNN+ViT ハイブリッドなどを比較し、データ量・遅延・精度のバランスを取ります。常に最新 ViT が正解とは限りません。
デバッグのチェックリスト
* 精度が出ない: パッチサイズ、[CLS]、事前学習重み、解像度分布を確認。
* OOM: トークン数を減らす(解像度・パッチ)、Chapter 04 の効率的注意やチェックポイントを検討。

まとめ

一行まとめ — 画像をパッチに切り、各ピースをトークン(zi=Exiz_i=Ex_izi​=Exi​)にし、CLS・位置(PE) とともにエンコーダでパッチ間の関係を学びます。
BERT・GPT との対応: 構造は NLP のエンコーダスタックと同じで、「文のトークン」の代わりにパッチトークンを扱います。
CNN vs ViT: CNN は局所の畳み込みを積むイメージに近く、ViT は大域セルフアテンションで離れたパッチも一度に結びます(変形・ハイブリッドは別)。
実務: 事前学習・ファインチューニング、解像度・パッチ・OOM、Chapter 04 の N2N^2N2 コストと Swin など効率設計をセットで覚えておきましょう。

解法のヒント

ViTは「画像→パッチトークン→CLS・PE→エンコーダ」、そして「パッチ数 NNN なら注意負担はおおよそ N2N^2N2」のセットで覚えると解きやすいです。パッチ数は (H/p)×(W/p)(H/p)\times(W/p)(H/p)×(W/p)。OOMなら解像度・パッチサイズ・効率的注意(前章)を見ます。
例(概念)
「ViT が画像をトークン列にする核に最も近いのは?
① 畳み込みだけ反復
② パッチに分け埋め込んでエンコーダ
③ ピクセルを RNN で順次」
→
② → 2

例(計算)
「入力 224×224224\times224224×224、正方形パッチ 16×1616\times1616×16 のとき パッチトークン数(CLS 除く)は?」
→ 横・縦 224/16=14224/16=14224/16=14、14×14=19614\times14=19614×14=196 → 196

例(O/X)
「ViT は通常、パッチ埋め込みのあと位置埋め込みを足す。」
→ 一般的な事実 → 1

例(応用)
「高解像度で OOM。まず試すのに良いのは?
① ラベルだけ増やす
② パッチを大きくしてトークン数を減らす
③ オプティマイザ名だけ変える」
→ 2

例(和・格子)
`votes = [1,1,1,0,0]` の和 → 3 / 一辺パッチ 8 の正方格子の総マス → 82=8^2=82= 64
短い例(○×) — 「ViTの核は畳み込みだけの反復でパッチは不要。」→ ×。正答 0

短い例(○×) — 「CLSは分類ヘッドと組み合わせることが多い。」→ ○。正答 1

短い例(計算) — 「32×3232\times3232×32 画像、8×88\times88×8 パッチ(正方形タイル)のパッチ数は?」→ 161616。正答 16