[사진=게티이미지뱅크]
[사진=게티이미지뱅크]

“딥러닝 모델을 콜백(callback) 없이 개발하는 것은 브레이크 없는 차를 운전하는 것과 같다.”

만약 딥러닝(DL) 모델을 개발하고 있다고 해보자. 만약 머리 속에 시간이 많이 소요되는 훈련 중에 프로세스를 조정할 방법에 대해 아무 생각이 없다면 그 프로젝트는 바람직하지 않은 방향으로 끝날 가능성이 높다. 

이번 기고에서는 ‘Keras Callback’를 통하여 ModelCheckpoint, EarlyStopping 등의 함수들을 사용하여 어떻게 모델을 모니터하고 개선하는지 알아보도록 한다.

콜백(Callback) 이란?
‘Callback’은 훈련 절차의 주어진 단계에서 적용되는 일련의 함수들을 말한다. Callback을 통하여 훈련 중인 모델의 내부 상태나 통계를 볼 수 있다. 

예를 들어, 1000번의 epoch가 있는 훈련을 매번 끝날 때까지 시간을 소요하며 돌려보고 그 정확도나 손실을 확인한다면 무척 시간이 아까울것이다. 만약 정확도나 손실이 어떤 단계에 다다르면 훈련을 중단하게 한다면 어떨까? 훈련이 성공적으로 끝난 모델을 저장하는 방법은 없을까? 

혹은 learning rate를 물론 decay를 설정하고 epoch마다 조정하는 방법도 있지만 시간에 따라 조절되게 할 순 없을까? 

이러한 예와 같이 매 단계의 훈련/epoch 과정에 훈련 프로세스를 조정할 수 있게 도와주도록 어떤 자동화된 작업을 정의하고 사용하는 것을 callback이 맡아서 해준다.

과적합(overfitting)을 방지하는 EarlyStopping
과적합(overfitting)이란 딥러닝 모델이 학습데이터에만 너무 잘 맞아서 일반적인 다른 데이터에 대해서는 제대로 예측하지 못하는 현상을 말한다.

너무 많은 epoch는 과적합을 유발하고 너무 적은 epoch는 과소적합(underfitting)을 일으킨다. 한가지 과적합을 방지하는 방법은 훈련 프로세스를 종료 전에 일찍 끝내는 것이다. Keras 의 Callbacks API 인 EarlyStopping 은 다양한 지표와 인자를 통하여 언제 훈련 프로세스가 끝나야 하는지를 정할 수 있도록 한다. 

우선 Keras 의 EarlyStopping 을 위해 아래와 같은 선언이 필요하다.

그 다음, 아래와 같은 인자를 정의해 준다.

위의 정의는 Validated Loss를 측정하겠다는 것, min_delta=0은 val_loss 변화 값의 최소가 0일 때 훈련이 중지하는 것, patience=3은 성능이 증가하지 않는 상태에서 epoch를 3번 허용한다는 뜻, restore_best_weights=True는 훈련이 중지했을 때 최고 성능의 weights를 보관하라는 뜻이다. verbose=1로 하면 언제 Keras에서 훈련의 중지 여부를 화면에 출력한다. 

최종적으로, model.fit 함수의 callback으로 earlystopping 객체를 넣어주면 early stopping을 적용할 수 있다.

모델을 저장해주는 ModelCheckpoint
과적합을 방지하기위해 EarlyStopping을 사용하여 훈련을 중지했을 때, 모델의 validation error가 더 이상 낮아지지 않도록 조절할 수 있었지만, 중지된 상태가 최고의 모델은 아닐 수 있다. 

따라서 가장 validation 성능이 좋은 모델을 저장하는 것이 필요한데, keras에서는 이를 위해 ‘ModelCheckpoint’라는 객체를 제공한다.

이 객체는 validation_error를 모니터하면서 이전 epoch에 비해 validation 성능이 좋으면 무조건 이때의 parameter들을 저장한다. 이를 통해 훈련이 중지되었을 때, 가장 validation 성능이 높았던 모델을 저장할 수 있다.

이 ModelCheckpoint 인스턴스와 앞의 EarlyStopping 인스턴스를 Callbacks 파라미터에 넣어 줌으로써 가장 validation 성능이 좋았던 모델을 저장하게 된다.

Callbacks라는 키워드 인자를 사용하여 여러 개의 callbacks을 모델의 .fit() 메소드에 전달할 수도 있다.

즉, EarlyStopping, ModelCheckpoint, TensorBoard callbacks를 my_callbacks으로 정의하고 이를 model.fit 메소드에 callbacks=my_callbacks 인자로 넘겨줌으로써 3개 callbacks 함수를 한 번에 사용할 수 있다.

텐서보드(TensorBoard)는 모델을 이해하고 디버깅 및 최적화를 돕기 위한 시각화 툴로 아래와 같은 화면을 제공함으로써 epoch가 진행되면 서의 정확도와 손실을 손쉽게 파악하게 도와준다.

위의 사례와 같이, Keras의 callbacks을 통해서 과적합을 방지하기 위한 EarlyStopping 함수를 사용하면 validation loss의 성능이 더 이상 증가하지 않는 시점에서 몇 번의 epoch 수를 기다리게 할 것인가를 정해 과적합이 일어나기 전의 최고 성능의 weight를 저장하게 된다.

허나 EarlyStopping을 사용하여 훈련을 중지할 수 있지만 이것이 최고의 모델은 아닐 수도 있다. 이때 ModelCheckPoint 함수를 사용하여 validation error를 모니터하면서 이전 epoch에 비하면 성능이 좋으면 무조건 parameter를 저장하는 기능을 사용할 수 있다. 

Keras 기능들을 사용하여 훈련과정을 모니터하고, 최고의 모델의 상태를 저장하며, 훈련의 디버깅 및 최적화를 위한 시각화 툴을 제공하는 callback을 적극 활용해보자.

 

글 : 주철휘 / 인공지능연구소 소장(CAO) / 엔쓰리엔클라우드

관련기사

저작권자 © ITBizNews 무단전재 및 재배포 금지