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

学ぶ

🏅マイ実績

Ch.07

ビジョンモデルの進化:CNNは局所、ViTは大域を見る

同じ写真を二つの読み方で示します。CNN は小さな カーネル(局所窓) を滑らせ 近傍ピクセル から特徴を積み、ViT は パッチトークン に 大域セルフ注意 を載せ 1ブロックでも 遠い文脈を混ぜられます。ウィンドウ注意 でそのコストを分割する妥協も並べます。

CNN
ViT
CNN vs ViT — 배경 사진: Unsplash

学習の流れ

虫眼鏡を動かして近所を読む CNN、公民館で一斉に話し合う ViT。

ViT は画像を小さな断片(パッチ)に切り、それらを単語のようにトランスフォーマへ入れます。最初のブロックからすべてのパッチが互いを見渡し、「誰が誰と話すか」を決める 大域的セルフ注意 が核なので、画面の左端と右端の関係も 一度に 取りにいけます。
一方、長くビジョンを支配してきた CNN(畳み込みネット) は 小さな窓(カーネル) を画像上に滑らせ 近傍ピクセルだけ を直接見て特徴を積みます。層を深くするほど「見える範囲(受容野)」は広がりますが、1層が 画像全体を一度に 見る構造ではありません。同じフィルタを位置ごとに 再利用(重み共有) するためパラメータは少なく、局所性という強い仮定のおかげでデータが少なくても安定しやすいことが多いです。
階層的ウィンドウ注意 系はこの中間で、ウィンドウ内の局所注意+シフト+マージにより、大域を一飲みしないまま 大域文脈を階層的に 混ぜていきます。トークン数 NNN が大きくなると爆発しやすい O(N2)\mathcal{O}(N^2)O(N2) の負担を現実的な水準に抑えられます。
本章では CNN と ViT を並べ、どのデータ・タスク・GPU メモリでどの仮定が有利かを 実務の視点 で整理します。一行で言えば 「CNNは近所から段階的に、ViTは全会議を一度に(その代わりコストとデータ)」 です。

数式の読み方(CNN vs ViT)

1)CNN の局所演算: 出力位置 iii の1ニューロンは、入力の 小さな近傍パッチ とカーネル WWW で
yi=∑δ∈NkWδ xi+δy_i = \sum_{\delta\in\mathcal{{N}}_k} W_\delta \, x_{i+\delta}yi​=δ∈Nk​∑​Wδ​xi+δ​
の形(境界・パディングは実装依存)になります。どの位置でも 同じ WWW を使う 重み共有 が CNN の核です。
CNNRF ↑ layersvsViTN² attn
下図は CNN の局所受容野の積み上げ と ViT の1ブロック大域注意 を同じ軸に並べた概念図です。
2)ViT 1ブロックの「大域を一度」: パッチトークン行列 XXX から Q,K,V=XWQ,XWK,XWVQ,K,V=XW_Q,XW_K,XW_VQ,K,V=XWQ​,XWK​,XWV​ を作り
Attn(X)=softmax(QKTdk)V\mathrm{{Attn}}(X)=\mathrm{{softmax}}\left(\frac{{QK^T}}{\sqrt{{d_k}}}\right)VAttn(X)=softmax(dk​​QKT​)V
ここで QKTQK^TQKT は トークン×トークン になりやすく、NNN が大きいと O(N2)\mathcal{O}(N^2)O(N2) が天井になりがちです(セルフ注意の典型的なコスト像)。
3)「どこまで見えるか」が広がる二つの仕方:
① CNN: 層を積む/プーリング/ストライドでダウンサンプルし、出力ニューロンが間接的に見る範囲(受容野)を広げます。
② ViT(密): 1つの注意ブロックで すべての位置対 を直接比較し「一段の大域」を作れます(代わりにコスト大)。
4)N2N^2N2 の負担を分ける階層ウィンドウ:
① コスト: NNN が大きいと ViT の N2N^2N2 が先に痛いです。
② 妥協: ウィンドウ内は M2M^2M2、全体では NNN 個のウィンドウを回る O(NM2)\mathcal{{O}}(N M^2)O(NM2) 程度で 局所注意を繰り返し、シフトで境界を越え、マージでトークンを減らします。
③ 直感一行: 「大域を一気飲み」ではなく「小さな大域を階層的に合成」します。

CNNとViT:同じ画像を読む二つの文法

