畳み込みニューラルネット — 画像を「見る」ためのネットワーク

小さな 3×3 のカーネルが画像の上を滑りながら、同じ計算をひたすら繰り返す。たったそれだけの仕掛けが、なぜ画像認識を激変させたのか。畳み込み・特徴マップ・プーリング・階層構造を、動かしながら理解します。

1. 3×3 の窓が画像の上を滑る — 畳み込み演算

畳み込み(convolution)は、画像の小さな領域(ここでは 3×3 = 9 ピクセル)と、カーネル(フィルタ)が持つ 9 個の重みを掛けて、全部足すだけの計算です。カーネルを 1 マスずつずらしながら画像全域で繰り返すと、出力として特徴マップが 1 枚できあがります。

下のデモで、カーネルを切り替えてみてください。縦エッジ検出カーネルは「左右で明るさが急に変わる場所」だけで大きな値を出す — つまりカーネルとは「この模様はあるか?」という質問を全域に投げかける装置です。

畳み込みの動作 — カーネルがスライドし特徴マップが埋まる
左=入力画像(数字の「7」)、中央=カーネルの重みと「画素×重み」の 9 個の積、右=積の合計 Σ が書き込まれていく特徴マップ。カーネルの重なり位置(オレンジ枠)と出力の 1 マスが対応しています。
POINT — 局所結合と重み共有 出力の 1 マスは入力の 3×3 の範囲しか見ない(局所結合)。そしてどの場所でも同じ 9 個の重みを使い回す(重み共有)。この 2 つの制約でパラメータ数が激減し、さらに「模様がどこに移動しても同じように検出できる」性質(平行移動への強さ)がタダで手に入る。
全結合: 28×28 → 100 ユニット ⇒ 784 × 100 = 78,400 個の重み
畳み込み: 3×3 カーネル × 32 枚 ⇒ 3 × 3 × 32 = 288 個の重み 画像が何倍大きくなっても畳み込み層の重みの数は変わらない — これが重み共有の威力

2. フィルタは「特徴検出器」 — 描いて確かめる

カーネルの正体をつかむ一番の近道は、自分で描いた絵にフィルタを掛けてみることです。下のキャンバスにマウスでドラッグして線を描くと、右側に縦エッジ検出・横エッジ検出の特徴マップがリアルタイムで表示されます。

縦線を描くと左のマップだけが、横線を描くと右のマップだけが強く反応するはず。斜め線なら両方がほどほどに反応します。そしてどこに描いても同じように反応することも確認してください。

お絵かき畳み込み — 自分の線がフィルタにどう見えるか
左の 16×16 キャンバスにドラッグで描く
白=描いた線。特徴マップの緑=正の反応、赤=負の反応(エッジの向きで符号が変わる)。線の「左右の境目」に縦エッジが、「上下の境目」に横エッジが現れます。
注意 — このフィルタは手作り、CNN は自動で獲得する ここで使った縦・横エッジ検出(ソーベルフィルタ)は人間が設計した古典的な画像処理フィルタ。CNN の本質は、この 9 個の重み自体を誤差逆伝播で学習すること。実際、学習済み CNN の第 1 層を覗くと、誰も教えていないのにエッジや色の検出器がずらりと並んでいる。

3. 縮めて要点だけ残す — プーリングとストライド

畳み込みの後には、特徴マップを縮小するプーリングがよく入ります。代表は 2×2 max pooling:2×2 の窓の中で最大値だけを残す操作です。「この辺りにエッジがあったか?」という情報は残しつつ、正確な位置の情報を少し捨てる — これで小さな位置ズレに強くなり、計算量も 1/4 になります。

窓を動かす歩幅がストライドです。下のデモでストライドを変えると、出力サイズと「窓の重なり方」が変わります。

2×2 max pooling — 最大値が選ばれて出力が縮む
オレンジ枠=現在の 2×2 窓、緑枠=窓内の最大値(これだけが出力に残る)。ストライド 1 では窓が重なり、3 では読み飛ばされる行・列(赤く表示)が出ます。通常は「窓 2×2・ストライド 2」で重なりも漏れもなくちょうど半分に。
出力サイズ = ⌊ (N + 2P − K) / S ⌋ + 1 N = 入力サイズ, K = 窓(カーネル)サイズ, S = ストライド, P = パディング。畳み込みにもプーリングにも同じ式が使える

4. エッジ → パーツ → 物体 — 特徴の階層

畳み込み層を重ねると何が起きるか。深い層の 1 マスは、前の層の 3×3、そのまた前の 3×3…を通じて入力のより広い範囲(=受容野)を見ています。層が深くなるほど受容野は広がり、検出される特徴も「エッジ → 角やパーツ → 物体全体」と抽象化していきます。

CNN の階層構造 — 受容野が広がり、特徴が抽象化していく
データが左から右へ流れるのに合わせて、入力画像上のオレンジ枠(=いま処理中の 1 マスが「見ている」範囲=受容野)が広がっていきます。最後の全結合層は画像全体を見て「7」と判定します。
一歩先へ — CNN のその後 層を極端に深くしたのが ResNet(スキップ接続で 100 層超え)。近年は画像を Transformer で処理する ViT も台頭したが、「局所性」「階層性」という CNN の帰納バイアスは少ないデータで効率よく学べる強みとして健在。畳み込みは今も画像生成の U-Net や音声処理など至る所で現役だ。

5. まとめ