머신 러닝 조기 종료

PythonBeginner
지금 연습하기

소개

이 프로젝트에서는 머신 러닝 모델에서 조기 종료 (early stopping) 기법을 구현하는 방법을 배우게 됩니다. 조기 종료는 과적합 (overfitting) 을 방지하고 모델의 성능을 향상시키는 강력한 방법입니다.

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다:

  • 조기 종료의 개념과 주요 단계를 이해합니다.
  • 최적의 종료 에포크 (epoch) 를 결정하기 위해 조기 종료 함수를 구현합니다.
  • 샘플 데이터 세트에서 조기 종료 함수를 테스트합니다.

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다:

  • 데이터 세트를 훈련 및 검증 세트로 분할합니다.
  • 훈련 중 검증 세트에서 모델의 성능을 모니터링합니다.
  • 검증 세트 손실 (validation set loss) 을 기반으로 종료 기준을 정의합니다.
  • 조기 종료 함수를 사용하여 모델의 훈련 프로세스를 최적화합니다.

조기 종료 개념 이해 및 함수 구현

이 단계에서는 먼저 조기 종료의 개념과 주요 단계를 배우게 됩니다.

조기 종료의 기본 아이디어는 훈련 중에 검증 세트에서 모델의 성능을 계산하는 것입니다. 검증 세트에서 모델의 성능이 감소하기 시작하면 과적합을 방지하기 위해 훈련을 중단합니다. 주요 단계는 다음과 같습니다.

  1. 원래 훈련 데이터 세트를 훈련 세트와 검증 세트로 분할합니다.
  2. 훈련 세트에서만 모델을 훈련하고 각 에포크 (epoch) 가 끝날 때 검증 세트에서 모델의 오류를 계산합니다.
  3. 검증 세트에서 모델의 오류를 훈련 기록과 비교합니다. 비교가 **종료 기준 (stopping criterion)**을 충족하면 훈련을 중단합니다.
  4. 마지막 반복의 매개변수를 모델의 최종 매개변수로 사용합니다.

다양한 종료 기준이 있으며 매우 유연할 수 있습니다. 일반적으로 사용되는 기준 중 하나는 검증 세트의 손실 값 (loss value) 을 모니터링하는 것입니다. 손실 값이 n 개의 연속적인 에포크 동안 더 이상 최적화되지 않은 경우 (항상 최소 손실보다 큼), 훈련이 중단됩니다.

이제 early_stop.py 파일에서 early_stop 함수를 구현합니다.

이 함수는 에포크별로 손실 값을 확인합니다. 손실이 patience와 같은 에포크 수만큼 개선되지 않으면 (감소하지 않으면) 훈련을 중단하는 것이 좋습니다.

다음은 early_stop 함수의 코드입니다:

def early_stop(loss: List[float], patience: int) -> Tuple[int, float]:
    """
    제공된 손실 값과 patience 를 기반으로 훈련을 중단해야 하는 에포크를 결정합니다.

    이 함수는 에포크별로 손실 값을 확인합니다. 손실이 `patience` 와 같은 에포크 수만큼 개선되지 않으면 (감소하지 않으면)
    훈련을 중단하는 것이 좋습니다.

    매개변수:
    - loss (List[float]): 훈련 중에 기록된 순서대로 손실 값 목록입니다.
    - patience (int): 손실이 개선되지 않은 에포크 수로, 그 이후에 훈련을 중단해야 합니다.

    반환 값:
    - Tuple[int, float]: 두 개의 값을 포함하는 튜플:
        1. 훈련을 중단해야 하는 에포크 번호 (1 부터 시작).
        2. 해당 시점까지 기록된 최소 손실 값.
    """

    min_loss = np.Inf
    max_patience = 0
    stop_epoch = 0
    for epoch, current_loss in enumerate(loss):
        if current_loss < min_loss:
            min_loss = current_loss
            stop_epoch = epoch
            max_patience = 0
        else:
            max_patience += 1
        if max_patience == patience:
            break
    stop_epoch += 1
    return stop_epoch, min_loss

early_stop 함수에서 제공된 손실 값과 patience 매개변수를 기반으로 훈련을 중단해야 하는 에포크를 결정하는 로직을 구현합니다.

이 함수는 두 개의 값을 포함하는 튜플을 반환해야 합니다:

  1. 훈련을 중단해야 하는 에포크 번호 (1 부터 시작).
  2. 해당 시점까지 기록된 최소 손실 값.

조기 종료 함수 테스트

이 단계에서는 early_stop.py 파일을 실행하여 early_stop 함수를 테스트합니다.

early_stop.py 파일에 다음 코드를 추가합니다:

if __name__ == "__main__":
    loss = [
        1.11,
        1.01,
        0.99,
        0.89,
        0.77,
        0.69,
        0.57,
        0.44,
        0.51,
        0.43,
        0.55,
        0.61,
        0.77,
        0.89,
        0.78,
    ]
    patience = 3
    stop_epoch, min_loss = early_stop(loss, patience)
    print(f"{stop_epoch=}, {min_loss=}")

그런 다음 터미널에서 스크립트를 실행합니다:

python early_stop.py

출력 결과는 다음과 같아야 합니다:

stop_epoch = 10, loss = 0.43

이는 훈련이 10 번째 에포크에서 중단되어야 하며, 해당 시점까지 기록된 최소 손실 값은 0.43 임을 의미합니다.

축하합니다! 조기 종료 함수를 성공적으로 구현했습니다. 이제 이 함수를 머신 러닝 프로젝트에서 사용하여 과적합을 방지하고 모델의 성능을 향상시킬 수 있습니다.

요약

축하합니다! 이 프로젝트를 완료했습니다. LabEx 에서 더 많은 랩을 연습하여 기술을 향상시킬 수 있습니다.

✨ 솔루션 확인 및 연습✨ 솔루션 확인 및 연습