こんにちは、サイオステクノロジーの藤井です。
この記事では、ディープラーニングが具体的にどのようなアルゴリズムで動いているかを書いていこうと思います。ディープラーニングを使ったことのない方や、私と同じように動かしたことはあるけどなんで動いているかわからない方が、ディープラーニングを理解する助けになれれば良いなと思っております。
前回の「[AI入門] ディープラーニングの仕組み ~その2:学習を高速に行う仕組み~」では、ミニバッチ学習と誤差逆伝播の仕組みについて書きました。
今回は、画像の学習でよく使われるCNNについて学んだので、その仕組みと実際に計算するときの手順について書いていきます。
CNNとは
CNNとはConvolutional neural network(畳み込みニューラルネットワーク)の略称で畳み込み層とプーリング層をもつニューラルネットワークのことです。CNNを用いると位置関係を学習させることができます。
畳み込み処理
畳み込み処理では、入力とフィルターから、それぞれのブロックで「入力がどの程度フィルターに似ているか」を表す特徴マップを求めます。
例:入力が4×4、フィルターが2×2の場合
まず入力の左上2×2マス(フィルターのサイズと同じ)を取り出し、フィルターと同じ位置の要素同士を掛け合わせ、その総和をもとめます。これが特徴マップの一番左上のマスの値になります。
入力から取り出すマスを1マス右にずらし同じ計算をします。それが特徴マップ1マス右の値
特徴マップの残りのマスも同様に計算します。
今回計算したフィルターは右上と左下が1であり、これは「右上から左下への斜めの線」の形を表しています。このフィルターでは「右上から左下への斜めの線」っぽさがどれだけあるかを測ることができます。
特徴マップを見ると、この入力データは左上と右下が「右上から左下への斜めの線」っぽくて、逆に右上と左下は「右上から左下への斜めの線」っぽさがあまりないデータと判断できます。
実際の学習ではフィルターが何個もあり、特徴マップも同じ数だけできます。
プーリング処理
ここではプーリング処理の内、maxプーリングについて説明します。maxプーリングでは特徴マップを一定範囲ごとに最大値を求めます。
例えば、4×4の特徴マップに2×2の範囲ごとでプーリング処理をする場合
特徴マップを2×2マスになるように区切り、それぞれの範囲で最大値を求め、それをまとめます。
今回は1番左上に6がありますが、もし仮にこの6が1マス右にずれたとしても最終的な出力結果は変わりません。このようにプーリング層を使うことで入力データにおいて位置が微妙にずれたとしてもちゃんと特徴をつかめるようになります。
畳み込み処理を実際に計算する場合
畳み込み処理を実際にコンピュータでする場合for文を何回も使うと遅いので、入力データやフィルタを変形してnumpyなどの行列計算を使って計算します。
今回は4×4ピクセルの画像データを入力するとします。(この例では入力もフィルターもわかりやすくするため整数が順番にならんでいますが、実際は小数です。)
もし画像データがカラーならばRGBの3チャンネル分データがあります。入力が3チャンネルの場合フィルターも3チャンネルになります。特徴マップの値は各チャンネルの値の和です。
入力データを計算しやすいように展開します。赤データのフィルターを一番左上に適用したときに計算に使う値たちを一列にして左上に並べています。(黄色の丸で囲った部分です)その下は、フィルターを1マス右にずらしたときに使う値たちです。右側には別のチャンネル(緑や青)の同じ位置の値があります。
今回はフィルタのサイズを2×2マスとします。フィルタは入力データと同じチャンネル数あるのでこの場合はRGBの3チャンネル分データがあります。
今回はそのフィルターの個数が3個あるとします。黄色で囲った箇所のようにフィルターの要素が縦に並ぶように展開します。
展開した入力データと展開したフィルタで行列の積を計算すると畳み込み処理を行ったのと同じ値が求まります。
上の図の黄色で囲った部分は、入力データの左上を1つ目のフィルターで畳み込み処理を行う計算です。(ここではRGBの3チャンネルのフィルターや入力データはすべて同じですが実際にはそれぞれ異なります。)
最後に特徴マップを変形させて畳み込み処理完了です。特徴マップはフィルターの個数だけ生成され、これが次の層の入力になります。
このような変形をさせると行列演算で畳み込みの処理を行うことができます。
まとめ
この記事で書いたこと
- 畳み込み処理とプーリング処理を行うニューラルネットワークをCNNと呼ぶ
- 畳み込み処理とは「入力がどの程度フィルターに似ているか」をブロックごとに求める処理である
- maxプーリング処理とは、一定範囲ごとに最大値を求め、入力の微小なずれを無視する処理である
- 実際に計算する場合入力とフィルターを変形して行列演算で計算できる
次回は、最適化関数について書こうと思います。
ディープラーニングについて学ぶ上で「ゼロから作るDeep Leaning Pythonで学ぶディープラーニングの理論と実装」を参考にさせていただきました。
この記事で紹介したアルゴリズムはあくまで一例です。興味がある方はほかの方法も調べてみてください。
- [AI入門] ディープラーニングの仕組み ~その1:ニューラルネットワークってなに?~
- [AI入門] ディープラーニングの仕組み ~その2:学習を高速に行う仕組み~
- [AI入門] ディープラーニングの仕組み ~その3:CNNの仕組み~