학습 조기 종료(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.learn의 tf.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 |