"BOKU"のITな日常

テクノロジー以外にも、日常には、面白そうな”イット”がつまってるんだな

Epoch数とミニバッチサイズの解説と、変化させた時の精度の変化/Neural Network Console

f:id:arakan_no_boku:20190326212937j:plain

 ニューラルネットワークの学習は、重みパラメータを、少しずつ増やしたり・減らしたりして最適な値に収束させるので、ある程度の回数を繰り返さないといけませんが、多すぎても良くなくて、最適な値に設定してやる必要があります。 

そんな、学習回数等の調整を行うのは、CONFIGタブの「Global Config」です。

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

今回は、この2つの項目の意味合いを整理しつつ、実際に設定値を触ると、どういう変化があるのかを試して遊んでみます。 

 

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

 

Configタブ

 

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

ここで、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数を増やしても、時間がかかるだけで精度(正確さ)の向上は頭打ちになるみたいだということがわかりました。 

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

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

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

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

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

ではでは。