見出し画像

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の超ド基礎は終わりとします(笑)

次はリカレントニューラルネットワークなんですが,これが難しい...理論は理解できても実装で知らないコードがいっぱい出てくるのでなかなか進まへん.頑張ります.今日はこれでおわり.


この記事が気に入ったらサポートをしてみませんか?