본문 바로가기
[파이썬]/딥러닝

[딥러닝] 콜백함수를 활용한 딥러닝 모델 성능 최적화

by sung min_Kim 2024. 1. 7.


 이번 글에서는 "콜백함수의 개념부터 사용 방법"에 대한 내용들을 살펴보려 한다.
차례와 사용 툴 및 라이브러리는 아래와 같다.

 [차례]
 첫 번째, 콜백함수(Callback Function)란?
 두 번째, 콜백 함수를 사용하는 이유
 세 번째, 콜백 함수의 종류
 네 번째, 콜백 함수 사용 방법
 
 [사용 툴]

- Jupyter notebook(웹 기반 대화형 코딩 환경)
 
 [사용 라이브러리 및 모듈]

  • 딥러닝 라이브러리 및 모델: TensorFlow
    - tensorflow.keras: 사용자 친화적 인터페이스를 제공하는 TensorFlow의 고수준 API

 


콜백함수(Callback Function)란?



 콜백 함수라는 단어는 '되돌려주다' 혹은 '전달하다'라는 의미의 '콜백(Call back)'에서 유래되었다. 이는 특정 함수가 작업을 완료한 후, 그 결과를 다른 함수에게 전달하는 것을 의미한다.

 쉽게 말해, 콜백 함수는 '나중에 호출될 함수'라고 생각하면 된다. 당장 실행되지 않고, 특정 조건이나 시점에 도달했을 때 호출되는 함수이다.

 예를 들어, '알람' 기능을 생각해 보자. 알람을 오전 7시로 맞추면, 오전 7시가 되었을 때 알람이 울릴 것이다. 여기서 '오전 7시가 되었을 때'가 특정 이벤트(사건)에 해당하며, '알람이 울리는 것'이 콜백 함수에 해당한다. 즉, 우리가 사전에 지정한 시간에 도달했을 때 알람을 울리도록 설정한 것과 같이, 콜백 함수는 사전에 지정한 특정 이벤트가 발생했을 때 특정 동작을 수행하도록 프로그래밍하는 것이다.

 딥러닝에서도 이와 비슷하다. 예를 들어, 모델 학습 중에 학습 정확도가 특정 수치 이상으로 올라갔을 때, 학습률을 조정하도록 설정할 수 있다. 이때 '학습 정확도가 특정 수치 이상으로 올라가는 것'이 특정 이벤트에 해당하며, '학습률을 조정하는 것'이 콜백 함수에 해당하는 것이다.

 따라서, 콜백 함수는 특정 사건이 발생했을 때 원하는 동작을 수행하도록 하는 매우 유용한 도구이다. 이를 통해 딥러닝의 학습 과정을 보다 효과적으로 관리하고 최적화할 수 있다. 
 


콜백 함수를 사용하는 이유



 딥러닝에서 콜백 함수를 사용하는 이유는 학습 과정을 보다 효율적이고 유연하게 관리하기 위함이다. 콜백 함수를 활용하면, 특정 학습 단계에서 모델의 상태를 체크하고, 학습률을 동적으로 조정하는 것이 가능해진다. 

 또한, 학습 과정에서 모델의 성능이 더 이상 개선되지 않을 때 학습을 조기에 종료하도록 설정함으로써, 과적합을 방지하고, 불필요한 학습 시간을 단축시킬 수 있다.

 최적의 모델을 찾아 저장하는 것도 가능하다. 학습 과정 중 가장 우수한 성능을 보인 모델의 가충치를 자동으로 저장하여, 학습이 끝난 이후에도 최적의 성능을 보인 모델을 계속 활용할 수 있게 된다.

 마지막으로, 콜백 함수를 통해 학습 과정을 지속적으로 모니터링하고, 학습 중 발생하는 정보를 기록하거나 시각화함으로써, 학습 과정을 보다 명확하게 이해하고 필요한 조치를 적시에 취하는 것이 가능해진다. 

 즉, 콜백 함수는 딥러닝 모델의 학습 과정을 효과적으로 관리하고 최적화하는 데 필수적인 도구이다. 이를 활용하면 모델의 성능을 최적화하는 데 큰 도움을 받을 수 있다.

 


