見出し画像

CNN(畳み込みニューラルネットワーク)徹底解説—画像の特徴をどのように捉えているのか?

先日投稿した生成AIパスポートに関するブログ記事に多くの反響をいただきました。生成AIの知識を深めたいと考えている方が多いことを改めて実感しています。生成AIパスポートの受検を目指す方も多くいらっしゃるかと思いますので、出題される内容の解説をしたいと思います。

今回の記事では、畳み込みニューラルネットワーク(CNN)と呼ばれるアルゴリズムについて解説をします。CNNは、画像認識において非常に重要な役割を担っており、生成AIや画像生成技術を理解する上でも欠かせません。本記事では、CNNの仕組みを具体例を交えながら丁寧に解説します。この記事を読めば、CNNがどのようにして画像を認識し、特徴を抽出しているのかが理解できるはずです。

CNNの大まかな動作フロー

CNNが画像を処理する際の大まかな流れを以下に示します。

  1. 入力画像の準備
    まず、CNNはピクセルデータで構成された画像を入力として受け取ります。

  2. 畳み込み層(Convolutional Layer)
    CNNの最初の処理ステップです。畳み込みフィルター(カーネル)を使って画像内のエッジや形状、模様を見つけ出します。

  3. 活性化関数(ReLU)
    畳み込み演算の結果を、活性化関数ReLU(Rectified Linear Unit)に通します。
    ReLUは、負の値を「0」に置き換える処理を行い、重要な特徴を強調し、無関係な情報を削除します。

  4. プーリング層(Pooling Layer)
    次に、プーリング層で画像の情報を「縮小」します。
    プーリングを行うことで、計算コストを削減し、画像の特徴をさらに要約します。

  5. 全結合層(Fully Connected Layer)
    最後に、全結合層で畳み込み層やプーリング層で抽出された特徴を「1次元のベクトル」に変換し、出力層で最終的なクラス分類を行います。

  6. 出力
    最終的な出力として、画像がどのクラス(カテゴリ)に属するかが示されます。例えば、「この画像は98%の確率で猫です」といった予測結果が出力されます。

畳み込みフィルターの役割

CNNの「畳み込み層」では、畳み込みフィルター(カーネル)を使って画像内の特徴を捉えます。フィルターは画像を小さな領域ごとにスライドし、「掛け算と足し算」を繰り返して、明暗の変化(エッジや境界線)を見つけ出します。ここでは、具体的な数値を使って畳み込みフィルターの動きを詳しく説明します。

具体例:垂直方向のエッジ検出

3×3の領域に以下のフィルターを適用するとします。
垂直方向エッジ検出フィルター
[  1,  1,  1 ]
[  0,  0,  0 ]
[ -1, -1, -1 ]

このフィルターは、上下方向の明暗の差を捉えるものです。

ステップ1:画像データ(前提条件)
以下は5×5ピクセルの白黒画像です。
値は0〜255の範囲で「明るさ」を表し、0は黒を意味し、数字が増えるにつれて白に近づきます。

入力画像
[255, 255, 200, 100,  50],
[255, 230, 180,  90,  40],
[128, 128, 128, 128, 128],
[  0,   0,  50, 100, 150],
[  0,   0,  50, 100, 150]

ステップ2:フィルターを画像に適用

① 画像の左上にフィルターを適用

対象領域(3×3):
[255, 255, 200],
[255, 230, 180],
[128, 128, 128]

フィルターの掛け算と合計:
(255×1) + (255×1) + (200×1)   → 710
(255×0) + (230×0) + (180×0)   → 0
(128×-1) + (128×-1) + (128×-1) → -384
結果:710 + 0 - 384 = 326

結果:326(エッジあり)
上部が明るく、下部が暗い部分にエッジがあると判断されます。

② 画像の中央にフィルターをスライド

対象領域(3×3):
[200, 100,  50],
[180,  90,  40],
[128, 128, 128]

フィルターの掛け算と合計:
(200×1) + (100×1) + (50×1)    → 350
(180×0) + ( 90×0) + (40×0)    → 0
(128×-1) + (128×-1) + (128×-1) → -384
結果:350 + 0 - 384 = -34

結果:-34(エッジなしまたは弱い)
上下の明暗の差が小さいため、エッジはほとんどないか、弱いと判断されます。

ステップ3:複数の畳み込み結果を比較

スライド位置 計算結果 エッジの有無
左上:326 強いエッジあり
中央部分:-34    弱いエッジまたはなし

結果の数値が大きな正の数値(例:326) → フィルターの範囲内において、上部が明るく、下部が暗い → 強いエッジが存在することを示します。
結果の数値が0に近い値や小さい値(例:-34) → 明暗の差が小さい → エッジがほとんどない部分です。
結果の数値が負の大きな値 → 上部が暗く、下部が明るいエッジを示します。

