TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

Vision Transformer: 画像を16×16のパッチの文章として読む、そしてデータが多く必要な理由

ステータス: ドラフト(2026-10-13)、一部実測。 例はノートPCのCPUで直接動かした値です(code/07_vit.py, 1秒以内)。論文の数値は原文を開いて条件とともに転記し、ハードウェアはグレードで記載しました。 執筆ルール: 実測データが基本であり、測れなかったものは「未実測」と表記します。

目次

1. アテンション: すべてのペアの関係を見る

Transformer(2017)は翻訳のために作られたモデルです。コアとなる演算は 自己注意です。文章の単語ごとに3つのベクトルを作ります。

単語iのクエリと単語jのキーの内積を取ることで「iがjをどれだけ見るか」を決め、その割合でバリューを混ぜ合わせます。

Attention(Q, K, V) = softmax( Q·Kᵀ / √d_k ) · V

√d_kで割る理由について論文では次のように説明しています。次元d_kが大きいと内積の値が大きくなり(成分の平均が0、分散が1の場合、内積の分散はd_k)、ソフトマックスが一方に偏ることで勾配が非常に小さくなります。割ることで分散を1のあたりに戻します。

畳み込みと比較すると違いは明確です。畳み込みの出力の1マスは近傍の3×3しか見ておらず、遠くを見るには層を重ねる必要がありました(パート1の受容野)。アテンションは 最初の層からすべての位置を見ます。 誰を見るのかは固定された窓ではなく、データ(Q・K)が決定します。

2. ViT: 画像をパッチの文章にする

ViT: 그림을 16×16 조각으로 자르면 「단어」가 된다 224×224 → 196조각(14×14) (4×4 로 줄여 그림) 선형 투영 = 16×16 합성곱 CLS 토큰 + 위치 임베딩(+) 트랜스포머 인코더 × L 셀프 어텐션: 모든 토큰 쌍을 본다 CLS 출력 → 분류 합성곱은 「가까운 것끼리」가 구조에 박혀 있다. ViT 는 첫 층부터 그림 전체를 볼 수 있는 대신, 그 규칙을 데이터에서 스스로 배워야 한다 → 데이터가 많이 든다
図: 画像を16×16のパッチに切り分けて線形射影し、CLSトークンと位置埋め込みを加えてTransformerエンコーダーに入力するViTの構造

DosovitskiyらによるViTは画像を文章のように扱います。

  1. 224×224の画像を 16×16のパッチに分割します。14×14 = 196個のパッチになります。
  2. 1つのパッチ(16×16×3 = 768個の数値)を展開して 線形射影によりD次元のベクトル(トークン)に変換します。
  3. 先頭に学習する CLSトークンを1つ追加します。最後の層でこのトークンの出力を画像全体の表現として用いて分類を行います。
  4. 各トークンに 位置埋め込み(学習するベクトル)を加算します。
  5. 標準的なTransformerエンコーダー(自己注意 + MLP、それぞれ残差結合と層正規化を持つ)をL層積み重ねます。
モデル 層 隠れ次元 D MLP ヘッド パラメータ数
ViT-Base 12 768 3072 12 8,600万
ViT-Large 24 1024 4096 16 3億700万
ViT-Huge 32 1280 5120 16 6億3,200万

名称の「/16」、「/14」はパッチサイズです。パート9のSAMが使用している画像エンコーダーがこのViT-Huge(パッチ16)です。

やってみる 1: パッチ + 線形射影 = ストライド16の畳み込み

パッチに切り分けてから行列を掛け合わせる処理と、16×16のフィルターをストライド16でスライドさせる畳み込みは同一の計算になります。同一の重みを用いて2つの方法で計算し比較しました(実測)。

224×224 → 패치 196개(14×14), 패치 하나 768개 숫자 → 64차원 토큰
「잘라서 선형 변환」과 「보폭 16 합성곱」의 최대 차 2.7e-15

違いは浮動小数点数の丸め誤差のみです。実際の実装でもこの部分は畳み込みの1層として組まれることがほとんどです。ViTの最初の層は「ウィンドウが重ならない非常に大きな畳み込み」であり、畳み込みらしい部分はそこまでです。

やってみる 2: 位置埋め込みがなければ順序が分からない

自己注意はトークンの 順序を考慮しません。 入力トークンをシャッフルすると出力も同じようにシャッフルされるだけです(置換同変性)。そのため、画像の左上のパッチと右下のパッチを入れ替えてもモデルは気づきません(実測)。

토큰 순서를 섞어 넣은 출력 == 원래 출력을 같은 순서로 섞은 것: 최대 차 1.3e-15
위치 임베딩을 더하면 같은 패치를 섞었을 때 출력이 달라진다: 상대 차 0.28

このため位置埋め込みが必要になります。ViT論文の実験(ViT-B/16、ImageNetの5枚ずつの線形評価)において、位置埋め込みがない場合は0.614、1D学習済み埋め込みは0.642、2D埋め込みは0.640、相対位置は0.640でした。 あるかないかでは大きな差があり、どのような種類であるかにはほとんど差がありませんでした。 パッチレベル(14×14)においては、1Dの番号を与えるだけでもモデルが2Dの配置を自ら学習できることを意味しています。

3. 解像度のコスト

