진지한 학습 루프에 꼭 들어가는 6가지
- 설정: 모든 하이퍼파라미터를 담는 dataclass 또는 YAML/TOML. 체크포인트를 저장할 때마다 함께 저장해.
- 시드: 코드 맨 위에서 설정하고 모든 곳에 적용해.
- 혼합 정밀도: autocast + GradScaler를 사용해. BF16이라면 GradScaler는 필요 없어.
- 기울기 클리핑: 역전파가 끝난 뒤, 옵티마이저 단계 전에 적용해.
- 학습률 스케줄: Transformer에는 워밍업 + 코사인 감소, 미세 조정에는 OneCycle, 전통적인 CNN에는 단계별 감소를 사용해.
- 검증 + 최적 체크포인트 저장: 매 에폭 또는 N 단계마다 별도 검증 세트로 평가하고, 검증 지표가 개선되면 저장해.
팁: 이 6가지가 이미 들어 있는 빈 학습 루프 템플릿으로 모든 프로젝트를 시작하면, 프로젝트마다 같은 문제를 디버깅하느라 보내는 한 주를 아낄 수 있어.
기울기 누적 패턴
원하는 배치 크기를 VRAM에 올릴 수 없을 만큼 모델이 크다면, 여러 번 순전파와 역전파를 수행하는 동안 opt.zero_grad()를 건너뛴 뒤 옵티마이저 단계를 실행하고 기울기를 초기화해. 수학적으로는 더 큰 배치 하나를 사용하는 것과 같아. 손실값의 크기를 일정하게 유지하려면 scaler.scale(loss / accum_steps).backward()처럼 조정해.
프레임워크가 도움이 되는 지점
PyTorch Lightning, Hugging Face Trainer, Accelerate는 혼합 정밀도, 분산 학습, 체크포인트 저장, 로깅 같은 반복 코드를 처리해 줘서 모델과 데이터에 집중할 수 있게 해. 대신 코드는 줄어들지만 내부 동작은 덜 보여. 프레임워크를 도입하기 전에 적어도 한 번은 학습 루프를 직접 작성해 봐.
원칙: 첫 학습 루프는 직접 작성해. 10번째쯤에는 아마 프레임워크를 쓰게 될 거야. 그 사이 과정에서 가장 많이 배워.