畳み込み——局所的な特徴を探すフィルター
畳み込みの直感
「畳み込み(Convolution)」という言葉は難しそうですが、感覚はシンプルです。
小さな「フィルター(カーネル)」を画像の上をスライドさせながら、局所的な特徴を検出する——これが畳み込みです。
写真を現像するときのカラーフィルターをイメージしてください。フィルターを通すと特定の情報だけが強調される。ただしCNNのフィルターは光の色ではなく「特定のパターン(エッジ、テクスチャなど)」を強調します。
エッジ検出フィルターの例
水平エッジ(横方向の境界線)を検出するフィルターで考えましょう。
フィルター(カーネル)3×3:
-1 -1 -1
0 0 0
+1 +1 +1
「上が明るくて下が暗い境界」に強く反応する
畳み込みの計算
入力画像(5×5)にフィルター(3×3)を適用してみます。
入力画像: フィルター:
1 2 3 4 5 -1 -1 -1
1 2 3 4 5 0 0 0
5 5 5 5 5 +1 +1 +1
1 2 3 4 5
1 2 3 4 5
フィルターを左上(1×1の位置)に置いて計算:
対応するピクセルとフィルターの値を掛け算して全部足す:
1×(-1) + 2×(-1) + 3×(-1) = -6 (上の行)
1×(0) + 2×(0) + 3×(0) = 0 (中の行)
5×(+1) + 5×(+1) + 5×(+1) = 15 (下の行)
合計 = -6 + 0 + 15 = 9
3行目(1→5に変わる水平エッジ)に反応して、大きな値が出ました。
このフィルターをスライドさせながら全位置で計算すると、水平エッジの強さを表す特徴マップ(Feature Map) が得られます。
ストライド(Stride)
ストライドは「フィルターを何ピクセルずつずらすか」です。
入力: 5×5、フィルター: 3×3
ストライド=1 の場合:
フィルターの左上が置ける位置: (1,1)(1,2)(1,3)(2,1)...
出力サイズ: 3×3
ストライド=2 の場合:
フィルターの左上が置ける位置: (1,1)(1,3)(3,1)(3,3)
出力サイズ: 2×2(飛ばし飛ばしなので小さくなる)
出力サイズの計算式:
出力サイズ = (入力サイズ - カーネルサイズ) / ストライド + 1
例: (5 - 3) / 1 + 1 = 3
例: (5 - 3) / 2 + 1 = 2
ストライドを大きくすると出力が小さくなり、計算量が減ります。
パディング(Padding)
畳み込みをすると出力が入力より小さくなります。これを防ぐためにパディング(画像の周囲に0を追加する)を使います。
パディング=1 を付けた場合(0で周囲を埋める):
0 0 0 0 0 0 0
0 1 2 3 4 5 0
0 1 2 3 4 5 0
0 5 5 5 5 5 0
0 1 2 3 4 5 0
0 1 2 3 4 5 0
0 0 0 0 0 0 0
パディング=1, ストライド=1, カーネル3×3 のとき: 出力サイズ = (5 + 2×1 - 3) / 1 + 1 = 5×5 (入力と同じサイズを維持)
複数のフィルター
現実のCNNでは1つのフィルターだけでなく、複数のフィルターを同時に適用します。
入力: 224×224×3(カラー画像)
フィルターを64個使う場合:
各フィルター: 3×3×3(幅×高さ×チャンネル数)
出力: 224×224×64(64種類の特徴マップ)
64個のフィルターそれぞれが「異なるパターン」を検出します。「水平エッジを検出するフィルター」「垂直エッジを検出するフィルター」「特定のテクスチャを検出するフィルター」……といった具合です。
全結合との比較(パラメータ数)
畳み込み層のパラメータ数がいかに少ないかを確認しましょう。
入力: 224×224×3
フィルター64個(3×3×3 + バイアス1)
畳み込み層のパラメータ数:
3×3×3×64 + 64 = 1,728 + 64 = 1,792個
全結合層(同じ入力→64ノード)のパラメータ数:
224×224×3×64 = 9,634,304個(約960万個!)
畳み込みなら1,792個で済むのに、全結合では960万個必要——これが畳み込みの効率の良さです。同じフィルターを画像全体で共有するため、パラメータが劇的に少なくて済みます。
まとめ
- 畳み込みは「小さなフィルターを画像上でスライドさせて特徴を検出」する処理
- カーネルはフィルターのサイズ(例: 3×3)。エッジやテクスチャなどを検出する
- ストライドはスライドのステップ数。大きいほど出力が小さくなる
- パディングは周囲に0を追加して出力サイズを維持する
- 同じフィルターを全体で共有するので、全結合より圧倒的にパラメータが少ない
次回は、特徴マップをさらに圧縮するプーリングについて学びます。