アテンションはすべてのトークンのペアを見るため、コストはトークン数Nの 二乗になります(実測計算)。

入力の一辺 トークン数 N アテンション行列 N² 224px 比
224 196 38,416 1.0倍
384 576 331,776 8.6倍
512 1,024 1,048,576 27.3倍
1024 4,096 16,777,216 436.7倍

SAM は 1024×1024 を入力します。そのため SAM の ViT-H はほとんどの層で 14×14 ウインドウ内でのみ アテンションを行い、グローバルアテンションは 4 つの層にのみ配置します(第 9 回)。解像度が重要なタスクに ViT を使用するには、このような妥協が必要です。

4. なぜ多くのデータが必要なのか

ViT 論文の最も重要な結果は、精度の数値ではなく データサイズによる逆転です。

モデル(事前学習データ) ImageNet top-1 事前学習コスト(TPUv3 コア・日)
ViT-H/14(JFT-300M) 88.55% 2,500
ViT-L/16(JFT-300M) 87.76% 680
ViT-L/16(ImageNet-21k) 85.30% 230
BiT-L(ResNet152×4, JFT-300M) 87.54% 9,900
Noisy Student(EfficientNet-L2) 88.4–88.5% 12,300

(論文の表 2。ViT-H/14 は 518px、ViT-L/16 は 512px でファインチューニング。)

論文ではその理由を 帰納バイアスで説明しています。畳み込みは「近い画素同士の関係が深い(局所性)」と「同じ模様はどこでも同じである(移動等変性)」を構造として持って生まれます(第 1 回)。ViT でその性質を持っているのはパッチ内の MLP のみであり、セルフアテンションはグローバルです。そのため、「近いパッチをより多く見ろ」というルールを データから自ら学ぶ必要が あり、データが少ないと、そのルールを学ぶ前に学習データを暗記してしまいます。データが十分であれば、逆にその自由度が利点となります。構造によって強制されないため、データに合ったより良いルールを見つけることができます。

実際に学習された ViT を詳しく見ると、 最下層においても 一部のヘッドは画像全体を見渡し、他のヘッドは近傍のみを見るなど、層が深くなるにつれて見る距離が長くなっていました(論文セクション 4.5)。畳み込みのように局所的に見るヘッドを自ら作り出したと言えます。

コスト面も興味深いです。上の表で、ViT-H/14 は BiT-L より高精度でありながら、事前学習コストは約 4 分の 1 でした。データが十分であれば、トランスフォーマーは計算効率の面でも有利でした。

5. DeiT: ImageNet のみでの学習

大半の人は 3 億枚の非公開データを使用できません。Touvron らの DeiT(2021)は、 ImageNet-1k のみで ViT をうまく学習する方法を示しました。鍵は 2 つあります。

  1. 強力なデータ拡張と正則化。 RandAugment、mixup、CutMix、Random Erasing、確率的深さ(Stochastic Depth)、Repeat Augmentation をすべて使用します。1 つずつ除外した実験(DeiT-B、224px)では、mixup と CutMix を同時に外すと 81.8% から 75.8% へ、Repeat Augmentation を外すと 76.5% へ低下し、Random Erasing や確率的深さを外すと学習自体が失敗しました。データから学ぶべき帰納バイアスを、データを水増しして教え込むようなものです。
  2. 蒸留トークン。 CLS トークンの隣に、「教師モデルの答えを真似る」トークンをもう 1 つ配置します。教師は畳み込みネットワーク(RegNetY-16GF、82.9%)です。畳み込みの帰納バイアスを、教師の答えを通じて継承していると見なすことができます。
モデル(ImageNet-1k のみ) 224px 384px
DeiT-B 81.8% 83.1%
DeiT-B + 蒸留 83.4% 84.5%

学習は 8 基の GPU を搭載した 1 台のサーバーで 2〜3 日でした(300 エポックで 53 時間)。論文の別の箇所には「4 基の GPU で 3 日」という表現もあり、原文内で条件が食い違っています。

6. 階層構造への回帰: Swin、Hiera

ViT は最初から最後まで 14×14 という単一の解像度です。検出やセグメンテーションのように多様なサイズの物体を扱うタスクでは、畳み込みの ピラミッド(高解像度 → 低解像度)が恋しくなりました。

MAE のような自己教師あり事前学習の原理については、姉妹シリーズ(自己教師あり学習・動画・姿勢・スポーツ)で取り上げます。

7. 限界と私たちのプロジェクト

そのため、TT Score では役割が分かれています。 ボールの検出は畳み込み(HRNet 系), 卓球台のセグメンテーションはトランスフォーマー(SAM 2.1 の Hiera) です。卓球台は大きくシンプルであり、試合開始時に一度見つければよいため重いトランスフォーマーを使用しても問題ありませんが、ボールは小さくフレームごとに検出する必要があるため、軽くて局所的な畳み込みが適しています(TT Score モデル解剖編 第 1 回)。

次の記事は、Transformerで検出を書き直したDETRです。アンカーもNMSもありません。

TTの一言。 パズルのピースの順番を混ぜても、位置埋め込みがなければモデルは気づきません。画像を用紙のピースの山として見るわけです。番号札を付けてこそパズルが組み合わされます。

参考文献

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます