deep learningの基礎(Early Stopping)
難しくてなかなか進まないですが,今回はEarly Stoppingについて書きたいと思います.deeplearningでは学習回数が多いほど訓練データへの誤差が小さくなり,一見するとよくなっている気になってしまいますが,これはオーバーフィッティングといってその訓練データにだけあった形でアップデートされていくので汎化性能が落ちてしまいます.簡単にいうとそのデータには適応するけど汎用性は低いよ,ほかのデータ使ったらうまくいかへんかも.みたいな感じです.
なので,学習回数をいい感じのところでとめたい.そんな時にEarly Stoppingを使います.やり方は「前のエポックの時と比べ誤差が増えたら学習を打ち切る」というものです.ただ,誤差はエポックごとに上下するので「ある一定のエポック数を通して,ずっと誤差が増えたら終わり」としたいですね.
コードの中身をみていきます.TensorFlowでは自分で実装しなければならないので,クラスを作っていきます.
class EarlyStopping():
def __init__(self, patience=0, verbose=0)
self._step= 0
self._loss=float('inf')
self._patience=patience
self.verbose=verbose
def validate(self,loss):
if self._loss < loss:
self._step += 1
if self._step > self.patience:
if self.verobse:
print('early stopping')
return True
else:
self.step = 0
self.loss = loss
return False
始めの__init__はEarly Stoppingの初期値をきめてるところ.float('inf')は∞を表してます.patienceはどこまで過去のエポックまで見る?てやつです.verboseはif文にスイッチ入れるやつですね.verbose=1だとif True :と一緒になるのでprint('early stopping')にスイッチはいるイメージです.
前のlossよりstepに+1してそのステップがpatienceを超えたら止まるようになってます.もし一回でも一番低いlossを下回るとelseに回されstepは0になりますね.
これを学習前に
early_stopping = EarlyStopping(patience=10, verbose=1)
でインスタンスを作って
for epoch in range(epochs):
for i range(n_batches):
sess.run(train_step, feed_dict={...})
val_loss = loss.eval(session=sess. feed...)
if early_stopping.validate(val_loss):
break
これでdef validationのTrueまでたどり着けたらbreakしますね.early stoppingが実装されました.
今勉強している本ではこの章で,他に学習率の設定とかBatchNormalizationとかを学びました!なかなか難しいですね.とくに学習率の設定は色々な手法があって...
とにかく,これでdeeplearningの超ド基礎は終わりとします(笑)
次はリカレントニューラルネットワークなんですが,これが難しい...理論は理解できても実装で知らないコードがいっぱい出てくるのでなかなか進まへん.頑張ります.今日はこれでおわり.
この記事が気に入ったらサポートをしてみませんか?