sol’s blog

딥러닝 하이퍼파라미터 튜닝 실험안

sol-commits
sol-commitsJun 20, 2025
딥러닝 하이퍼파라미터 튜닝 실험안

    문제정의

    • 시간과 자원이 한정적
      • Google Colab 무료 환경(T4 GPU 1개)를 이용
      • 적은 실험 횟수로도 높은 성능을 달성할 수 있는 효율적 방법이 필요

    Optuna 라이브러리를 활용한 베이지안 최적화(Bayesian optimization) 접근 제안

    • 이전 실험 결과들을 바탕으로 다음 실험에서 시도할 파라미터 조합을 지능적으로 선택하여, Grid search나 Random search 보다 훨씬 적은 시도로도 최적 해에 가깝게 수렴 가능
    참고
    참고
    💡
    베이지안 최적화란?

    이전 실험 결과를 기반으로 다음 실험을 “확률적으로 가장 좋은 결과가 나올 곳”에 집중해서 선택하는 방식

    1. 서로 다른 하이퍼파라미터 조합을 몇 번 시도
    1. 각 시도에서의 성능을 기록
    1. 그걸 바탕으로 “성능 예측 모델” (보통 Gaussian Process) 생성
    1. 그 모델이 예측한 결과를 기준으로 “다음 실험할 후보”를 뽑음

    Optuna

    파이썬 기반의 자동 하이퍼파라미터 최적화 프레임워크
    • TPE(Tree-structured Parzen Estimator)
      • Optuna의 기본 샘플링 알고리즘
      • 이전 trial들의 성능을 토대로 확률 모델을 구축하여 다음 실험에서 시도할 유망한 하이퍼파라미터를 선택
    • 가지치기(Pruner) 기능
      • 진행 중인 trial의 중간 성능을 모니터링하여 성과가 나쁜 경우 조기에 중단함으로써 시간을 절약 가능

    Early Stopping

    과적합을 방지하기 위한 기법으로, 검증 세트 성능이 개선되지 않으면 학습을 조기에 중단
    • Patience를 정해야 함
      Patience: 몇 epoch 동안 성능 향상이 없을 때 멈출지

    보통 10~20 epochs 로 설정하는 경우가 많음

    • 24f 베이스라인에서
      1. 21 epoch 에서 best model updated
      1. 46 epoch 에서 best model updated

      사례가 확인됨. 따라서, 일반적인 모델 학습에서는 20 epoch 정도를 patience로 설정하는 것이 괜찮을 것 같음

    • Optuna 탐색 중에는 10 epoch 정도를 patience로 설정하는 게 좋을 듯
      • Optuna는 절대적인 최고 성능 보다 여러 조합 중 어떤 파라미터가 상대적으로 좋은지 를 빨리 파악하는 게 핵심이기 때문에, 약간 성능이 덜 나오더라도 빠르게 경향을 보는 것이 나음

    LR Scheduler

    • Optuna는 많은 Trial을 짧고 일관되게 수행하는 것이 중요하므로 일정한 시간 안에 결과를 비교할 수 있어야 함 → 튜닝 단계가 아닌 최종 학습 단계에서 적용

    Loss Function

    머신러닝이나 딥러닝 모델이 예측한 값과 실제 값 사이의 차이를 측정하는 함수

    Loss 함수 변경 시 모델 학습의 양상이 크게 달라지므로 다른 파라미터 튜닝과 동시에 하지 말고 따로 실험하는 것이 일반적

    현재 설정실험 옵션목적
    Loss FunctionCrossEntropyLossWeighted CE /
    Focal Loss
    - 소수 클래스 분류 성능 강화
    • loss function 설명
    CrossEntropyLoss모든 클래스를 동등하게 대함
    모든 오류를 균일하게 다루기에 쉬운 예제(대부분 다수 클래스)에 치중하고 어려운 예제(소수 클래스)를 충분히 강조하지 못하는 단점
    Weighted Cross-Entropyyawn, text와 같은 소수 클래스에 더 높은 가중치를 줌.
    데이터 비율의 역수 등에 비례한 가중치를 소수 클래스 오류에 더 크게 부여함 → 소수 클래스의 영향이 커져 모델이 해당 클래스를 더 학습하도록 유도함
    Focal Loss난이도에 따라 손실에 가중치를 주는 기법
    쉬운 분류(높은 확률로 맞힌 샘플)의 손실은 줄이고 어려운 분류(실수하거나 확률 낮은 샘플)의 손실을 상대적으로 높임
    불균형 데이터에서 소수 클래스 샘플(대개 예측이 어려워 실수하기 쉬운)에 집중적으로 학습하도록 만듦

    optuna를 이용한 하이퍼파라미터 튜닝 요약표

    튜닝 항목현재 설정실험 옵션목적 / 근거
    1. OptimizerAdamAdamW /
    SGD + Momentum
    - Adam: 수렴 빠름
    -
    AdamW: 과적합 감소(Adam보다 learning rate를 작게 설정하는 편)
    - SGD: 일반화 좋지만 느림(lr 0.1 ~ 0.01 범위로 크게 설정하는 편)
    2. Learning Rate3e-41e-4 ~ 1e-3
    - 학습 속도 및 안정성 결정
    - 이미 베이스라인이 3e-4로 좋은 성능을 보였으므로, 그 주변 값들을 조정하는 게 합리적
    - 지수적으로 변화하는 학습률에 대해 고르게 탐색하기 위해 구간에서 로그 스케일로 값을 샘플링
    3. Batch Size3216 / 32 / 64- 작은 배치: 일반화↑, 소수 클래스 학습 기회↑
    - 큰 배치: 속도↑, 일반화↓ 가능성
    4. Dropout Rate0.20.1 / 0.2 / 0.3- 과적합 방지
    - 소수 클래스 재현율 향상 여부 확인
    5. LSTM Hidden Size512256 / 512 / 768- 모델 표현력 조정
    6. FC Hidden Size256128 / 256 / 512- 고차원 표현 추상화 조절
    Optuna 코드 예시

    BatchNorm vs LayerNorm

    항목Batch NormalizationLayer Normalization
    정규화 대상batch(여러 샘플)의 평균과 분산한 샘플의 feature 전체
    계산 방식각 feature를 여러 샘플(batch) 기준으로 정규화하나의 샘플 내의 모든 feature를 정규화
    적합한 환경CNN, 큰 배치 사이즈에서 좋음RNN, 작은 배치 사이즈, 순차 데이터에 좋음
    문제점시계열에서 시점마다 분포 달라짐 → 불안정시계열에 적합, 각 time step에서 안정적
    • Attention 구조와의 시너지(🔗 참고)

      Transformer나 LSTM + Attention 구조에서 일반적으로 LayerNorm이 표준적으로 사용됨

      • Attention 이후의 dense layer에서는 activation 분포가 급변할 수 있기 때문에, 이를 정규화해주는 LayerNorm이 안정적인 학습에 기여

    추가 조사

    Optimizer

    최적화 알고리즘은 학습 속도와 수렴 위치(일반화 성능)에 큰 영향을 줌
    • RNN 계열 모델의 경우, 기울기 소실/폭주 문제가 있어 적응형 학습률(adaptive learning rate)을 사용하는 Adam 옵티마이저가 널리 쓰임(🔗 참고)
      • 불안정한 시계열 학습을 효과적으로 다루고 빠르게 수렴시킴. but 때로는 과적합을 빠르게 일으킬 수도 있음
    • SGD는 수렴은 느리지만 더 낮은 일반화 오류에 도달하는 경우가 있어, 속도 vs 일반화 관점에서 실험해볼 가치가 있음
    • AdamW 는 Adam에 weight decay(가중치 감쇠)를 결합하여 과적합을 줄인 버전으로, 복잡한 모델에서의 일반화 성능이 Adam보다 우수하다는 보고가 있음
      • Adam의 빠른 최적화 능력은 유지하면서도 L2 정규화 효과를 제대로 적용해 일반화 성능을 개선(🔗 참고)
      • 복잡한 모델이나 고차원 데이터에 대해 Adam보다 일반화가 잘되고 안정적인 수렴을 보이는 경향

    초기 학습률 및 Learning Rate 스케줄러

    현재 모델이 높은 정확도를 갖지만 소수 클래스에서 성능을 더 끌어올리려면, 학습 후반에 미세한 조정이 필요할 수 있음. 이를 위해 학습률 값을 튜닝하고 훈련 과정 중 학습률을 동적으로 변경하는 스케줄러를 도입하는 전략 필요
    스케줄러 → 학습 후반에 학습률을 낮춰줌으로써 모델이 더 안정적으로 더 나은 최솟점을 찾도록 도움.
    • macro f1을 최대화하려면, 초반에는 비교적 큰 학습률로 전반적인 패턴을 학습하고 후반에는 학습률을 줄여 소수 클래스에 대한 미세한 조정을 하는 방식이 효과적
    • 초기 학습률에 대해 적절한 값을 탐색
      • Adam 계열은 1e-4 ~ 5e-3
      • SGD는 1e-3 ~ 1e-1
    • Learning Rate 스케줄러
      • ReduceLROnPlateau
        • 검증 성능 향상이 일정 에포크 이상 정체되면 학습률을 특정 비율로 떨어뜨리는 방식
      • Cosine Annealing
        • 초기 학습률에서 시작해 점진적으로 0에 가깝게 줄이는 곡선을 그림

    Batch Size 조정

    배치 크기는 한 번의 파라미터 업데이트에 사용되는 샘플 수로, 학습 안정성일반화 에 영향을 줌
    • 작은 배치는 각 업데이트마다 더 많은 노이즈를 포함하므로 regularization(규제) 효과가 있고 일반화 성능을 높이는 경향이 있음
    • 큰 배치는 한 번에 평균적인 그라디언트를 계산해 훈련은 빠를 수 있지만, sharp minima(급격한 최소점)에 수렴하여 일반화 성능이 낮아질 수 있다는 연구 결과가 있음(🔗 참고)
    • 클래스 불균형 상황에서는, 큰 배치일수록 한 배치 내에 다수 클래스 샘플 비중이 높아 모델이 한 번의 업데이트에서 소수 클래스를 학습하기 어려울 수 있음.

      작은 배치는 업데이트를 더 자주 하므로 소수 클래스 샘플을 만날 기회가 더 많아지며, 결과적으로 소수 클래스에 대한 학습을 촉진하여 macro f1 향상에 도움이 될 가능성이 있음

    배치 크기를 2-3가지 수준으로 변화시켜 성능을 비교

    • 권장되는 기본 배치 크기는 32 정도이며, 이것이 널리 합리적인 디폴트로 받아들여짐(🔗 참고)
    • 작은 배치 실험 - 16
      • batch normalization 등을 사용하고 있지 않다면 작은 배치 자체의 문제는 적음
    • 큰 배치 실험 - 64
      • 학습률을 배치 크기에 맞춰 증가(linear scaling rule) 시키면 적절한 비교가 가능해짐. 예를 들어 32에서 0.001로 안정적이었다면, 64에서는 0.002로 늘려 같은 epoch 당 학습량을 비슷하게 맞추는 방식

    Dropout 비율 조정

    학습 시 신경망의 일부 뉴런을 무작위로 비활성화하여 과적합을 방지하는 대표적인 정규화 기법
    0%
    Dropout 없음
    데이터 불균형 상황에서는 다수 클래스에 과적합해 소수 클래스 재현율이 떨어져 macro f1이 악화될수도
    20%성능과 과적합 방지의 균형점으로 알려져있음(🔗 참고)
    50%과적합 방지 효과는 커지지만 모델 표현력도 감소
    0.5는 꽤 높은 편이지만, 만약 현재 모델이 과적합이 심하다면 0.5까지도 고려할 수 있음
    💡
    우리 프로젝트에서의 Dropout 적용 위치

    Input → bi-LSTM → Attention → FC1 → BatchNorm → ReLU → Dropout → FC2 → Output