"機械学習","信号解析","ディープラーニング"の勉強

HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学などをテーマに扱っていきます

Irisデータを使ってChainerを試してみましょう

 

 

 

 Chainer

日本のPrefferd Networks社が提供するニューラルネットのフレームワークです。Pythonですべて記述することができます。書きやすいので個人的にこれを使っていこうと思っています。

 

TensorFlowに比べ人口が少ないような気がしますが、それはTensorFlowがChainerに比べ際立って優れているからというわけではなく、単にリリースがアメリカ、そしてGoogleであるということに起因していると思われます。(そういう私もTensorFlowとずいぶん悩んだ)

 

Chainerの基本的な使い方

まず使ってみましょう

そもそもプログラミング言語1つあれば(性能が出るかはともかくとして)、どんなニューラルネットワークでも記述できます。それに対しフレームワーク利用のメリットは、ニューラルネットワークの記述が楽になる、そしてニューラルネットワークを学習する際に当たり前のように使う機能が予め搭載されているというところになります。

 

従ってChainerを使おうという場合には、Chainerの各機能を使う練習がまず手始めに必要です。細かい中身の理解はその後でも構わないでしょう。

 

Irisデータは入力の次元が4で、データとしてとても軽いです。CPUで十分に高速処理が可能ですから、とりあえず動かしてみるという場合には持って来いです。

分類の精度を高める目的ではなく、単にニューラルネットの学習が動作するかをいろいろ試すのにもいいでしょう。

 

IRISデータの分類問題を対象とした全体コード

とりあえず上記のchainerやnumpy、sklearnは深層学習をやる人ならば入っているでしょう。ということで、その点に関しては前提としておきます。

私自身はPythonを始める段階で以下の記事を参考にしました。

qiita.com

anacondaはnumpyもsklearnも最初から導入されたPythonのディストリビューションです(他にもデータ解析に必要なライブラリが多数入っています)。これを用いてPythonを使う場合には、追加で必要なのはchainerだけになります。

 

以下が全体コード。コピペで動かせる状態のはずです。

id:aidiaryさん

のコメントを受けデータ入力前の正規化(標準化)を導入。

更に各層ごとのバッチ正規化を導入。

コメントアウトで好きに外せます。

(現状、バッチ正規化を入れるとテストデータに対して非常に性能が悪くなります。バッチ正規化による変換がテストデータに悪い影響を及ぼしているか、あるいは反映されていない可能性があります)

 

これは4層のニューラルネットワークで入力が4次元、出力が3次元、隠れ層は好きに設定できます。Irisデータはもともと難しい問題ではないので、高精度がすぐ出るのですが、意外と安定しません。

 

試してみること

まずは隠れ層の数を変えてみても良いでしょうし、層自体を増やしてもいいでしょう(その場合コードを追加する必要は有りますが)。またはドロップアウトの数字を変えてみたり、ドロップアウトを行う層を追加したり変更したりも試してみてください。

 

学習中に見るべきところ

注意してみるべきは、学習最中に表示される以下の図における main/lossとvalidation/main/lossの関係です。できれば近いほうが望ましいのですが、ニューラルネットは訓練データに合わせた学習しかしません。訓練データに対して損失は当然下がっていきますが、訓練データとは別に準備したテストデータに対しては無頓着です。あまりにもテストデータに対する損失が下がっていかないようでしたら過学習を起こしていると考えていいでしょう。以下では両方とも上手く下がっていっています。

 

f:id:s0sem0y:20161220215821p:plain

 

右の方にあるAccuracyを見るという手も当然あります。これは一番重要な指標ですが、Accuracyには影響を及ぼさないだけで、偶然ギリギリの判別を行っているという場合もあります。要するにAccuracyは高いのだが、損失はまだまだ大きいという場合があるのです。少しデータがズレただけですぐに判別を誤りそうだ状態になります。それは未知のデータを分類したい場合には望むところではありませんから、同時にlossも必ず見ておく必要があるのです。