CNN の畳み込み演算の数理:カーネル・ストライド・受容野
畳み込みを式から開封。なぜパラメータ共有で平行移動に強くなり、層を重ねると受容野が広がるのか、im2col 実装まで原理で腑に落ちます。
- 1.CNN の「畳み込み」は数学的には相互相関で、カーネルを反転せず入力上をずらしながら要素積の和を取る。出力 y[i,j] = ΣΣ x[i+m,j+n]·w[m,n] が基本式。
- 2.同じカーネルを全位置で使い回すパラメータ共有により、入力が平行移動すると出力も同じだけ平行移動する(平行移動同変)。プーリングを挟むと平行移動不変に近づく。
- 3.受容野は層を重ねるほど線形に拡大し、ストライドやダイレーションで加速する。実装は im2col で入力をパッチ行列に展開し、巨大な GEMM 1回に帰着させる。
畳み込みを「式」で開ける
CNN と RNN では、畳み込みを「小さなフィルタを画像上でずらしながら局所特徴を抽出する操作」と説明しました。ここではその中身を、相互相関としての定義・パラメータ共有がもたらす平行移動同変性・受容野の拡大・im2col 実装の4点から、原理レベルで開封します。記号は LaTeX を使わず、添字つきのプレーンな式で追います。
入力を1チャネルの2次元配列 x(高さ H、幅 W)、カーネルを w(サイズ kH × kW)とします。バイアスを b とすると、出力 y の各要素は次式で定まります。
y[i,j] = ( Σ_m Σ_n x[i+m, j+n] * w[m,n] ) + b
m = 0 .. kH-1, n = 0 .. kW-1
カーネルを出力の各位置 (i,j) に重ね、対応する入力要素との要素積の総和を取る——これが畳み込み層の核です。重み w は位置 (i,j) に依存せず、全出力位置で共通である点が決定的に重要です(後述のパラメータ共有)。
「畳み込み」と「相互相関」:実装は反転しない
数学の畳み込み(convolution)は、本来カーネルを反転してから重ねます。
畳み込み : y[i,j] = Σ_m Σ_n x[i-m, j-n] * w[m,n] (添字が i-m, j-n)
相互相関 : y[i,j] = Σ_m Σ_n x[i+m, j+n] * w[m,n] (添字が i+m, j+n)
両者の違いはカーネルを反転するかどうかだけです。ディープラーニングの「畳み込み層」が実際に計算しているのは相互相関(添字が i+m)の方です。
カーネル w は学習で決まるパラメータです。仮に反転した畳み込みが最適だとしても、ネットワークは反転済みのカーネルを最初から学習してしまえばよく、表現力は完全に等価です。そのため実装では反転を省いた相互相関を使い、慣習的にこれを「畳み込み」と呼びます。厳密な数学の畳み込みと混同しないよう注意してください。
パラメータ共有と平行移動同変性
全結合層なら、入力の各画素と出力の各画素の間に独立した重みが必要で、パラメータ数は入力サイズ × 出力サイズに比例して爆発します。畳み込みは同じカーネル kH × kW 個の重みを全位置で使い回すため、パラメータ数は入力解像度から独立します。この「重みの使い回し」がパラメータ共有です。
パラメータ共有の数理的な帰結が平行移動同変性(translation equivariance)です。入力を Δ だけ平行移動した x'[i,j] = x[i-Δ, j] を畳み込むと、
y'[i,j] = Σ x'[i+m, j+n]·w = Σ x[i+m-Δ, j+n]·w = y[i-Δ, j]
となり、出力も同じ Δ だけ平行移動するだけです。「猫」がフレームのどこに写っていても同じカーネルが同じ応答を返す——これがCNNが画像で強い根本理由です。
畳み込み単体は「入力がずれると出力も同じだけずれる」同変であって、出力が変わらない不変ではありません。位置に依存しない判定(猫がどこにいても「猫」と出す)には、最大プーリングやグローバル平均プーリングで空間方向を集約する操作を重ね、近似的に平行移動不変へ近づけます。試験で頻出の区別です。
出力サイズ:ストライド・パディング・ダイレーション
カーネルを何画素ずつずらすかがストライド s、入力の縁を何画素詰め物するかがパディング p です。1次元あたりの出力サイズは次式で与えられます。
out = floor( (in + 2p - k) / s ) + 1
p = (k-1)/2(奇数カーネル)かつ s = 1 にすると out = in となり、解像度を保ったまま層を積めます(same パディング)。ダイレーション d(カーネル要素の間隔を空ける)を入れると、実効カーネルサイズが k_eff = k + (k-1)(d-1) に拡大し、上式の k を k_eff に置き換えます。
| パラメータ | 役割 | 出力サイズへの効果 |
|---|---|---|
| カーネル k | 見る窓の大きさ | 大きいほど出力は小さくなる |
| ストライド s | ずらす歩幅 | 大きいほど出力は粗く(約 1/s) |
| パディング p | 縁の詰め物 | 大きいほど出力が保たれる/拡大 |
| ダイレーション d | 要素間隔を空ける | k_eff を拡大し受容野を効率的に広げる |
受容野:層を重ねるほど広がる
ある出力要素が「入力のどの範囲を見ているか」が受容野(receptive field)です。1層の受容野はカーネルサイズそのもの。層を積むと、上位層の1要素は下位層の k 要素を見て、その各要素がさらに下位の k 要素を見る——という入れ子で広がります。ストライド1・カーネル k を L 層重ねた場合、受容野は線形に拡大します。
RF_L = 1 + L * (k - 1) (s=1 の場合)
例えば 3×3 カーネル(k=3)を10層重ねると受容野は 1 + 10*2 = 21。3×3 を積み重ねれば、少ないパラメータで広い受容野を確保できるため、大きな単一カーネルより 3×3 の積層が好まれます。ストライドを挟むと拡大率が掛け算で効き、ダイレーションは k-1 の項を d 倍に増やすので、受容野を一気に広げられます。
7×7 カーネル1層と 3×3 カーネル3層は、いずれも受容野7を持ちます。しかしパラメータは前者が 49、後者が 27(=3×9)と後者が少なく、間に非線形活性化を3回挟めるため表現力も上がります。VGG 以降「小カーネルを深く積む」が定石になったのはこの数理が背景です。
マルチチャネルへの一般化
実際の入力は RGB など複数チャネルを持ちます。入力チャネル数 Cin、出力チャネル数 Cout のとき、カーネルは Cout × Cin × kH × kW の4次元テンソルになります。出力チャネル o の各要素は、全入力チャネルにわたる畳み込みの和です。
y[o,i,j] = Σ_c Σ_m Σ_n x[c, i+m, j+n] * w[o, c, m, n] + b[o]
各出力チャネルが独立したカーネル群を持ち、入力チャネル方向は総和で潰れます。学習対象の重みパラメータ数は Cout * Cin * kH * kW(+バイアス Cout)で、入力解像度に依存しません。これらの重みの更新は、全結合層と同じく 誤差逆伝播 で行われます。
im2col:畳み込みを行列積に帰着させる
ナイーブに4重・6重ループで畳み込むと遅く、ハードウェアの行列積最適化を活かせません。実装の定番が im2col(image to column)です。入力から各出力位置に対応する Cin * kH * kW 要素のパッチを切り出し、1行に平らに並べた巨大な行列に展開します。
1. im2col: 入力 → パッチ行列 Xcol (形状: (out_H*out_W) × (Cin*kH*kW))
2. カーネル: w → 行列 Wcol (形状: Cout × (Cin*kH*kW))
3. 行列積 : Y = Xcol · Wcolᵀ (形状: (out_H*out_W) × Cout)
4. reshape: Y を (Cout, out_H, out_W) に並べ直す
これで畳み込みが**たった1回の GEMM(汎用行列積)**になり、BLAS や GPU の高度に最適化された行列積カーネルに丸投げできます。代償としてパッチが重複展開されるため Xcol がメモリを多く食う(カーネルの受容範囲が重なる分だけ要素が複製される)トレードオフがあります。
- 畳み込みの正体:実装は相互相関(カーネルを反転しない)。学習で等価なので問題ない。
- 同変 vs 不変:畳み込みは平行移動同変、不変化はプーリングが担う。
- 出力サイズ:
floor((in+2p-k)/s)+1を即答できること。 - 受容野:
s=1で1+L(k-1)。3×3 積層が広受容野+少パラメータで有利。 - im2col:パッチ展開で畳み込みを GEMM 1回に帰着、メモリ増がトレードオフ。
まとめ
CNN の畳み込みは魔法ではなく、「相互相関でカーネルを全位置にスライドさせ、要素積の和を取る」線形演算です。要点は、(1) 実装は反転しない相互相関であること、(2) パラメータ共有が平行移動同変性を生み、プーリングと組んで不変性に近づくこと、(3) 受容野は層を重ねるほど線形に広がり、3×3 積層が効率的なこと、(4) im2col で巨大な行列積に帰着させて高速化すること。この数理を押さえれば、CNN と RNN の直観的な説明が式の裏付けつきで腑に落ちます。土台のネットワークは ニューラルネットワーク と ディープラーニング も合わせて参照してください。
AI/機械学習 Article
CNN の畳み込み演算の数理:カーネル・ストライド・受容野を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
CNN
比較で見る軸
難易度: advanced / カテゴリ: AI/機械学習 / タグ数: 5
導入後に効く点
同じカーネルを全位置で使い回すパラメータ共有により、入力が平行移動すると出力も同じだけ平行移動する(平行移動同変)。プーリングを挟むと平行移動不変に近づく。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- AI/機械学習
- タグ数
- 5
判断チェックリスト
- 自社の用途が「CNN / 畳み込み」に近いか確認する。
- 強みである「CNN の「畳み込み」は数学的には相互相関で、カーネルを反転せず入力上をずらしながら要素積の和を取る。出力 y[i,j] = ΣΣ x[i+m,j+n]·w[m,n] が基本式。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。