"BOKU"のITな日常

BOKUが勉強したり、考えたことを頭の整理を兼ねてまとめてます。

Epoch数とバッチサイズの解説と、変化させた時の精度の変化について確かめる

f:id:arakan_no_boku:20190326212937j:plain

Epoch数とミニバッチサイズに焦点をあてて整理します。

目次

ミニバッチ法とバッチサイズ

学習(Training)データを1500件ある場合を仮定します。

ニューラルネットワークの学習は、重みパラメータを、少しずつ増やしたり・減らしたりして最適な値に収束させるので、ある程度の回数を繰り返さないといけませんから、この学習データの件数分の学習を1回として、それを何回か繰り返すことになります。

そのさい、ニューラルネットワークの学習では、この1500件を単純に順番に処理して1回の学習・・みたいなやり方はしません。 

もう少し少ない単位(例えば100件分とか)を1回の学習単位にします。

仮にそれを100件とした場合、学習時には1500件の中から100件のデータをランダムに選び出して学習をします。

そしてそれが終わったら、またランダムに100件を選び出して、また学習する。 

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

このやり方のことを「ミニバッチ法」といいます。

この「1回に処理する件数=ランダムに選び出す数」(上記例だと100件)を「Bach Size」(バッチサイズ)といいます。  

ミニバッチ法とエポック数 

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

つまり。

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

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

このサイクルを何単位まわしたかは「エポック数」といいます。

学習回数を決めるときは、エポック数を指定して、その数に達したら学習をやめる・・みたいにします。

Neural Network Consoleだと「Max Epoch」という設定がそれにあたります。

ニューラルネットワークコンソールで確かめる

2017/12/01追記

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

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

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

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

例によって、以下のようなシンプルなCNNを組んだところから始めます。

f:id:arakan_no_boku:20170826132310j:plain

 

このプロジェクトのデータ件数もDATASETタブで確認しておきます。 

f:id:arakan_no_boku:20170827215449j:plain

 左側の赤枠部分の「Num Data」の項目がデータ件数ですが、これを見ると、Traiingデータは1500件、Validation用データは500件だとわかります。

前に書いた例と同じ学習用データは1500件ということです。

Configタブで学習回数とバッチサイズを指定する

COFIGタブを開いてください。

f:id:arakan_no_boku:20170827215553j:plain

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

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

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

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

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

自分の環境で、このデフォルト設定で学習した結果、Accuracyは「99.2%」でした。

この結果をベースにあとの話をすすめます。

Max EpochとBach Sizeを変化させると結果は変わるのか  

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

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

みたいな疑問が浮かびます。 

疑問が浮かんだら、やってみましょう。 

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

Epoch=200、Bach Size=150にしてみる 

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

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

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

まず、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、BachSize=100でやってみる

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

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

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

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

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

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

ではでは。