畳み込みニューラルネットワーク、つまりCNNは、小さな局所パターンを見つけ、それらを組み合わせてより大きなパターンとして捉えるニューラルネットワークです。画像では、初期の層がエッジや角を検出し、中間の層がテクスチャや部品を捉え、より深い層がそれらの信号を使って最終的な予測を支えます。

中心となる考え方は重み共有です。CNNは画素位置ごとに別々の重みを学習する代わりに、同じ小さなフィルタを多くの位置で再利用します。これにより、生の画像に対する全結合層よりもはるかに計算効率がよくなり、同じ種類のパターンを複数の場所で検出しやすくなります。

畳み込みニューラルネットワークがすること

全結合層では、各出力は一度にすべての入力値に依存できます。CNNはそれよりも構造化されています。小さなカーネル、しばしばフィルタと呼ばれるものを使い、一度に1つの局所領域だけを見ます。

1チャネルの入力 xxk×kk \times k のカーネル KK に対して、1つの出力要素は次のように書けます。

yi,j=m=0k1n=0k1Km,nxi+m,j+n.y_{i,j} = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} K_{m,n} x_{i+m,j+n}.

これは畳み込み層の背後にある、局所的な重み付き和という考え方です。多くの機械学習ライブラリでは、実装されている演算は厳密には反転を伴う数学的な畳み込みではなく相互相関ですが、実用上の直感は同じです。カーネルが入力上を走査し、特徴マップを作ります。

特徴マップは、学習されたパターンがどこで強く現れているかを示します。

共有フィルタが役立つ理由

同じ縦エッジが画像の左上にあっても中央付近にあっても、普通はモデルにどちらでも気づいてほしいはずです。CNNは同じフィルタのパラメータを位置をまたいで再利用することで、それを実現します。

これには実用上、次の2つの効果があります。

  • 生の画像に対する全結合層と比べて、学習するパラメータ数を減らせる。
  • 1つの固定位置を丸暗記するのではなく、繰り返し現れる局所パターンを検出するようネットワークを促す。

この再利用こそが、CNNが画像タスクで効果を発揮する理由の1つです。

基本的なCNNアーキテクチャの形

基本的なCNNは、よく次の流れに従います。

  1. 畳み込み層
  2. ReLUなどの活性化
  3. 必要に応じたプーリングまたはダウンサンプリング
  4. さらに畳み込みブロックを重ねる
  5. 最終予測層

初期の層は通常、単純な局所構造を捉えます。より深い層は、それらの応答を組み合わせて、より大きくタスクに特化した特徴を作ります。

プーリングは必須ではありませんが、使う場合は空間方向の次元を縮小し、後段の層がよりコンパクトな表現を扱えるようにします。代表例は最大プーリングで、各小領域の中の最大値を残します。

ストライドが 11、パディングが 00 なら、n×nn \times n の入力に k×kk \times k のカーネルを適用した出力は (nk+1)×(nk+1)(n-k+1) \times (n-k+1) になります。このサイズの規則は、計算例が妥当かどうかを確認するときに役立ちます。

計算例:CNNの特徴マップがどう作られるか

次の 4×44 \times 4 の入力画像を考えます。

X=[3300330000330033]X = \begin{bmatrix} 3 & 3 & 0 & 0 \\ 3 & 3 & 0 & 0 \\ 0 & 0 & 3 & 3 \\ 0 & 0 & 3 & 3 \end{bmatrix}

次の 2×22 \times 2 のカーネルを使います。

K=[1111]K = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix}

ストライドは 11、パディングなしとします。入力は 4×44 \times 4、カーネルは 2×22 \times 2 なので、出力は 3×33 \times 3 になります。カーネルの各要素がすべて 11 なので、各出力要素は1つの 2×22 \times 2 パッチの総和です。

左上の出力値は

y1,1=3(1)+3(1)+3(1)+3(1)=12.y_{1,1} = 3(1) + 3(1) + 3(1) + 3(1) = 12.

右に1つずらしたパッチは

