들어가며
딥러닝 모델을 학습시키다 보면, 이런 상황을 한 번쯤 겪게 됩니다.
" 손실 (Loss)은 줄지 않고 Accuracy는 비슷하네 .. learning rate를 낮춰야 하나? gradient가 터졌나? "
처음에는 그냥 epoch을 늘리면 되겠지하며 돌렸지만
학습이 오히려 불안정해지고 손실이 발산하는 경험을 했습니다.
이 문제를 해결하려면, 단순히 하이퍼파라미터를 감으로 조정하는 게 아니라
모델 학습의 핵심 지표인 loss, grad_norm, learning_rate, epoch의 관계를 정확히 이해해야 했습니다.
Loss - 모델이 얼마나 틀렸는가의 지표
Loss (손실함수)는 모델의 예측값과 실제값의 차이를 수치화한 값입니다.
즉, 모델이 얼마나 틀렸는가를 나타냅니다.
| MSE (Mean Squared Error) | 회귀 문제 | 예측값이 실제값과 얼마나 멀리 떨어졌는지 |
| Cross Entropy Loss | 분류 문제 | 예측 확률이 정답에 얼마나 가깝게 분포했는지 |
Loss 가 작을 수록 모델의 예측이 정답에 가깝다는 뜻입니다.
Loss 값이 감소하다가 어느 시점에서 더 이상 줄지 않거나, 갑자기 발산한다면 learning rate 나 gradient clipping을 점검해야 합니다.
이유는 learning rate가 너무 크면 모델이 손실의 최솟값을 지나쳐서 오히려 더 큰 손실로 튕겨 나가고, gradient가 너무 커지면 한 번의 업데이트에서 가중치가 과도하게 변하면서 손실이 안정적으로 줄지 못하고 발산하게 되기 때문입니다.
반대로 learning rate가 너무 작으면 손실이 미세하게 줄다가 local minima에 갇혀 수렴이 멈출 수도 있습니다
grad_norm - Gradient의 크기 (학습 안정성의 신호)
모델이 학습되는 과정에서 가중치(weight)를 업데이트하기 위해 역전파로 계산되는 값이 gradient 입니다.
grand_norm은 모든 gradient 벡터의 크기를 하나로 합친 값입니다.
즉, 가중치가 얼마나 크게 흔들리며 업데이트되는가를 나타냅니다.
grad_norm 이 너무 크면 :
-> gradient 폭주
-> 학습 불안정, loss 발산
grad_norm 이 너무 작으면 :
-> gradient 소실
-> 학습 정체, Loss 감소 멈춤
learning_rate - 한 번에 얼마나 배우느냐
learning rate (학습률) 은 모델이 한 번의 업데이트에서 얼마나 크게 이동할지를 결정하는 하이퍼파라미터 입니다.
즉, 얼마나 과감하게 배울 것인가를 조절하는 값입니다.
| Learning Rate | 특징 | 결과 |
| 너무 큼 | Loss 발산, 학습 불안정 | 학습 실패 |
| 너무 작음 | 학습 속도 느림, local minima에 갇힘 | 비효율적 |
+ Scheduler를 함께 사용해 epoch 마다 learning rate를 조정합니다.
epoch - 전체 데이터셋을 몇 번 반복 학습할 것인가
모델이 전체 학습 데이터를 한 번 모두 학습하는 횟수입니다.
예를 들어,
- 데이터셋 크기 : 10,000 개
- batch size : 100
- epoch = 1 -> 100 step 학습
이면
epoch이 10이면 전체 데이터를 10번 반복 학습한다는 뜻입니다.
loss가 plateau ( 더 이상 줄지 않는) 구간에서 멈추면 EarlyStopping을 사용해 불필요한 epoch 낭비를 줄입니다.
너무 많은 epoch은 overfitting (과적합) 위험이 있습니다.
batch_size - 한 번에 몇 개의 데이터를 학습에 사용하느냐
batch size는 한 번의 forward / backward 과정에서 사용하는 데이터의 개수입니다.
즉, 모델이 한 번의 업데이트에서 얼마나 많은 데이터를 보고 학습하느냐를 결정합니다.
| batch size | 장점 | 단점 |
| 작음 (예: 16~64) | 빠른 피드백, 메모리 절약, 일반화 성능 향상 가능 | gradient 노이즈 커짐, 수렴 불안정 |
| 큼 (예: 256~1024) | gradient 안정적, 학습 속도 향상 (GPU 효율↑) | 메모리 부담, local minima에 갇히기 쉬움 |
batch size가 너무 작으면 gradient 의 분산이 커져 loss의 진동 폭이 커지고
너무 크면 학습이 평균적인 방향으로만 이동해 세밀한 패턴 학습이 어려워집니다.
또한 batch size는 learning rate와 직결됩니다
큰 batch에는 더 큰 learning rate가 적합합니다.
+ GPU 리소스에 따라 batch size를 조정하고, gradient accumulation 으로 메모리 제약을 우회하기도 합니다.
| 요소 | 역할 | 잘못 설정했을 때 문제 | 점검 포인트 |
| Loss | 학습 목표 지표 | 발산, 정체 | lr / grad clipping |
| grad_norm | 학습 안정성 지표 | 폭주, 소실 | clipping / 초기화 |
| learning_rate | 학습 속도 | 발산 / 느린 수렴 | scheduler, warmup |
| epoch | 학습 반복 횟수 | 과적합 / 미학습 | early stopping |
| batch_size | 데이터 묶음 크기 | 불안정 / 과한 자원 사용 | lr 연동, 메모리 최적화 |
모델이 학습되지 않을 때, 예전에는 "epoch을 더 돌리면 되겠지" 라고 생각했습니다.
하지만 실제로는 batch size, learning rate, gradient의 균형이 더 중요했습니다.
이 경험을 통해 배운 점
딥러닝 학습은 단순히 반복이 아니라, 안정적인 최적화를 설계하는 일이라는 것
'AI Development' 카테고리의 다른 글
| LoRA 보다 풀 파인튜닝 할 때 CER 성능이 더 좋아진 이유 (0) | 2025.01.12 |
|---|---|
| RunPod (0) | 2025.01.03 |
| 하이퍼파라미터 튜닝 후 모델 성능 저하 원인 (0) | 2024.09.03 |