콜백 함수의 종류



 케라스(Keras)는 다양한 콜백 함수를 제공하여 모델 학습 과정의 효율성을 높인다. 대표적인 콜백 함수로는 ' ModelCheckpoint', 'EarlyStopping', 그리고 'ReduceLROnPlateau' 등이 있다.


 ModelCheckpoint딥러닝 모델 학습 과정에서 가장 우수한 성능을 보인 시점의 모델 상태를 저장한다. 마치 '가장 잘 익은 빵'을 찾아 그 상태를 보존하는 것과 같다. 이를 통해, 학습이 끝난 후에도 가장 좋은 성능을 보였던 모델을 계속해서 활용할 수 있게 된다.

 EarlyStopping학습 과정에서 모델의 성능 개선이 멈추면 학습을 조기에 종료한다. 마치 '빵이 너무 많이 익어 타는 것을 방지'하는 것과 같다. 이처럼 해당 콜백 함수는 너무 오래 학습하여 모델이 훈련 데이터에 과도하게 최적화되는 과적합(overfitting) 현상을 방지하는 역할을 한다. 이를 통해, 불필요한 학습 시간을 단축하고, 모델의 일반화 능력을 유지할 수 있게 된다.

 ReduceLROnPlateau학습률(learning_rate)을 동적으로 조절한다. 학습이 진행됨에 따라 성능 개선이 더 이상 일어나지 않을 때, 즉 '학습이 정체된 상황'에 이르면 학습률을 자동으로 줄여주는 역할을 한다. 이는 마치 '빵이 잘 구워지지 않으면 온도를 조절하는 것'과 비슷하다. 이 콜백 함수는 모델의 학습 속도를 적절히 조절함으로써, 학습 과정에서 더 나은 성능을 달성할 수 있게 돕는다.

 


콜백 함수 사용 방법



 콜백 함수의 사용 방법은 매우 간단하다. 먼저, 훈련 단계 시작 전에 사용하고자 하는 콜백 함수 정의한다. 그리고 이를 모델 훈련 시 사용하는 'fit' 함수를 호출할 때 인자로 전달하면 된다.

 본 글에서는 'ModelCheckpoint'와 'EarlyStopping' 두 가지 콜백 함수를 중점으로 살펴볼 것이다.

1. 콜백 함수 정의 및 적용
 1.1 ModelCheckpoint


 'ModelCheckpoint' 백 함수는 학습 중간에 모델의 가중치를 저장한다. 이 함수는 모델을 저장할 경로와 'save_best_only' 옵션을 설정하게 된다.

 'save_best_only =True'로 설정하면, 각 반복 횟수(epoch)마다 검증 성능을 확인하고, 이전보다 성능이 향상된 경우에만 모델을 저장한다. 만약 'save_best_only=False'로 설정하면, 모든 반복 횟수마다 모델을 저장하게 된다.

 이렇게 설정하면, 학습이 종료된 후에는 가장 검증 성능이 좋았던 시점의 모델이 저장되어 있게 된다. 이는 과적합을 방지하고, 모델의 일반화 성능을 높이는 데 큰 도움이 된다. 

checkpoint_cb = keras.callbacks.ModelCheckpoint(
    "./model/best_model.h5",
    save_best_only = True
)

checkpoint_cb

ModelCheckpoint 콜백 함수 생성

 

