今回は学習回数に関する話題です。
学習回数の調整を行うパラメータ
ニューラルネットワークの学習は、重みパラメータを、少しずつ増やしたり・減らしたりして最適な値に収束させるので、ある程度の回数を繰り返さないといけませんが、多すぎても良くなくて、最適な値に設定してやる必要があります。
そんな、学習回数等の調整を行うのは、CONFIGタブの「Global Config」です。
このタブには、学習回数を決める「Max Epoch」と1回の学習の単位を決める「Batch Size」があります。
今回は、この2つの項目の意味合いを整理しつつ、実際に設定値を触ると、どういう変化があるのかを試して遊んでみます。
2017/12/01追記
>以降の説明の画面は、Version1.00のものです。
>Version1.10で一部アイコンのデザイン等が変更になりました。
>しかし、以降の説明には影響がないと判断しています。
確認用のニューラルネットワークを用意する
ニューラルネットワークコンソールを起動します。
ネットワークモデル
例によって、以下のようなシンプルなCNNを組みます。
上記の詳しい組み方や初期値の与え方は、「使い方5」「使い方6」で説明しているので繰り返しはやりません。
よくわからない時は、読み直してもらえるとわかりやすいと思います。
Configタブ
上記のニューラルネットワークを組み終わってるとこからすすめます。
ここで、COFIGタブを開いてください。
左側は、「Global Config」を選びます。
ここで注目するのは、上記の赤枠内の「Max Epoch」と「Batch Size」です。
最初にちょっと書いてますが、もう少し補足します。
バッチサイズ(Batch Size)について
まずこのプロジェクトのデータ件数を確認しておきます。
DATASETタブを開きます。
そうすると、以下のような画面になると思います。
左側の赤枠部分で、「Num Data」の項目がデータ件数です。
これを見ると、Traiingデータは1500件、Validation用データは500件だとわかります。
ミニバッチ法
学習とかする時は、Trainingデータを1500件分を、順番に処理していって終わり・・みたいなやり方はしません。
実際は、もう少し少ない塊(例えば100件分とか)をランダムに選び出して、1回学習をして、終わったら、またランダムに同じ数を選び出して、また学習する。
そんな感じで繰り返していくのです。
これを「ミニバッチ法」といいます。
この「1回に処理する件数=ランダムに選び出す塊の数」を指定するのが、「Bach Size」(バッチサイズ)です。
エポック数(Max Epoch)について
こうして小さい塊で処理を行います。
それで、テストデータ件数を全部カバーした段階(つまり、今回のケースなら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を200回に増やしてバッチサイズ150の場合
とりあえず、「Max Epoch」を100→200に増やしてみます。
これでのべ学習回数は、15万回→30万回になるので、回数が増えれば良いのなら、相当結果がよくなるはずですよね。
あと、ついでに、「Bach Size」 を 100、150の切りの良い数にもしてみましょう。
まず、Epoch=200、Bach Size=150 でどうかな?
学習結果はこんな感じ・・・あまり、変わらないですね。
精度は・・あれ、99%・・向上はしないですね。
Max Epochを200回のままバッチサイズ100にした場合
じゃあ、Epoch=200 で、Bach Size=100でどうかな?
学習結果は・・なんかエラー増えてますね。
精度は、98,8%・・あれれ、下がってしまった。
この結果からわかること
単に、Epoch数を増やしても、時間がかかるだけで精度(正確さ)の向上は頭打ちになるみたいだということです。
ただ、工夫なく階層を深くしてもダメだったのと同じですね。
そう考えると、デフォルトの設定は、うまくできてます。
デフォルトの設定って、色々予測して変更しながら結果を見て、最善と思われる値になおしていくという試行錯誤の結果でしょうから、当然といえば当然ではありますが。
でも、やってみると、なんとなく納得できます。
気楽にできるニューラルネットワークコンソールという環境はありがたいですね。
ではでは。