[3030],\begin{bmatrix} 3 & 0 \\ 3 & 0 \end{bmatrix},

なので

y1,2=3+0+3+0=6.y_{1,2} = 3 + 0 + 3 + 0 = 6.

すべての有効な位置について計算すると、

Y=[12606660612].Y = \begin{bmatrix} 12 & 6 & 0 \\ 6 & 6 & 6 \\ 0 & 6 & 12 \end{bmatrix}.

となります。

この出力が特徴マップです。値が大きい場所ほど、カーネルが強く一致するパターンを見つけたことを示します。この例では、完全な 2×22 \times 2 の明るいブロックがある場所でフィルタが最も強く反応しています。

ここでReLUを適用しても、すべての要素がすでに非負なので何も変わりません。さらにストライド 112×22 \times 2 最大プーリングを使うと、プーリング後の出力は

[126612].\begin{bmatrix} 12 & 6 \\ 6 & 12 \end{bmatrix}.

になります。

これは新しい情報を作るわけではありません。近くにある強い応答を残しつつ、空間グリッドを小さくしています。

この例は単純ですが、核心となる仕組みをはっきり示しています。フィルタが滑りながら局所的な重み付き和を計算し、どこにパターンが現れるかの地図を作るのです。

学習中にCNNが学ぶこと

上のカーネルは手で選びましたが、実際のCNNではフィルタの値はデータから学習されます。学習では、それらの値を調整して、得られる特徴マップがタスクに役立つようにします。

タスクが画像分類なら、ネットワークはクラスを分けやすくするフィルタを学びます。タスクがセグメンテーションや物体検出なら、後段の層はそれらの出力に合わせて学習されます。基本の仕組みは同じで、順伝播、損失、逆伝播、パラメータ更新という流れです。

CNNを学ぶときのよくある誤解

CNNは単に「画像分類器」だと思う

画像は代表例ですが、CNNの本質は局所構造と共有フィルタにあります。近くの値が重要なら、この考え方は画像以外でも役立ちます。

プーリングは常に必要だと思う

よく使われますが、普遍的ではありません。空間サイズの縮小をストライド付き畳み込みで行うアーキテクチャもありますし、空間的な細かさを長く保つものもあります。

ストライドとパディングを無視する

特徴マップのサイズはこれらの選択に依存します。ストライドやパディングを変えると、出力の形だけでなく、各ユニットが見られる局所近傍も変わります。

層を単なる数式として扱う

畳み込みの式は重要ですが、アーキテクチャ全体も重要です。CNNが機能するのは、畳み込み、活性化、層の積み重ね、学習が一緒に働くからです。

畳み込みニューラルネットワークが役立つ場面

CNNは、画像分類、物体検出、セグメンテーションなどのコンピュータビジョンタスクで広く使われています。また、局所パターンに意味がある信号処理や系列データの一部の設定でも使われます。

特に、入力が明確なグリッド構造や順序づけられた近傍構造を持つときに有効です。その条件が弱いなら、別のアーキテクチャのほうが適している場合もあります。

CNNを理解しやすくするイメージ

CNNは、小さなパターン検出器として始まり、深くなるほどより抽象的になっていくものだと考えるとよいです。ある層は「この小さなパターンはここにあるか?」と問い、後の層は「これらの単純なパターンは、もっと意味のあるものに組み合わさるか?」と問いかけます。

だからこそ、CNNは「畳み込み」という言葉だけでなく、特徴マップに注目すると理解しやすくなります。

自分でも試してみよう

同じ入力を使ったまま、カーネルを次のように変えてみてください。

[1111].\begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix}.

特徴マップを計算し直して、どの領域で大きな正の応答や負の応答が出るかを見てみましょう。この小さな変更だけでも、異なるフィルタが異なるパターンをどう検出するかがずっとはっきりわかります。

問題の解き方でお困りですか?

問題をアップロードすると、検証済みのステップバイステップ解答が数秒で届きます。

GPAI Solver を開く →