1. CNN:虫眼鏡を滑らせて「近所だけ」丁寧に見る(局所性)
概念: CNN はとても小さいフィルタ(例:3×33\times 33×3 の 虫眼鏡)を画像上に スライド させて走査します。ある位置で今見えているのは 周囲 k×kk\times kk×k だけで、その結果を次の層へ渡すと少し広い文脈が積み上がります。
直感: 層が深いほど 受容野(receptive field) が徐々に広がります。浅い層では 線・角 のような単純パターン、深い層では 目・耳・鼻 のような意味のある部位を認識します。同じカーネルを 複数位置で再利用(重み共有) するためパラメータは少なく、猫が写真の 左 にいても 右 にいても似たフィルタで捉えられる 平行移動等変性(translation equivariance) が自然につきます。
式のイメージ: 出力の1点は入力の局所パッチとカーネルの 相互相関(畳み込み) で得られます。深さ LLL が増えるほど受容野は 層ごとに広がり、遠いピクセルも 間接的に 混ざります。
2. ViT:パッチを単語のように並べ「全員が一度に討論」(大域性)
概念: 画像を P×PP\times PP×P のパッチに切り(例:16×1616\times 1616×16)、各パッチをベクトル(トークン)にします。密なセルフ注意 の1ブロックでは(基本形では)すべてのパッチ対が互いの関連度を計算します。
直感: CNN が 近所の虫眼鏡 なら、ViT は 一度に広く見下ろすドローン に近いです。最初のブロックでも画面 端と端 の関係を直接合わせられる一方、パッチ数 NNN が増えると 「誰が誰とどれだけ話すか」 を書き留める スコア行列 がおよそ N×NN\times NN×N 規模で肥大し メモリと計算 が急速に重くなります。
スケールの記憶: 注意スコアを作る段階は多くの場合 O(N2d)\mathcal{O}(N^2 d)O(N2d) に近いオーダーに感じられます(ヘッド数・実装により定数は変わります)。
3. 「大域」を一飲みしない階層的な妥協
つながり: ウィンドウ(小さな領域) の中だけでまず注意し、シフト(窓をずらす) で隣接ウィンドウと情報を混ぜ、マージ でトークン数を減らします。つまり 「小さな大域」を何度も重ねて 大きな絵を作る 階層的 戦略です。
一行たとえ: CNN は 地域放送、ViT は 全国生討論、ウィンドウ設計は 地方局が連携して全国ニュースを組むネットワーク に近いです。ウィンドウ・シフト・マージ が「CNN と ViT のあいだ」に立つ理由を、本章の CNN・ViT の軸に合わせて理解すれば十分です。
4. なぜ「CNN vs ViT」を同じ章で学ぶのか(実務設計)
モデル選択はリーダーボードの1行ではなく、データに対する「仮定表」を選ぶことに近いです。
* データが少ない/ドメインが難しいとき:画像で 近いピクセル同士が関連する という仮定が強く効く CNN・ハイブリッド が 収束が速く安定 しやすいことが多いです。
* データが非常に多く 強い 事前学習 があるとき:局所仮定に縛られにくい ViT 系 が 上限性能(SOTA) で有利な例が多いです。
* 自動運転の物体検出・セグメンテーション のように ピクセル単位・複数スケール が重要なら:階層ウィンドウ型バックボーン、ConvNeXt、FPN など ダウンサンプルピラミッド に慣れた CNN 的設計 が依然として強いです。
* コスト: ViT は NNN が大きいほど OOM が先に来やすいので、効率的注意 と ウィンドウ型階層設計 は同じ悩みの延長線上にあります。

なぜ重要か

モデル選択は「性能表」ではなく「仮定表」を選ぶこと
CNN は「画像で近いピクセル同士は関連が深い」という 強い帰納バイアス(局所性・共有・階層) をモデルに先に埋め込みます。ViT は「その先入観なしに、パッチ間の関係をデータから十分学ぶ」に近く、代わりに柔軟な 大域混合 のために データ・計算・メモリ をより要求しがちです。
この差を知らないと、評判の 最新バックボーン をそのまま持ってきて 自社データ で性能が出ない理由を、ログを見ながら 説明しにくくなります。 「ランキング1位」ではなく 自分の問題に合う仮定 を選ぶ練習が必要です。
ハイブリッドとバックボーン設計の共通言語
最近の流れは CNN とトランスフォーマの 境界がぼける ことです。例:パッチ埋め込み+CNN stem で低周波を先に捉える、ウィンドウ注意+畳み込みダウンサンプル で解像度を落とす、ConvNeXt のように「CNNだがブロック設計はトランスフォーマに近い」構成が一般的です。
それでもデバッグでは名前より 「1層が一度にどれだけ遠くを、どれだけ高コストで見るか」 が共通言語です。受容野・トークン数 NNN・N2N^2N2・ウィンドウサイズを正確に指差せれば、チーム内の説明とトリアージが速くなります。
この章で持ち帰るもの
この章では CNN(局所・受容野・重み共有) と ViT(パッチ・密な自己注意、NNN と N2N^2N2) を 同じ軸 に並べて比べます。読み終えると、「なぜ ViT だけ OOM?」のように トークン数・パッチ・解像度 から手を付けるべきか、「少数ラベルでは何から?」のように 帰納バイアスとデータ のどちらを優先するかを、説明できる言葉 で話せるようになります。
狙いは流行のバックボーン名の暗記ではなく、自分のタスク・GPU・ラベル規模 に合わせて 局所と大域をどれだけ買うか を選ぶ 判断の枠 を持ち帰ることです。

どう使うか

