Python/Tensorflow

[Tensorflow] 과적합 방지 조기 종료 설정 : EarlyStopping

jimmy_AI 2022. 2. 18. 21:38
반응형

텐서플로우 콜백 함수 EarlyStopping 사용 방법, 원리

안녕하세요. 이번 시간에는 텐서플로우에서 학습 조기 종료 조건을 설정할 수 있는

callback 함수인 EarlyStopping의 사용 예시와 과적합 방지 원리에 대하여

간단하게 살펴보도록 하겠습니다.

 

 

EarlyStopping 적용 방법

텐서플로우 내에서 EarlyStopping을 모델 학습 과정에 적용시키기 위해서는

우선, 조기 종료 callback 함수의 판정 기준을 아래 코드 처럼 선언해줍시다.

callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=3)

여기서, monitor는 판정 기준의 지표를 결정하는 것이며,

과적합 방지가 목적이라면 'val_loss'를 추천드립니다.

 

patience몇 epoch 연속으로 monitor 지표가 개선되지 않는 경우에 종료할지를 정하며,

위의 경우는 3 epoch 연속으로 val_loss가 개선되지 않으면 학습을 조기 종료함을 의미합니다.

 

위에서 선언한 callback 함수는 모델 학습 fit 과정 내부에서 아래와 같이 지정해주시면 됩니다.

# callbacks 인자에서 리스트 원소로 지정
model.fit(x, y, epochs=100, validation_data = (x_val, y_val), callbacks = [callback])

 

 

EarlyStopping 적용 결과

validation loss를 각 epoch마다 추적하며, 학습이 조기 종료되는 경우의 예시를

살펴보도록 하겠습니다.

 

아래 그림의 예시는 간단한 데이터에서 100 epoch의 학습을 지시하였지만,

10 epoch에서 조기 종료 조건을 만족하여 학습이 끝난 예시입니다.

val_loss가 epoch 7 ~ 10 동안 3회 연속 진전이 없었기에,

patience = 3으로 설정한대로 학습이 조기에 종료되었음을 알 수 있었습니다.

 

 

과적합 방지 원리와 주의사항

많은 오버피팅의 경우에서 train_loss는 여전히 감소하지만,

val_loss는 진전이 없거나 크게 증가하는 패턴이 나타나게 됩니다.

 

따라서, EarlyStopping을 통하여 val_loss가 더이상 진전이 없는 패턴을 추적하게 되면,

과적합이 이루어지기 시작하는 시점을 빠르게 파악하여 효과적인 학습을

주도할 수 있는 원동력이 되기도 합니다.

 

그러나, 실제로 최적 위치를 잘 찾아가고 있는 상황에서도

val_loss가 특정 구간에서 잠깐 정체 현상을 겪는 경우도 있는데,

EarlyStopping은 이러한 일시적인 정체 구간마저 과적합 패턴으로 파악하여

잘 진행되는 학습을 종료해버릴 수도 있게 되어 이 점을 사용 과정에서 염두해두셔야 합니다.