畳み込みニューラルネット — 画像を「見る」ためのネットワーク
小さな 3×3 のカーネルが画像の上を滑りながら、同じ計算をひたすら繰り返す。たったそれだけの仕掛けが、なぜ画像認識を激変させたのか。畳み込み・特徴マップ・プーリング・階層構造を、動かしながら理解します。
1. 3×3 の窓が画像の上を滑る — 畳み込み演算
畳み込み(convolution)は、画像の小さな領域(ここでは 3×3 = 9 ピクセル)と、カーネル(フィルタ)が持つ 9 個の重みを掛けて、全部足すだけの計算です。カーネルを 1 マスずつずらしながら画像全域で繰り返すと、出力として特徴マップが 1 枚できあがります。
下のデモで、カーネルを切り替えてみてください。縦エッジ検出カーネルは「左右で明るさが急に変わる場所」だけで大きな値を出す — つまりカーネルとは「この模様はあるか?」という質問を全域に投げかける装置です。
畳み込み: 3×3 カーネル × 32 枚 ⇒ 3 × 3 × 32 = 288 個の重み 画像が何倍大きくなっても畳み込み層の重みの数は変わらない — これが重み共有の威力
2. フィルタは「特徴検出器」 — 描いて確かめる
カーネルの正体をつかむ一番の近道は、自分で描いた絵にフィルタを掛けてみることです。下のキャンバスにマウスでドラッグして線を描くと、右側に縦エッジ検出・横エッジ検出の特徴マップがリアルタイムで表示されます。
縦線を描くと左のマップだけが、横線を描くと右のマップだけが強く反応するはず。斜め線なら両方がほどほどに反応します。そしてどこに描いても同じように反応することも確認してください。
3. 縮めて要点だけ残す — プーリングとストライド
畳み込みの後には、特徴マップを縮小するプーリングがよく入ります。代表は 2×2 max pooling:2×2 の窓の中で最大値だけを残す操作です。「この辺りにエッジがあったか?」という情報は残しつつ、正確な位置の情報を少し捨てる — これで小さな位置ズレに強くなり、計算量も 1/4 になります。
窓を動かす歩幅がストライドです。下のデモでストライドを変えると、出力サイズと「窓の重なり方」が変わります。
4. エッジ → パーツ → 物体 — 特徴の階層
畳み込み層を重ねると何が起きるか。深い層の 1 マスは、前の層の 3×3、そのまた前の 3×3…を通じて入力のより広い範囲(=受容野)を見ています。層が深くなるほど受容野は広がり、検出される特徴も「エッジ → 角やパーツ → 物体全体」と抽象化していきます。
5. まとめ
- 畳み込み:カーネル(重みの小窓)を滑らせて積和を取る。出力は「その特徴がどこにあるか」を示す特徴マップ。
- 局所結合と重み共有:パラメータが激減し、平行移動に強くなる。カーネルの中身は学習で自動獲得される。
- プーリング / ストライド:位置の細部を捨てて縮小。小さなズレへの頑健性と計算量削減、受容野の拡大をもたらす。
- 階層性:層を重ねるごとに受容野が広がり、エッジ → パーツ → 物体と特徴が抽象化する。