畳み込みニューラルネットワーク(CNN)

G検定対策 ── 図解つき解説
🔰 初心者

畳み込みニューラルネットワーク(CNN)ってよく聞きますけど、普通のニューラルネットワークと何が違うんですか?

🎓 上級者

CNNは画像認識に特化したニューラルネットワークだよ。普通のニューラルネットワーク(全結合層だけのもの)だと、画像を扱うのに大きな問題があるんだ。

なぜ普通のニューラルネットワークではダメなのか
普通のニューラルネットワークで画像を扱う問題 画像 100×100ピクセル = 10,000個の入力 1列に並べる 全結合層 ❌ 問題点 ① パラメータが膨大になる 100×100画像 → 1000万個の重み ② 位置情報が失われる 1列に並べると「隣り合う」関係が消える ③ 位置ズレに弱い 猫が左にいても右にいても別物扱い
図1: 全結合層だけで画像を扱うと問題が多い
🎓 上級者

これらの問題を解決するために、畳み込み層プーリング層という仕組みを導入したのがCNNなんだ。

🏗️ CNNの全体構造
CNNの基本的な流れ 入力画像 RGB画像など 畳み込み層 Conv 特徴を検出 プーリング Pool サイズ縮小 畳み込み Conv Pool 平坦化 全結合層 FC 分類 出力 犬/猫など 特徴抽出部分(CNN固有) 分類部分
図2: CNNの基本構造(畳み込み → プーリング → … → 全結合 → 出力)
🎓 上級者

CNNは大きく分けて特徴抽出部分(畳み込み層 + プーリング層の繰り返し)と分類部分(全結合層)で構成されているよ。それぞれ詳しく見ていこう。

🔍 畳み込み層(Convolution Layer)
🔰 初心者

「畳み込み」って何をしているんですか?

🎓 上級者

小さな「フィルター(カーネル)」を画像の上でスライドさせながら、特定のパターン(特徴)を検出する作業だよ。

畳み込み演算のイメージ 入力画像(5×5) 1 2 3 0 1 0 1 2 3 1 1 2 1 0 2 2 0 1 2 1 1 1 0 1 0 フィルター(3×3) 1 0 1 0 1 0 1 0 1 計算(各要素を掛けて合計) 1×1 + 2×0 + 3×1 + 0×0 + 1×1 + 2×0 + 1×1 + 2×0 + 1×1 = 1+3+1+1+1 = 7 この値が出力の左上に入る 出力(特徴マップ) 7 ? ? ? ? ? ? ? ? フィルターをずらしながら 全部埋めていく 💡 畳み込みのポイント • フィルターの値(重み)は学習によって自動的に決まる • 同じフィルターを画像全体に適用するので、パラメータ数が大幅に削減される • 複数のフィルターを使うと、複数の特徴(縦線、横線、エッジなど)を同時に検出できる
図3: 畳み込み演算の具体的な計算方法
🎓 上級者

畳み込み層に関連する重要な用語も押さえておこう。

📌 フィルター(カーネル)
特徴を検出するための小さな行列。3×3や5×5がよく使われる。この値が「学習される重み」になる。
📌 ストライド(Stride)
フィルターをずらす幅。ストライド1なら1ピクセルずつ、ストライド2なら2ピクセルずつ移動する。大きいほど出力サイズが小さくなる。
📌 パディング(Padding)
入力画像の周囲をゼロなどで埋めること。出力サイズを調整したり、端の情報を保持するために使う。
📌 特徴マップ(Feature Map)
畳み込みの出力。1つのフィルターから1つの特徴マップが生成される。フィルターが32個あれば、特徴マップも32枚できる。
🔢 出力サイズの計算式
🔰 初心者

畳み込みの出力サイズってどうやって計算するんですか?

🎓 上級者

ストライドとパディングの値がわかれば、公式1つで計算できるよ。G検定でも実際に計算させる問題が出ることがあるから覚えておこう。

出力サイズの公式

出力サイズ = (W - F + 2P) / S + 1

W = 入力サイズ、F = フィルタサイズ、P = パディング、S = ストライド

具体例:入力7x7、フィルタ3x3、ストライド1、パディング0

出力サイズ = (7 - 3 + 2x0) / 1 + 1 = 4 / 1 + 1 = 5

→ 出力は 5x5 になる

入力サイズ (W)フィルタ (F)ストライド (S)パディング (P)出力サイズ
7x73x3105x5
7x73x3117x7(サイズ維持)
7x73x3203x3
32x325x51232x32(サイズ維持)
覚えておくと便利なパターン

