CNN(畳み込みニューラルネットワーク)の仕組み
現在、ニューラルネットワークは様々な分野で目覚ましい活躍を遂げています。
今回はニューラルネットワークの中で、画像処理系に良く使われるCNN(畳み込みニューラルネットワーク)の簡単仕組みを、私なりにまとめました。
前提として、ニューラルネットワークの知識、知見があった方がスムーズに理解できると思います。過去記事も参照してみて下さい。
目次
1.CNNとは
CNN(Convolutional Neural Network)はニューラルネットワークの一種で、何段も層を重ねて学習させていきます。その為ディープラーニングに分類されます。
CNNは通常のニューラルネットワークに「畳み込み層」、「プーリング層」と呼ばれる特殊な層を学習に使用していきます。
CNN全体の構造を話す前に畳み込み層やプーリング層がどのような役割を果たすのか説明していきます。
1.1 畳み込み層
初めに畳み込み層の中でどのようなことが行われているか説明していきます。
最初に畳み込み層の役割についてお話していきます。
畳み込み層の役割を一言で表すと「データの特徴を際立たせる層」です。
従来のニューラルネットワークは、元の画像全体をそのまま結合して学習させることが基本でしたが、機械が画像全体から対象の特徴を正確に捉えることは難しく、ほとんどの場合において満足の行く精度には達しませんでした。
その為、CNNでは畳み込み層を使って、様々な特徴を取り出し学習させていく事をコンセプトに畳み込み層が導入されています。
実際に人間が画像内の対象を識別する時、基本的には画像全体を見ずに何かしらの特徴を見つけて判別していきます。
その為、特徴を際立てる事は機械学習が人間の脳と近い予測モデルを構築する為に欠かせないステップという。
では、実際に手書き文字認識の例を使って、畳み込み層の中身についてお話していこうと思います。
① まず初めに手書きで書いた数字を画像として取り込みます。
② この画像を簡略化して、(白=0、黒=1)2値、5×5の行列に変換したとします。
③ ②に以下のような畳み込みフィルターを通していきます
(※今回用意した畳み込みフィルターは適当に設定しました)
ここで畳み込みフィルターについて軽く説明していきます。
畳み込みフィルターは一言で言うと、「特徴を際立たせる為のフィルター」です
特徴と言っても種類は様々あり、画像を鮮明にするフィルター、ぼかすフィルター、エッジを際立たせるフィルターなどなど沢山あります。
また、畳み込みフィルターはニューラルネットワークに限らず、photoshopなどの画像編集ソフトにも用いられています。
畳み込みフィルターの詳しい計算方法は下記を見てください。
④以下のように行列全体をスライドしながら計算し、特徴マップを生成していきます
(※上記のやり方だと、画像の端が切れてしまいますので、ゼロパディングと呼ばれる方法を追加することもあります。)
畳み込み層で行っていることは以上です。
一回の学習で複数種類のフィルターを用意して、学習していく中で適切な畳み込みフィルターを作成していきます。
※注意※
一見便利な畳み込みフィルターですがその性質上、画像の拡大、縮小、回転には上手く対応しきれていません。
これらの問題も解決する為に、データの拡張をして拡大、縮小、回転した画像のサンプルを増やす必要があります。
1.2 プーリング層
プーリング層は一言で言ってしまうと、画像の詳細情報を消すための層 です。
実際に行っている操作を通して、プーリング層について図を通して簡単に説明していきます。
上図4×4ピクセルの元データを、2×2ピクセルずつに分けて、1つのピクセルにまとめています。
max pooling は各ブロックの最大値、average poolingは各ブロックの平均値を残しています。
プーリング層で行っていることは以上です。
たったこれだけの操作に、どういった利点があるのでしょうか?
大きく分けて2つの利点があります。
①対象の画像内のズレやノイズに対処しやすくなる。
プーリング層は画像の局所領域をフィルター通し、計算して行く為、画像内の細かいズレやノイズに対処しやすくなります。
つまり、判別したい対象が画像のどこにいても検知しやすくなります。(※移動不変性と言います)
ディープラーニングでは、移動不変性を高める為にmax pooling を使用する事が多いです。
現実で集めてきた画像データが似た条件(背景、画像の明暗…etc)で揃うことは非常に稀ですので、機械に学習させる前に画像のズレやノイズをある程度修正出来れば、精度の上昇も期待できます。
②計算量を大幅に減らせる。
プーリング層の解説の通り、局所領域を一つのピクセルとして計算していますので、元の画像データより小さくなります。
上の例だと2×2ピクセルの領域を1つのピクセルとして計算していますので、単純に考えてデータ量は元の画像の1/4になります。
基本的にニューラルネットワークは学習に多大な時間がかかりますので、データを減らし学習時間を減らすことはとても重要です。
※注意※
プーリング層は詳細情報を減らす為の層ですが、画像によっては詳細情報が特徴として重要な場合も勿論あります。
実際に、畳み込み層とプーリング層を交互に実装することもあれば、畳み込み層2,3コにつきプーリング層1つや、プーリング層を実装していない例もあります
つまり、プーリング層は学習の時間を減らしより大雑把に特徴を捉えますが、必ずしも精度向上に繋がる訳ではありません。
用途によって使う場面を選ぶ必要があります。
2.CNNの構造
ここまで、CNNに重要な構成要素である「畳み込み層」と「プーリング層」の話をしてきました。
それらを元にCNNがどんな構成になっているか最も簡単な例で確認していきます。
① 元の画像データを畳み込みフィルターに入れて、特徴を際立たせる。
② プーリング層で局所領域の特徴を割り出す。
③ ①②を何回か繰り返す。
④ 得られた特徴を全結合層と接続して活性化関数を使って(ReLU関数など)分類していく。
⑤ 活性化関数(ソフトマックス関数など)を用いて出力する。
⑥ 損失関数(クロスエントロピーなど)を使って誤差逆伝播によりフィルター、重み、バイアスを更新していく。
(※実際にはドロップアウト層などを入れて、過学習対策などが行われていたりします。)
(※活性化関数や誤差関数などの詳しい解説は過去の記事を参照してください。)
構造に関しましては、一般的なニューラルネットワークと大差はないです。
仕組みとしては単純ですが、出力層の数、畳み込みフィルターの枚数、スライド間隔、学習率の設定、それぞれの層の数、などのハイパーパラメーターは適時こちらで調整していく必要があります。
3.まとめ
最後に従来のニューラルネットワークに比べてCNNが強い点をまとめて終わりたい思います。
CNNの一番画期的な点は、様々な特徴を取り出し学習させていく点です。
この作業により、従来のニューラルネットワークに比べて
①画像の移動に強い
②計算量を大幅に減らせる
③局所領域で見ていくので、ある程度過学習を抑制する
CNNはこういったポイントで最初に成功したディープラーニングと言われています!
ただし、CNNにもまだ課題点は多くあります。
1つ例を挙げると、そもそもニューラルネットワークは原則として層を重ねる程、複雑な関数を表現できるようになるので(理論上)訓練の精度は上がります。
しかし層を増やし過ぎてしまうと、勾配消失、勾配爆発などの別の問題が浮上します。(詳しくは過去の記事参照してください)
次の記事ではそれらの問題点に対処した、CNNの発展形のアルゴリズムに触れていきたいと思います。
また、CNNの実装に関しては、後日別の記事にまとめていきたいと思います。
この記事のタグ
数学を活かせる環境を探し求めてIT業界に来ました!
まだまだ修行中の身ですが、様々な経験や考えを記事にしてきたいと思います!!