NEFTune

이번 대회 학습 데이터는 약 2,000개로 적은데 모델은 27B였다. 거대 모델이 소규모 데이터를 학습하면 과적합 위험이 크다. 이걸 막으려고 NEFTune을 도입했는데, 임베딩에 노이즈를 더하는 단순한 기법이 왜 과적합을 막는지 정리해봤다.

문제: SFT 단계의 소규모 과적합#

LLM 학습은 거대 데이터로 일반 체급을 올리는 Pretraining, 그리고 소규모 정제 데이터로 task 수행을 가르치는 SFT 단계로 나뉜다. 문제는 SFT 단계의 데이터가 적을 때 모델이 그 데이터를 통째로 암기해버리기 쉽다는 것이다. 2,000개로 27B를 학습하는 이번 상황이 딱 그랬다.

NEFTune의 아이디어#

NEFTune은 Noisy Embedding Instruction Fine Tuning의 줄임말로, 순전파 단계에서 임베딩 벡터에 무작위 노이즈를 더하는 게 전부다. 노이즈가 섞이면 모델이 학습 데이터를 너무 예민하게 그대로 받아들이지 못하게 되고, 결과적으로 정답 패턴을 암기하는 대신 보지 못한 평가 데이터에도 강건한 추론을 하도록 일반화가 강해진다.

수식은 이렇다.

  • : 원본 임베딩
  • : Uniform Distribution에서 무작위로 뽑은 노이즈, 범위
  • 분모 : 시퀀스 길이 과 임베딩 차원 를 고려한 스케일링 팩터
  • 분자 : 하이퍼파라미터, neftune_noise_alpha

노이즈의 크기를 시퀀스 길이와 임베딩 차원으로 정규화하고, 그 세기를 alpha로 조절하는 구조다. 이번 학습에서는 neftune_noise_alpha를 5로 뒀다.

적용#

transformers의 Trainer에 인자 하나로 들어간다. 임베딩에 노이즈를 더하는 forward 훅이 학습 때만 작동하고, 추론 때는 원본 임베딩을 그대로 쓴다. 그래서 학습 시 일반화만 강화하고 추론 품질은 건드리지 않는다.

정리
  • 소규모 데이터로 거대 모델을 SFT하면 과적합이 쉽게 난다
  • NEFTune은 순전파 때 임베딩에 균등 노이즈를 더해 암기를 막고 일반화를 강화한다
  • 노이즈 세기는 로 정규화되며 alpha가 유일한 튜닝 값이다

전체 하이퍼파라미터 설정은 하이퍼파라미터 튜닝에 같이 정리했다.

댓글