1.2 EarlyStopping

 
 EarlyStopping 콜백 함수는 특정 조건을 만족할 때 학습을 조기에 종료한다.

 이 함수의 주요 매개변수 중 하나인 'patience'는 성능 향상이 더 이상 없다고 판단되는 에포크(epoch)의 횟수를 설정하는 매개변수이다. 예를 들어, 'patience=2'로 설정하면, 최고 성능을 달성한 후 2번의 에포크 동안 추가적인 성능 향상이 없으면 학습이 조기 종료된다.

 또한 'restore_best_weights' 매개변수를 'True'로 설정하면, 가장 낮은 검증 손실을 보여준 에포크의 모델 가중치로 모델을 복원한다. 이는 조기 종료가 발생하더라도 최적의 성능을 보여준 시점의 모델 상태를 유지하는 데 도움이 된다.

 즉, 아래의 코드는 최적의 성능을 달성한 후 2번의 에포크 동안 성능 향상이 없을 경우 학습을 조기에 중단하되, 최적의 성능을 보여준 시점의 모델 가중치를 유지하는 설정을 적용하고 있다. 이를 통해, 과적합을 방지하고 학습 시간을 단축하는 효과를 얻을 수 있다.

early_stopping_cb = keras.callbacks.EarlyStopping(
    patience=2,
    restore_best_weights=True
)

EarlyStopping 콜백 함수 생성

 

2. 모델 구축 및 훈련


 이후, 모델을 설정하고 'fit' 함수를 통해 모델을 훈련시킬 때 'calssbacks' 매개변수를 사용하여 앞서 정의된 콜백 함수를 전달한다. 이렇게 하면, 모델이 훈련되는 동안 콜백 함수가 지정된 조건에 따라 원하는 작업(ex. 최적의 검증 성능을 가진 모델 저장)을 중간중간 수행하게 된다. 일반적으로 ModelCheckpoint, EarlyStopping 이 두 콜백 함수는 같이 사용된다.

### 모델 생성
model = model_fn(keras.layers.Dropout(0.3))

### 모델 설정
model.compile(optimizer="adam", 
              loss="sparse_categorical_crossentropy",
              metrics="accuracy")

### 모델 훈련
history = model.fit(
    train_scaled, train_target, epochs=50, verbose=1,
    validation_data=(val_scaled, val_target),
    callbacks=[checkpoint_cb, early_stopping_cb])

에포크 8 시점에서의 훈련 조기 종료


 에포크(epoch)가 8인 시점에서 훈련이 조기 종료되었다. 이는 실제로 최적의 검증 성능을 달성한 모델이 에포크 6인 시점에 이미 구축되었으며, 이후 2번의 에포크 동안 성능 향상이 없어서 조기 종료된 것을 의미한다. 이렇게 저장된 최적의 모델은 필요할 때 언제든지 로드하여 사용할 수 있다.

최적의 검증 성능을 가진 모델 저장

 

3. 모델 로드 및 예측 수행


 load_model 함수를 사용하여 최적의 검증 성능을 가진 모델을 로드하였다. 이 로드된 모델을 평가하기 위해 evaluate 함수를 사용하며, 이때 훈련 데이터셋과 검증 데이터셋을 함수의 인자로 전달하여 모델이 학습한 패턴을 기반으로 평가를 진행한다. 

model_f = keras.models.load_model("./model/best_model.h5")
model_f.summary()

print(model_f.evaluate(train_scaled, train_target))
print(model_f.evaluate(val_scaled, val_target))

 

로드한 모델 구조 확인 및 평가진행


 출력 결과를 살펴보면, 훈련 데이터셋을 기반으로 평가한 모델의 손실률은 '0.2648', 정확도는 '0.9019'로 나타났으며, 검증 데이터셋을 기반으로 평가했을 때의 손실률은 '0.3238', 정확도는 '0.8832'로 나타났다.

 두 데이터셋 사이의 손실률 차이는 약 '0.06', 정확도 차이는 약 '0.017'로, 이 결과를 통해 해당 모델은 과적합이나 과소적합이 발생하지 않은 일반화된 성능을 보이는 우수한 모델로 판단된다.