フィルタサイズ F のとき、パディング P = (F-1)/2 にするとストライド1で入力と同じサイズを維持できる。
例:3x3フィルタ → P=1、5x5フィルタ → P=2

📦 プーリング層(Pooling Layer)
🔰 初心者

プーリング層は何をするんですか?

🎓 上級者

特徴マップのサイズを縮小する役割だよ。これによって計算量を減らし、位置の微小なズレに強くなるんだ。

Maxプーリング(2×2、ストライド2) 入力(4×4) 1 3 2 4 6 2 1 3 1 2 5 0 2 8 1 4 各領域の 最大値を取る 出力(2×2) 4 6 5 8 Maxプーリングの効果 ✓ サイズが半分に ✓ 計算量が削減 ✓ 位置ズレに強くなる (最大値なので微小な 位置変化は無視される)
図4: Maxプーリングは各領域から最大値だけを取り出す
プーリングの種類 処理内容 特徴
Maxプーリング 領域内の最大値を取る 最もよく使われる。特徴の「ある/なし」を強調
Averageプーリング 領域内の平均値を取る 滑らかな出力。背景情報も保持
Global Average Pooling 特徴マップ全体の平均 最終層で使用。全結合層の代わりに使うことも
CNNのメリットまとめ

❌ 全結合層だけの場合

パラメータが膨大
位置情報が失われる
位置ズレに弱い
過学習しやすい

✓ CNNの場合

パラメータ共有で効率的
局所的な特徴を検出
位置不変性がある
画像認識に最適

💡 パラメータ共有とは

全結合層では、各ピクセルごとに別々の重みが必要。100×100画像で隠れ層100ノードなら、重みは100万個

CNNでは、同じフィルター(例:3×3 = 9個の重み)を画像全体で使い回す。フィルター32個でも重みは288個だけ。圧倒的に少ない!

🔗 CNNの3大特徴:局所結合・パラメータ共有・プーリング
🔰 初心者

CNNが全結合層と違うポイントを整理するとどうなりますか?

🎓 上級者

CNNには3つの大きな特徴があるよ。特に「局所結合構造」はCNNの根本的な設計思想なんだ。

局所結合構造(Local Connectivity)

各ニューロンが入力全体ではなく、一部の局所的な領域(局所受容野)だけに接続する構造。
全結合層では1つのニューロンが全入力ピクセルと結合するが、CNNの畳み込み層ではフィルターサイズ分の小さな領域だけと結合する。

これは生物の視覚野の仕組み(ヒューベルとウィーゼルが発見した局所受容野)にヒントを得ている。網膜の各細胞が視野全体ではなく一部の領域だけに反応するのと同じ原理。

メリット:パラメータ数を大幅に削減でき、画像の局所的なパターン(エッジ、角、テクスチャ)を効率的に検出できる。
特徴仕組み効果
局所結合構造各ニューロンが局所受容野(入力の一部領域)だけに接続パラメータ削減、局所パターンの検出
パラメータ共有同じフィルター(重み)を画像全体で使い回すさらにパラメータ削減、位置に依存しない特徴検出
プーリング特徴マップを縮小して要約する位置ズレへの頑健性、計算量の削減
全結合層 vs CNNの接続の違い

全結合層:1つのニューロンが入力の全ピクセルと接続 → パラメータ膨大、位置情報消失
CNN(局所結合):1つのニューロンが入力の小さな領域だけと接続 → パラメータ少、局所パターン検出

🏆 有名なCNNアーキテクチャ(G検定頻出)
名前 特徴 覚えるポイント
LeNet 1998 CNNの元祖。手書き数字認識用 ヤン・ルカンが開発
AlexNet 2012 ILSVRC2012で圧勝。深層学習ブームの火付け役 ReLU、ドロップアウト、GPUを活用
VGGNet 2014 3×3の小さいフィルターを多層に重ねる シンプルな構造。VGG16、VGG19
GoogLeNet 2014 Inceptionモジュールで複数サイズのフィルターを並列使用 22層でも効率的
ResNet 2015 スキップ接続(残差接続)で超深層化を実現 152層でも学習可能。勾配消失を解決
⭐ 特にResNetは超重要

ResNetのスキップ接続(Skip Connection / Residual Connection)は、入力をそのまま出力に足し算する仕組み。

これにより勾配が直接伝わるルートができるので、100層以上の深いネットワークでも勾配消失せずに学習できるようになった。現在のほとんどの深層学習モデルはこのアイデアを取り入れている。

🎯 G検定で押さえるべきポイント