CNNでは、畳み込みフィルターを画像全体にスライドしながら適用し、各ポイントのエッジの有無を数値として抽出します。エッジが強い場所では大きな値が生成され、そこに「線」や「形」があることを示します。このようにして、CNNは画像の輪郭や形状を段階的に理解し、最終的に画像の認識や分類へとつなげています。

水平方向と垂直方向のエッジ検出

CNNはフィルターの「配列パターン」を変えることで、異なる方向のエッジを検出します。

水平方向エッジ検出フィルター
[  1,  0, -1 ]
[  1,  0, -1 ]
[  1,  0, -1 ]

横方向の線を見つけるためのフィルターです。
垂直方向・水平方向のエッジ情報を組み合わせることで、「四角形の枠」や「曲線」などの複雑な形を捉えます。

カラー画像の場合:RGBチャンネルの処理

白黒画像では1つのチャンネルのみ処理しますが、カラー画像では「RGB(赤・緑・青)」の3チャンネルがあります。

RGBチャンネルごとの処理

  • 赤チャンネル(R):赤成分のエッジを検出

  • 緑チャンネル(G):緑成分のエッジを検出

  • 青チャンネル(B):青成分のエッジを検出

CNNはこれら3つのチャンネルごとにフィルターを適用し、最終的に3つの結果を重ね合わせることで、色の違いによる特徴を学習します。

具体例:赤いリンゴの画像

  • 赤チャンネル → 赤いリンゴの輪郭が強く反応

  • 緑チャンネル → 背景の緑の葉の輪郭が反応

  • 青チャンネル → 青空や影の部分が反応

これらの情報を組み合わせて「赤い丸い形がリンゴである」と判断します。

活性化関数(ReLU)の役割

CNNの「畳み込み層」で画像の特徴を抽出した後、得られた数値はそのまま次の処理に送られるわけではありません。次に重要な役割を果たすのが活性化関数です。活性化関数を通すことで、重要な情報を強調し、不要な情報を削除し、ネットワークがより効率的に特徴を学習できるようにします。

活性化関数とは、畳み込み演算やフィルター適用後の数値に対して「非線形な変換」を行う関数です。非線形な変換を行うことで、ニューラルネットワークは複雑なデータを表現・学習できるようになります。

CNNで最も使われる活性化関数:ReLU

CNNでは、活性化関数として主にReLU(Rectified Linear Unit)が使われます。

ReLUの式
ReLU(x) = max(0, x)

これは、入力された値 x が0未満の場合は0に置き換え、0以上の場合はそのままの値を返す関数です。

ReLUの具体例

以下は、畳み込み演算後に得られた特徴マップの一部の数値です。

畳み込み演算結果(例)
[ 326, -34, 450 ],
[-128,  60, -10 ],
[ 500, 150, -200 ]

ReLUを適用した後の結果

ReLU([ 326, -34, 450 ]) → [ 326,   0, 450 ]
ReLU([-128,  60, -10 ]) → [   0,  60,   0 ]
ReLU([ 500, 150, -200 ]) → [ 500, 150,   0 ]

ポイント
• 正の値(326, 450, 500 など):そのまま出力され、重要な特徴として次の層に送られる。
• 負の値(-34, -128, -10, -200 など):0に変換され、無視される。

ReLUのメリット

① 計算がシンプルで高速
ReLUは単純な比較演算(0との比較)なので、他の複雑な関数に比べて計算コストが低く、高速に処理できます。

② 勾配消失問題を軽減
ニューラルネットワークの学習で問題となる「勾配消失問題」を軽減する効果があります。これは、深い層で学習が進まなくなる問題で、ReLUはこれを防ぐ役割を果たします。

③ 学習の収束が早い
ReLUを使用すると、ネットワークがより早く収束し、少ない計算ステップで結果を得られることが知られています。

ReLUの欠点と対策

欠点:ゼロマスク問題
ReLUは0未満の値を一律で0に置き換えるため、一部のニューロンが出力を持たず、「死んだニューロン(Dead Neurons)」になることがあります。

対策:派生型ReLU
Leaky ReLUは、負の値に対してもわずかな値を返す関数です。
Leaky ReLU(x) = max(αx, x) (αは小さな正の値、例:0.01)
これにより、ゼロマスク問題が発生しにくくなります。

活性化関数は、畳み込み演算後に「重要な特徴を強調し、不要な情報を削除する」役割を担います。CNNで一般的に使われるReLUは、シンプルな計算で高い効率を発揮し、ネットワークがより効果的に学習できるようになります。ReLUを適用した結果、特徴マップは不要なノイズが減り、重要なエッジや形の情報だけが次の層へ伝わるようになります。

プーリング層(Pooling Layer)の役割

CNNの「畳み込み層」で画像のエッジや形の情報を抽出し、「活性化関数」で重要な特徴を強調した後、次に行うのがプーリング層です。プーリング層の主な目的は、情報を要約して計算量を減らし、過学習を防ぐことです。

プーリング層とは?

プーリング層は、画像の特徴を保持しながらデータのサイズを縮小する処理を行います。これにより、計算コストを削減し、ネットワークの性能が向上します。

