アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

Epoch数とミニバッチ単位を変化させて精度の変化を見る:使い方7/ニューラルネットワークコンソール

CONFIGタブの「Global Config」には、学習回数を決める「Max Epoch」と1回の学習の単位を決める「Batch Size」があります。 

ニューラルネットワークの学習というのは、重みのパラメータの数値をあげたり、さげたりしながら、最適な値に収束させていくことでした。 

ということは・・。 

学習をある程度の回数こなさないと最適な値にはならないということです。 

とはいえ、学習の回数をいたずらに増やしても時間の無駄です。 

学習回数をどのくらいにするのが、一番効率的に精度をMAXにできるんだろう。 

そういう素朴な疑問です。

 

2017/12/01追記

>以降の説明の画面は、Version1.00のものです。

>Version1.10で一部アイコンのデザイン等が変更になりました。

>しかし、以降の説明には影響がないと判断しています。

 

まず、ニューラルネットワークを用意する

 

ニューラルネットワークコンソールを起動します。 

例によって、以下のようなシンプルなCNNを組みます。

f:id:arakan_no_boku:20170826132310j:plain

 

上記の詳しい組み方や初期値の与え方は、「使い方5」「使い方6」で説明しているので繰り返しはやりません。 

よくわからない時は、読み直してもらえるとわかりやすいと思います。

arakan-pgm-ai.hatenablog.com

arakan-pgm-ai.hatenablog.com

 

パラメータの意味をちょっと説明

 

上記のニューラルネットワークを組み終わってるとこからすすめます。 

ここで、COFIGタブを開いてください。

f:id:arakan_no_boku:20170827215553j:plain

 

左側は、「Global Config」を選びます。 

ここで注目するのは、上記の赤枠内の「Max Epoch」と「Batch Size」です。  

最初にちょっと書いてますが、もう少し補足します。 

説明のために、まずこのプロジェクトのデータ件数を確認しておきましょう。 

DATASETタブを開いてみてください。 

そうすると、以下のような画面になると思います。

f:id:arakan_no_boku:20170827215449j:plain

 

左側の赤枠部分で、「Num Data」の項目がデータ件数です。 

これを見ると、Traiingデータは1500件、Validation用データは500件だとわかります。 

じゃあ、例えば学習とかする時に、Trainingデータを1500件分を、順番に処理していって終わり・・みたいなやり方をするかというと、そんなことはありません。 

実際は、ミニバッチ法といって、もう少し少ない塊(例えば100件分とか)をランダムに選び出して、1回学習をして、終わったら、またランダムに同じ数を選び出して、また学習する。 

そんな感じで繰り返していくのです。 

この「1回に処理する件数=ランダムに選び出す塊の数」を指定するのが、「Bach Size」です。 

こうして小さい塊で処理を行い、テストデータ件数を全部カバーした段階(つまり、今回のケースなら1500件)で、1単位の学習を終了したというふうに考えます。 

つまり、データ件数が1500件で、「Bach Size」が100なら、15回繰り返すと、1500件のデータに相当する件数分処理したことになりますよね。 

この1単位のことを「Epoch(エポック)」と呼ぶのです。 

デフォルトだと、これが「Epoch=100」で「Bach Size=64」になってます。 

つまり、一回の処理で64件ずつのデータを処理して、1500件で1単位の学習を100回繰り返すということですね。 

単純計算で、1500 ✕ 100回 = 約15万回の学習をしていることになります。

 

パラメータを変更して試してみる

 

この理屈がわかると、例えば、Epoch=100で、99.2%だったのなら、もっと、学習回数を増やしたら、もっと良くなるのじゃないか? 

もしくは、「Bach Size」が64みたいな半端な数だと、1500件をきれいに割り切れないから、例えば100とか150とか、割り切れる数に増やしたら、結果が改善するんじゃないのか? 

みたいな疑問が浮かぶ方が普通ですよね。 

疑問が浮かんだら、やってみよう。 

それができるのが、ニューラルネットワークコンソールの良い所です。 

とりあえず、「Max Epoch」を100→200に増やしてみます。 

これでのべ学習回数は、15万回→30万回になるので、回数が増えれば良いのなら、相当結果がよくなるはずですよね。 

あと、ついでに、「Bach Size」 を 100、150の切りの良い数にもしてみましょう。 

まず、Epoch=200、Bach Size=150 でどうかな?

f:id:arakan_no_boku:20170827225849j:plain

 

学習結果はこんな感じ・・・あまり、変わらないですね。

f:id:arakan_no_boku:20170827225821j:plain

 

精度は・・あれ、99%・・向上はしないですね。

f:id:arakan_no_boku:20170827225934j:plain

 

じゃあ、Epoch=200 で、Bach Size=100でどうかな?

f:id:arakan_no_boku:20170827230005j:plain

 

学習結果は・・なんかエラー増えてますね。

f:id:arakan_no_boku:20170827230037j:plain

 

精度は、98,8%・・あれれ、下がってしまった。

f:id:arakan_no_boku:20170827230128j:plain

 

この結果からわかることは。

単に、Epoch数を増やしても、時間がかかるだけで精度(正確さ)の向上は頭打ちになるみたいだということです。 

ただ、工夫なく階層を深くしてもダメだったのと同じですね。 

そう考えると、デフォルトの設定は、うまくできてます。 

デフォルトの設定って、色々予測して変更しながら結果を見て、最善と思われる値になおしていくという試行錯誤の結果でしょうから、当然といえば当然ではありますが。 

でも、やってみると、なんとなく納得できます。 

気楽にできるニューラルネットワークコンソールという環境はありがたいですね。

 


次の記事

arakan-pgm-ai.hatenablog.com

ニューラルネットワークコンソールカテゴリの記事一覧はこちらです。

arakan-pgm-ai.hatenablog.com

f:id:arakan_no_boku:20171115215731j:plain