Early Stopping
Early Stopping 이란
딥러닝을 포함하는 머신러닝 모델들의 딜레마는 너무 많은 epoch은 overfiting을 일으키고, 너무 작은 epoch은 underfiting을 일으킨다는 것이다.
이렇때 많이 사용하는 방식이 early stopping이다.
Early Stopping은 epoch를 많이 돌린 후, 특정 시점에서 멈추게 하는 것이다.
특정 시점을 언제로 정할 것인지가 early stopping의 핵심이다.
일반적으로 hand-out validation set에서의 성능이 더이상 증가하지 않을 때 학습을 중지하게 된다.
Early Stopping in Keras
1
|
from keras.callbacks import EarlyStopping
|
cs |
여기서 콜백이란 학습 과정의 특정 단계에서 적용할 함수의 세트로 학습 과정 중 콜백을 사용해서 모델의 내적 상태와 통계자료를 확인 할 수 있다. 콜백의 리스트는 (키워드 인수 callbacks로) Sequential이나 Model 클래스의 .fit() 메서드에 전달이 가능하다. 그에 따라 학습의 각 단계에서 콜백의 적절한 메서드가 호출된다.
콜백의 종류는 다음에 다룰예정이다.
Early stopping의 구성요소
Performance measure : 어떤 성능을 monitoring할 것인지 결정
Trigger : 언제 training을 멈출 것인지 결정
Early stopping 객체는 초기화될 때 두개의 요소를 정의하게 된다.
1
|
es = EarlyStopping(monitor = 'val_loss')
|
cs |
다음과 같이 지정하면 validation set의 loss를 monitoring한다는 뜻이다.
1
|
es = EarlyStopping(monitor='val_loss', mode='min')
|
cs |
만약 performance measure가 최소화 시켜야하는 것이면 mode를 min 으로, 최대화 시켜야하는 것이면 mode를 max로 지정한다. loss 의 경우, 최소화 시키는 방향으로 training 이 진행되므로 min 을 지정한다.
1
|
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=50)
|
cs |
mode 의 default 는 auto 인데, 이는 keras 에서 알아서 min, max 를 선택하게 된다. 여기까지가 가장 기본적인 Early stopping 의 사용법이다. performance measure를 정의하고, 이것을 최대화 할지, 최소화 할지를 지정하는 것이다. 그러면 keras 에서 알아서 적절한 epoch 에서 training 을 멈춘다. verbose=1 로 지정하면, 언제 keras 에서 training 을 멈추었는지를 화면에 출력할 수 있다.
성능이 증가하지 않는다고, 그 순간 바로 멈추는 것은 효과적이지않을 수 있다. patience 는 성능이 증가하지 않는 epoch 을 몇 번이나 허용할 것인가를 정의한다. partience 는 다소 주관적인 기준이다. 사용한 데이터와 모델의 설계에 따라 최적의 값이 바뀔 수 있다.
1
|
es = EarlyStopping(monitor='val_loss', mode='min', baseline=0.4)
|
cs |
만약 performance measure 를 practical 하게 설정한 경우 성능의 증가의 기준을 직접 정의할 수 있다. 예를 들어 아래 코드는 validation accuracy 가 1% 증가하지 않는 경우, 성능의 증가가 없다고 정의한다.
특정값에 도달했을 때, 더 이상 training 이 필요하지 않은 경우가 있다. 이 경우 baseline 파라미터를 통해 정의할 수 있다.
1
2
3
4
5
|
history = model.fit(X_train, y_train, epoch=10,
batch_size=10, verbose=2, validation_split=0.2,
callbacks=[early_stopping])
|
cs |
최종적으로 mode.fit 함수의 callback 으로 early stopping 객체를 넣어주면 early stopping 을 적용할 수 있다.
Model choice
Early stopping 객체에 의해 트레이닝이 중지되었을 때, 그 상태는 이전 모델에 비해 일반적으로 validation error 가 높은 상태일 것이다. 따라서, Earlystopping 을 하는 것은 특정 시점에 모델의 트레이닝을 멈춤으로써, 모델의 validation error 가 더 이상 낮아지지 않도록 조절할 수는 있겠지만, 중지된 상태가 최고의 모델은 아닐 것이다. 따라서 가장 validation performance 가 좋은 모델을 저장하는 것이 필요한데, keras 에서는 이를 위해 ModelCheckpoint 라고 하는 객체를 존재한다. 이 객체는 validation error 를 모니터링하면서, 이전 epoch 에 비해 validation performance 가 좋은 경우, 무조건 이 때의 parameter 들을 저장한다. 이를 통해 트레이닝이 중지되었을 때, 가장 validation performance 가 높았던 모델을 반환할 수 있다.
1
2
3
4
5
6
7
8
9
|
from keras.callbacks import ModelCheckpoint
mc = ModelCheckpoint('best_model.h5', monitor='val_loss', mode='min', save_best_only=True)
history = model.fit(X_train, y_train, epoch=10,
batch_size=10, verbose=2, validation_split=0.2,
callbacks=[early_stopping, mc])
|
cs |
위 ModelCheckpoint instance를 callbacks 파라미터에 넣어줌으로써, 가장 validation performance 가 좋았던 모델을 저장할 수 있게된다.
출처: https://3months.tistory.com/424 [Deep Play]