最大プーリング(Max Pooling)

CNNでよく使われる手法は最大プーリング(Max Pooling)です。最大プーリングは、一定範囲の中で最大値を選択する方法です。

具体例:最大プーリングの手順

以下の特徴マップに対して最大プーリングを行います。

特徴マップ(4×4)
[ 1,  3,  2,  4 ],
[ 5,  6,  8,  7 ],
[ 3,  9, 10, 12 ],
[ 1,  2,  4,  5 ]

最大プーリングの結果
範囲①: [1, 3], [5, 6] → 最大値:6
範囲②: [2, 4], [8, 7] → 最大値:8
範囲③: [3, 9], [1, 2] → 最大値:9
範囲④: [10, 12], [4, 5] → 最大値:12

結果のプーリング後のマップ:

[ 6,  8 ],
[ 9, 12 ]

「最大値」を取ることで、重要な特徴を残しつつデータのサイズを縮小しています。
不要な細かいノイズ情報が削除され、学習効率が向上します。

平均プーリング(Average Pooling)

最大プーリングの代わりに平均値を取る方法もあります。
平均プーリングでは、対象範囲内の数値の平均を計算して要約します。

プーリング層の役割まとめ

情報の要約:重要な特徴を保持しつつデータサイズを縮小。
計算量削減:次の処理で必要な計算リソースを減らす。
過学習防止:不要な細かい情報を削除することで、過学習を防ぎ、汎化性能を向上。

全結合層(Fully Connected Layer)の役割

CNNの最後の段階である全結合層(Fully Connected Layer)は、画像の特徴情報をもとに分類結果を出力する層です。

全結合層とは?

全結合層では、プーリング層からの特徴マップを1次元のベクトルに変換し、従来のニューラルネットワークのようにすべてのニューロンが結合されます。

全結合層の手順

① 特徴マップの平坦化(Flatten)
プーリング層の出力は通常2次元の行列ですが、全結合層ではこれを1次元のリストに変換します。
例:

入力マップ(2×2)
[ 6, 8 ],
[ 9, 12 ]

→ 平坦化後:
[6, 8, 9, 12]

② 重みとバイアスの計算
全結合層では、それぞれの入力値に重みを掛け、バイアスを加算して合計を出し、活性化関数を適用して次の層に出力します。このような操作を重ねることで、最終的に出力層に到達します。

③ 出力層の分類
最後の出力層で、画像がどのクラスに属するかを分類します。
例えば、「犬」「猫」「鳥」の3クラスの分類問題の場合、出力は次のようになります。
[ 犬:5%, 猫:90%, 鳥:5% ]

CNNは、この結果を基に「この画像は90%の確率で猫です」と判断します。

全結合層の役割

特徴マップを1次元に変換し、ニューラルネットワークとして分類処理を行う。
出力層ではクラス分類を行い、確率値を出力します。

出力層の役割

出力層は、画像がどのクラスに属するかを示す最終結果を出力します。出力はソフトマックス関数を使って確率値に変換されます。

ソフトマックス関数による確率値の計算

ソフトマックス関数は、出力値を確率として表現します。
例えば、3つのクラス(犬・猫・鳥)の出力が次のような値だったとします:

[ 2.0, 4.5, 0.5 ]

ソフトマックスの計算
P(犬) = exp(2.0) / (exp(2.0) + exp(4.5) + exp(0.5))
P(猫) = exp(4.5) / (exp(2.0) + exp(4.5) + exp(0.5))
P(鳥) = exp(0.5) / (exp(2.0) + exp(4.5) + exp(0.5))

これにより、それぞれのクラスがどのくらいの確率で該当するかを計算します。

出力の具体例
出力層の結果が次のようになった場合:
[ 犬:0.1, 猫:0.8, 鳥:0.1 ]

CNNは「この画像は80%の確率で猫です」と分類結果を出力します。

まとめ

本記事では、畳み込みニューラルネットワーク(CNN)の仕組みを大まかな動作フローから具体的な演算の仕組みまで解説しました。CNNは、画像認識において非常に重要な役割を果たすアルゴリズムです。その処理は、画像を単なるピクセルの集合として扱うのではなく、エッジや形状、模様、色の違いなどの特徴を段階的に抽出する仕組みによって構成されています。

生成AIパスポートでは、画像生成技術やAIモデルに関する問題が出題されるため、CNNの基本的な仕組みを理解することは非常に重要です。CNNの知識は、生成AIや画像認識モデルの仕組みを深く理解し、より効果的に活用するための土台となります。

おわりに

CNNは画像認識だけでなく、生成AIや医療画像診断、自動運転など、幅広い分野で応用されています。生成AIパスポートの試験対策だけでなく、今後の技術トレンドを追い続けるためにもCNNの理解は重要です。この記事が学びの一助となり、今後のステップアップにつながれば幸いです。興味を持った方はぜひ実際にモデルを構築して試してみてください!

いいなと思ったら応援しよう!