ディープラーニングを学びたい!という人にとって、まず到達する目標としては畳み込みニューラルネットワーク(CNN)を実装することだと思います。しかし、CNNをただ実装するだけであれば、さほど難しくはないのですが、中身をある程度理解していない状態では結果の考察であったり、モデルの改善や、技術の応用は難しいと思います。
ここでは、これからディープラーニングを学びたいという方、中身の理解が不安という方向けに、CNNまでを最短距離で説明していきます。
畳み込みニューラルネットワークのための基礎統計
統計が苦手な方多いと思います。ですがCNNを使うだけであれば、深く考えなくてもそれなりに使いこなすことはできます。ここでは最低限覚えておくと役立つことを説明していきます。
まずはニューラルネットワークのアルゴリズムを見ていきましょう。詳細は前の記事でも説明しているのでリンクを貼っておきます↓
ニューラルネットワークは人間の脳を模擬したアルゴリズムを学習モデル化したものです。図の●がニューロン(データ)で、データどうしが複雑につながった構造をしています。ここで大切なのが、ニューロンをつなぐ神経回路です。この神経回路が統計モデルとなっています。
簡単に説明すると神経回路は係数(重み)wと、定数(バイアス)bの関数であると言えます。xを入力データ、yを出力データとすると下記のように表せます。
y = wx + b
この関数が多数存在し、あたかも複雑な回答をするように振る舞うのがニューラルネットワークです。この関数は基礎統計でいう最小二乗法と似たような考え方ができます。最小二乗法の詳細は前の記事のリンクを載せておきます。↓
最小二乗法は実測値と予測値の誤差(バラつき)を最小にするようにwとbを決定していくモデルでした。ニューラルネットワークではこのような誤差を最小にするwとbを決定していく試みを繰返し実施(学習)しています。
また、最小二乗法は誤差の分布が正規分布する「正規性」を前提として成立するモデルでした。その辺りの詳細は↓リンクを参照ください。
したがって、ニューラルネットワークで学習していく上でも誤差の分布は重要な要素で、多数ある神経回路で誤差の正規性を保つことが必要となります。
誤差の値を最小にする「誤差逆伝播法」について
ニューラルネットワークで誤差を最小にするwとbを決定していく試みを繰返し実施していく方法を誤差逆伝播法と言います。どうやって誤差を最小にしていくか?は代表的な方法に「最急降下法」があります。
縦軸が誤差、横軸に重みw1をとるグラフを考えていきます。最初に適当に重みを設定し誤差を出します。そこから重みを変化させ誤差を小さくしていき、最終的には誤差が最小となるような重みを見つけるのが最急降下法になります。
このような方法を無数に存在するすべての神経回路について実施し、ニューラルネットワーク全体の誤差が最小になるようにwとbを更新していく手法が「誤差逆伝播法」です。
誤差逆伝播法について詳細リンクを貼っておきます↓
画像の「畳み込み」とは何か?
畳み込みニューラルネットワークでの「畳み込み」とは何か?聞きなれないと思います。ですが、実は畳み込みはいろんなところで使われています。画像編集ソフトを使ったことある人であればフィルターで、「輪郭抽出」とか「ガウシアンぼかし」など使ったことあると思います。これらは畳み込みの一種となります。
↑の画像のようにオリジナル画像は同一でも通すフィルターの情報を変えることで、いろいろな特徴の異なる画像が出力されます。
画像の「畳み込み」とは、画像の特徴を捉えるためにフィルターを通すことを言い、CNNでは大量のフィルターを通し学習していくことで、そのタスクにあった最適なフィルターが選ばれていく構造となっています。
畳み込みに関して詳細リンクを貼っておきます↓
畳み込みニューラルネットワークのモデル構造
ここまでで説明したニューラルネットワークと畳み込みを組み合わせると畳み込みニューラルネットワーク(CNN)なのですが、実際にはもっと複雑な構造をしています。というのも、ディープラーニングの歴史で、高精度にするために深い層を学習する試みがされてきました。現在の形はその集大成ですので、いろいろな追加機能が付加されています。ここでは追加機能を説明しモデルの全体像を把握していきます。
↓に簡単なCNNモデルのイメージを図示します。これは、Neural Network Console(sony)※でモデル設計をしたイメージです。※Neural Network Consoleはコーディング無しでディープラーニングをできるツールです。
ここで畳み込み+ニューラルネットワークを実施しているブロックは「C」Convolutionです。それ以外のブロックを説明していきます。
- 「B」Batch Normalization
入力データのmini batch(一回に処理する複数の画像)間で正規化する(中間層の出力が平均0、分散1となるように変換する)処理をおこなっています。上の方で「神経回路で誤差の正規性を保つことが必要」と述べましたが、Batch Normalizationは学習を進めるうちにデータの分布が変化していくのを防ぐ役割があり、正規性を保てるため学習を高速化することができます。
- 「R」ReLU/「S」Softmax(活性化関数)
活性化関数の一種で、一定以上の値であればデータを出力するが、一定以下であればデータを出力しないような命令を出す関数です。非線形的な変換により、モデルの表現力を向上させることができます。歴史的には、ディープラーニングの学習を進めるうえで勾配消失問題という学習が進まなくなる問題を克服したのが活性化関数であり、その代表的なモノがReLUです。
- 「M」Max Pooling
畳み込みで加速度的にデータが増大していくので、結果に対する影響度の低い情報を削除するのがMax Poolingです。Max Poolingにより計算コストを下げれる、バラつきに強くなる効果があります。
- 「A」Affine(全結合層)
全結合層はこれまでに抽出してきた特徴量を使い画像分類をする層になります。カーネルを使った畳み込みを実施せず、全部のデータへそれぞれ重みをかけデータを出力します。
- 「C」Categorical Cross Entropy(ロス関数)
ロス関数は、出力(予測値)が真の値(正解)からどの程度離れているかを示す指標となっています。多クラスの分類問題の場合はCategorical Cross Entropyを使います。
以上がCNNモデルを構築する上で最低知っておきたい内容となります。モデル構築のため詳細リンクを貼っておきます↓
畳み込みニューラルネットワークのPython実装
ここまで説明してきたCNNについて、実際にコードを書いて実装してみましょう。TensorFlowライブラリを使うと簡単に実装することが可能となっています。具体的なコードの詳細は過去の記事にまとめてありますので↓へリンクを貼っておきます。
まとめ
- 畳み込みニューラルネットワークを理解し、実装するまでに最低知っておくべき内容をまとめました。
- これを理解しておくとより複雑なアルゴリズムである物体検出や、セグメンテーションなどにも応用できるので、是非読みこんでいただき実際にコードを書いて動かしてみてください。
コメント