페이지

2020년 11월 30일 월요일

머신러닝 개발 중에 모델을 모니터하고 딥러닝 모델을 개선하는 방법 중 하나 - callback

 

딥러닝 모델을 callback 없이 개발하는 것은 브레이크 없는 차를 운전하는 것과 같다

만약 딥러닝 모델을 개발하고 있다고 해보자. 만약 머리 속에 시간이 많이 소요되는 훈련 중에 프로세스를 조정할 방법에 대해 아무 생각이 없다면 그 프로젝트는 바람직하지 않은 방향으로 끝날 가능성이 높다. 이번 호 에서는 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을 적용할 수 있다






Model을 저장해주는 ModelCheckpoint

과적합을 방지하기위해 EarlyStopping을 사용하여 훈련을 중지했을 때, 모델의 validation error 가 더 이상 낮아지지 않도록 조절할 수 있었지만, 중지된 상태가 최고의 모델은 아닐 수 있다. 따라서 가장 validation 성능이 좋은 모델을 저장하는 것이 필요한데, keras 에서는 이를 위해 ModelCheckpoint 라는 객체를 제공한다. 이 객체는 validation_error 를 모니터하면서 이전 epoch 에 비해 validation 성능이 좋으면 무조건 이때의 parameter 들을 저장한다. 이를 통해 훈련이 중지되었을 때, 가장 validation 성능이 높았던 모델을 저장할 수 있다.







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

 






내장된 fit() loop 를 통한 callback 사용법

Callbacks 라는 키워드 인자를 사용하여 여러 개의 callbacks 을 모델의 .fit() 메소드에 전달할 수 있다, EarlyStopping, ModelCheckpoint 그리고 TensorBoard callbacks 들을 my_callbacks 으로 정의하고 이를 model.fit 메소드에 callbacks=my_callbacks 인자로 넘겨줌으로써 3가지 callbacks 함수를 한꺼번에 사용할 수 있다.


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



텐서플로우 와 텐서플로우 callbacks에 대한 내용은 뉴스레터 2호 에서 다루었다. 보다 자세한 사항은 뉴스레터를 클릭하여 살펴보기 바란다.


결언

이상 살펴본 바와 같이, Keras callbacks 을 통해서 과적합을 방지하기위한 EarlyStopping 함수를 사용하면 validation loss 의 성능이 더 이상 증가하지 않는 시점에서 몇 번의 epoch 수를 기다리게 할 것인가를 정함으로써 과적합이 일어나기 전의 최고 성능의 weight를 저장하게 된다. 하지만 EarlyStopping 을 사용하여 훈련을 중지할 수 있지만, 이때가 최고의 모델을 아닐 수 있다

이때, ModelCheckPoint 함수를 사용하여 validation error를 모니터 하면서 이전 epoch에 비하면 성능이 좋으면 무조건 parameter를 저장하는 기능을 사용할 수 있다. 그리고 tensorboard callback을 통하여 디버깅 및 최적화를 돕기 위한 시각화도구를 제공받는 것을 살펴보았다. 그리고 여러 개의 callbacks 를 모델의 .fit() 메소드를 통하여 전달하여 한꺼번에 사용하는 방법을 살펴보았다.

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