8장. PEFT와 LoRA 학습
학습이 잘 안 될 때 점검표
자동차가 이상하면 정비사는 증상부터 듣고, 의심 가는 곳을 하나씩 열어 봅니다. "브레이크가 밀린다 → 패드가 닳았나 → 패드 두께를 잰다"처럼요. LoRA 학습도 이상하면 증상 → 의심할 원인 → 점검 방법 차례로 하나씩 지워 갑니다.
그림의 네 칸은 문제가 생겼을 때 먼저 열어 볼 곳입니다. 손실 곡선은 학습이 되고 있는지, 데이터는 원문과 끝맺음이 바른지, 템플릿은 학습과 추론이 같은 양식인지, 메모리는 배치와 길이가 알맞은지를 봅니다.
증상별 점검표
| 증상 | 의심할 원인 | 점검 방법 |
|---|---|---|
| 학습 후에도 답이 거의 그대로 | 학습률이 너무 낮음, epoch 부족, 추론 템플릿 불일치 | 손실 곡선, chat() 이 apply_chat_template 을 쓰는지 |
| 답을 끝내지 못하고 계속 생성 | 학습 데이터에 종료 토큰 없음, max_length 에서 잘림 | 토큰화한 학습 예시 끝에 <|im_end|> 가 남는지 |
| 질문을 따라 하거나 이상한 기호 출력 | labels 마스킹 오류, 데이터에 이상한 기호가 섞임 | completion_mask, 학습 데이터 원문 |
| 학습 데이터 문장을 그대로 외워서 출력 | 과적합 | 검증 손실 추이, epoch·r 줄이기 |
| 원래 잘하던 일반 질문을 못함 | 지나친 학습으로 기존 능력 손상 | 9장처럼 일반 질문으로 확인 |
| CUDA out of memory | 배치·max_length 가 큼 | 배치 줄이고 gradient_accumulation_steps 늘리기, QLoRA, gradient checkpointing |
표 안의 <|im_end|> 는 Qwen 의 대화 끝 표시 <|im_end|> 입니다(표 칸을 나누는 기호와 겹치지 않게 바꿔 적었습니다). gradient checkpointing 은 activation 을 모두 기억하지 않고 필요할 때 다시 계산해 메모리를 아끼는 방법입니다.
짧은 예시
def diagnose(train, valid):
# 마지막 두 epoch 의 변화로 손실 곡선의 모양을 가른다
t_change = train[-1] - train[-2]
v_change = valid[-1] - valid[-2]
if any(x != x for x in train + valid): # NaN 은 자기 자신과 같지 않다
return "불안정: 학습률 낮추기, 정밀도 확인"
if t_change < 0 and v_change > 0:
return "과적합 신호: epoch 줄이기, 데이터 늘리기, dropout·r 조정"
if abs(t_change) < 0.01 and abs(v_change) < 0.01:
return "거의 안 배움: 학습률 올리기, 데이터·템플릿 점검"
return "잘 배우는 중: epoch 를 늘려 볼 수 있음"
print(diagnose([3.09, 2.4227, 1.8684], [3.126545, 3.122271, 3.208835]))
# 결과: 과적합 신호: epoch 줄이기, 데이터 늘리기, dropout·r 조정
print(diagnose([3.10, 3.10, 3.10], [3.12, 3.12, 3.12]))
# 결과: 거의 안 배움: 학습률 올리기, 데이터·템플릿 점검이 코드가 뜻하는 것
정비사의 점검 순서를 함수 하나로 적어 본 코드입니다. 증상(손실 곡선의 마지막 변화)을 듣고 의심할 곳과 조치를 돌려줍니다. 여기서 증상이 t_change, v_change, 정비 안내가 돌려주는 문장입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
train[-1] - train[-2] | 마지막 두 epoch 의 차이 | 최근에 나아졌나 |
x != x | NaN 인지 확인 | 계기판이 고장 났나 |
t_change < 0 and v_change > 0 | 학습만 내려가고 검증은 올라감 | 답만 외우는 중 |
첫 줄은 실습 3의 실제 손실을 넣은 것이고, 둘째 줄은 설명용으로 지어낸 평평한 곡선입니다. 실제 진단은 이 함수처럼 단순하지 않으므로, 손실과 답을 함께 보고 사람이 판단합니다.
주의할 점
- 증상 하나에 원인이 여럿일 수 있습니다. 한 번에 설정 하나만 바꾸고 다시 학습해야 무엇이 효과였는지 압니다.
- 학습 데이터 문장을 그대로 외워 말하는지는 손실만으로 알기 어렵습니다. 학습 데이터에 없는 질문으로 답을 직접 읽어 봅니다.