학습 조기 종료(Early Stopping)

  • 학습 횟수(=epoch 수)가 많을수록 학습 데이터에 관한 오차는 작아지지만 이것이 오버피팅을 초래해서 모델의 일반화 성능이 떨어지게 된다.
  • 실제 epoch = 300으로 설정하고 학습시킨 결과 처음에는 오차가 순조롭게 줄어들다가 어느 시점부터 오차가 커져가는 것(즉, 오버피팅이 되는 것)을 알 수 있다.

그림 14.1  epoch=300을 했을 때 정확도와 오차의 변화

 

  • 이 문제를 해결하기 위해 사용하는 기법이 조기 종료(early stopping)로 '이전 epoch 때와 비교해서 오차가 증가했다면 학습을 중단한다'라는 방법이다.
  • 개념을 설명하자면 각 epoch의 마지막 부분에 조기 종료를 시킬 것인지 판단하는 부분을 추가하는 것으로 유사 코드는 다음과 같다.
for epoch in range(epochs):     loss = model.train()['loss']      if early_stopping(loss):         break

 

  • 조기 종료를 구현할 때, 주의할 사항은 바로 직전의 epoch 오차를 비교하기만 해서는 안된다. 그림 14.1의 그래프가 보여주는 것처럼 오차값은 각 epoch마다 올라가기도 하고 내려가기도 하며, 드롭아웃을 적용한 경우에는 아직 학습이 되지 않은 뉴런이 존재할 가능성이 있기 때문에 오차값이 상하로 움직이게 된다.
  • 따라서 '어떤 일정한 epoch 수를 거듭하면서 계속해서 오차가 증가하면 학습을 중단한다'는 방식으로 구현해야 한다.
  • TensorFlow에서는 tf.contrib.learntf.contrib.learn.monitors.ValidationMonitor()를 사용하면 되지만 다음과 같은 코드를 사용하면 조기 종료 기능을 구현할 수 있다.
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.verbose:                     print(f'Training process is stopped early....')                 return True         else:             self._step = 0             self._loss = loss          return False

 

  • 위 코드에서 patience는 '오차를 보기 위해 과거 몇 epoch까지 거슬러 올라갈 것인가'를 설정하는 값이다.
early_stopping = EarlyStopping(patience=10, verbose=1)

 

  • 학습을 시키기 전에 EarlyStopping의 인스턴스를 위와 같은 방법으로 생성하고 아래와 같이 반복 학습 과정의 마지막에 early_stopping.validate()을 추가하면 조기 학습 기능을 구현할 수 있게 된다.
if __name__ == '__main__':          early_stopping = EarlyStopping(patience=10, verbose=1)      for epoch in range(epochs):         X_, Y_ = shuffle(X_train, Y_train)          for i in range(n_batches):              start = i * batch_size             end = start + batch_size              sess.run(train, feed_dict={x: X_[start: end], y: Y_[start: end], keep_prob: p_keep})          # 검증 데이터를 사용해 정확도 측정         val_loss = loss.eval(session=sess, feed_dict={x: X_val,                                                       y: Y_val,                                                       keep_prob: 1.0})          val_accuracy = accuracy.eval(session=sess, feed_dict={x: X_val,                                                               y: Y_val,                                                               keep_prob: 1.0})          # 검증 데이터에 대한 학습 진행 상황을 저장         history['val_loss'].append(val_loss)         history['val_acc'].append(val_accuracy * 100)          if early_stopping.validate(val_loss):             break

그림 14.1 TensorFlow에서 조기 종료 기능을 사용했을 때 정확도와 오차 변화

 

  • Keras에서는 from keras.callbacks import EarlyStopping을 선언하면 조기 종료 기능을 사용할 수 있다.
    • keras.callbacks는 각 epoch마다 모델을 학습시킨 후에 호출하는 콜백 함수이다
    • 모델을 학습시키기 전에 다음과 같이 선언하고
early_stopping = EarlyStopping(monitor='val_loss', patient=10, verbose=1)

 

  • 아래와 같이 학습 모델 model.fit()callbacks=early_stopping을 사용하면 된다.
hist = model.fit(X_train, Y_train,                  epochs=epochs,                  batch_size=batch_size,                  validation_data=(X_val, Y_val),                  callbacks=[early_stopping])

그림 14.2 Keras에서 조기 종료 기능을 사용했을 때 정확도와 오차 변화

 

출처 : 정석으로 배우는 딥러닝

 

'신경망(Neural Network) 스터디' 카테고리의 다른 글

15. 배치 정규화  (0) 2018.02.01
13. 학습률 설정  (0) 2018.01.29
12. 데이터 정규화 및 매개변수 초기화  (0) 2018.01.23
11. 학습 과정 시각화  (3) 2018.01.19
10. 신경망 모델 구현 방법  (0) 2018.01.19

+ Recent posts