1. CNN が主役になりやすい現場:オンデバイス・エッジ・リアルタイム
軽くて速いので、重いサーバ往復なしに 端末だけで即応 しなければならない用途では、いまも CNN が圧倒的に多いです。
* スマホのカメラフィルタ&顔認証(Face ID 等): バッテリーを抑えつつ 0.1 秒前後で輪郭など局所特徴を出す必要があり、MobileNet のような軽量 CNN が入ります。
* 工場ラインの不良検知: 1 秒に数十個流れる製品の 微小キズ・凹みを リアルタイムに見抜くなら、YOLO 系など CNN 検出器が向きます。
* ドライブレコーダー/ADAS の初期反応: 飛び出し歩行者を 約 0.01 秒で捉えてブレーキに繋ぐ局面では、遅延しがちなトランスフォーマーより 高速 CNN が生命線になります。
2. ViT が主役になりやすい現場:超大規模 AI・生成・マルチモーダル
大きなサーバ資源を前提に、人間を超える深い理解が要る所に置かれます。LLM と同じトランスフォーマー型なので、言語モデルと 相性が良いです。
* ChatGPT の画像理解(GPT-4V 系): レシート写真から文字起こし・要約へ。テキストと視覚を同じ空間で扱えるのが強みで、画像側の「目」に ViT(またはその変形)が使われます。
* Midjourney、DALL·E など生成 AI: 「宇宙服を着てマルボロを吸う猫」のようなプロンプトから絵を作る内部(DiT:Diffusion with Transformer)にも ViT 的トークン化が入り、全体の文脈(大域性)を崩さない役割を担います。
* 医療/衛星画像の精読: 転移の広がりや広域の地形変化のように、ピクセル単体より俯瞰文脈が重要なときに強いです。
3. 実戦ハイブリッド(CNN + ViT):現場の黄金比
現場ではどちらか一方に固執せず、ハイブリッドが最も多いです。
* 型: 高解像度入力はまず 前半(浅い層)を CNNで 素早くダウンサンプルし、線・質感など基礎特徴を抜きます。続けて 後半(深い層)に ViT/トランスフォーマーを置き、トークンが減った表現で 全体の関係を深く読ませます。
* 例: Google CoAtNet や Apple MobileViT は、モバイル級でも回るトランスフォーマーを作るためにこの型を採用しました。

まとめ

CNN は 局所カーネル と 重み共有 で近傍から特徴を積み、層が深いほど 受容野 を広げて 間接的に 遠い文脈へ届きます。ViT は パッチトークン に 密な自己注意 をかけ 1ブロックで大域的混合 ができますが、トークン数 NNN に対して N2N^2N2 で メモリ・計算 が急増しやすいです。
ウィンドウ注意+シフト/マージ などの 階層的ウィンドウ で N2N^2N2 負担を分割するのが代表的な妥協です。バックボーン選びでは データと事前学習規模、解像度・パッチ・NNN、検出/セグなど密な予測の要否、遅延とGPUメモリをまとめて見ることが重要です。

問題解説ノート

まずこう読み始めましょう
- 問題が問う軸を分ける:CNN の局所・受容野 / ViT のパッチ・大域注意 / データと帰納バイアス
- 計算問題は単位を固定:トークン数 NNN、入力 H×WH\times WH×W、パッチ PPP → 格子はおおよそ (H/P)(W/P)(H/P)(W/P)(H/P)(W/P)
- 'N2N^2N2' が出たら 密な自己注意のトークン×トークン・スコア行列 と結び付けて考える

例(概念)
"CNN で同じカーネルを全空間位置に適用する性質は?"
① 大域注意
② 重み共有
③ パッチマージ
④ CLS トークン
正解 2
なぜ? 重み共有 は CNN の基本で、ViT のパッチトークンとは別の軸です。

例(正誤)
"CNN の最初の畳み込み層は一般に画像全体を一度に直接見る"
正解 0(誤り)
なぜ? 最初の層は局所パッチを見、広い視野は深くなるほど現れます。

例(計算)
"N=10N=10N=10 のとき N2N^2N2 は?" → 100
問題タイプ別の例+根拠
例(シナリオ)
"高解像度 ViT 学習で OOM。最初に?"
① バッチだけ増やす
② トークン数(解像度/パッチ/バッチ)を調整
③ 大域ブロックだけ追加
正解 2
なぜ? メモリを直接減らす選択が先です。

例(選択式・計算)
"224×224224\times224224×224、パッチ 16×1616\times1616×16 のときパッチトークン数(格子のみ)は?"
① 14
② 196
③ 224
④ 3136
正解 2(値 196)
なぜ? (224/16)2=142=196(224/16)^2=14^2=196(224/16)2=142=196。

例(累積・概念)
"ラベルが少なく、速い安定ベースラインが欲しい?"
① 巨大 ViT をスクラッチ
② 小型 CNN+増強
③ データなしで学習
正解 2
なぜ? 局所の帰納バイアスが学習を安定させやすいです。

例(統合)
"同じ解像度・同じ増強なのに ViT だけ OOM。次は?"
① 最適化器
② パッチ/シーケンス/チェックポイント
③ ログのエンコード
正解 2