TL

CNN の畳み込み演算の数理:カーネル・ストライド・受容野

畳み込みを式から開封。なぜパラメータ共有で平行移動に強くなり、層を重ねると受容野が広がるのか、im2col 実装まで原理で腑に落ちます。

応用CNN畳み込み受容野im2colディープラーニング最終更新: 2026-06-22
TL;DR要点だけ先に
  • 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が画像で強い根本理由です。

同変(equivariant)と不変(invariant)は別物

畳み込み単体は「入力がずれると出力も同じだけずれる」同変であって、出力が変わらない不変ではありません。位置に依存しない判定(猫がどこにいても「猫」と出す)には、最大プーリングやグローバル平均プーリングで空間方向を集約する操作を重ね、近似的に平行移動不変へ近づけます。試験で頻出の区別です。

出力サイズ:ストライド・パディング・ダイレーション

カーネルを何画素ずつずらすかがストライド 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) に拡大し、上式の kk_eff に置き換えます。

パラメータ役割出力サイズへの効果
カーネル k見る窓の大きさ大きいほど出力は小さくなる
ストライド sずらす歩幅大きいほど出力は粗く(約 1/s)
パディング p縁の詰め物大きいほど出力が保たれる/拡大
ダイレーション d要素間隔を空けるk_eff を拡大し受容野を効率的に広げる

受容野:層を重ねるほど広がる

ある出力要素が「入力のどの範囲を見ているか」が受容野(receptive field)です。1層の受容野はカーネルサイズそのもの。層を積むと、上位層の1要素は下位層の k 要素を見て、その各要素がさらに下位の k 要素を見る——という入れ子で広がります。ストライド1・カーネル kL 層重ねた場合、受容野は線形に拡大します。

RF_L = 1 + L * (k - 1)        (s=1 の場合)

例えば 3×3 カーネル(k=3)を10層重ねると受容野は 1 + 10*2 = 213×3 を積み重ねれば、少ないパラメータで広い受容野を確保できるため、大きな単一カーネルより 3×3 の積層が好まれます。ストライドを挟むと拡大率が掛け算で効き、ダイレーションは k-1 の項を d 倍に増やすので、受容野を一気に広げられます。

3×3 積層が定番な理由

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=11+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、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

CNN畳み込み受容野im2colディープラーニングCNN畳み込み受容野
参考: 公式情報