4-3. 학습 설정과 진단
학습 도구에는 설정이 수십 개 있다. 실제로 결과를 좌우하는 것은 몇 개뿐이다. 이번 수업은 그 몇 개가 무엇을 하는지, 그리고 학습이 잘 되고 있는지 그림을 보고 판단하는 법을 다룬다.
학습은 "얼마나"의 문제다
LoRA 학습의 설정은 결국 한 가지를 조절한다. 모델을 내 데이터 쪽으로 얼마나 끌고 가는가.
- 덜 끌면: 캐릭터가 안 닮는다. 미적합.
- 더 끌면: 데이터의 그림을 외워서 그대로 뱉는다. 프롬프트를 안 듣는다. 과적합(0-3).
그 사이의 알맞은 지점을 찾는 것이 전부다. 끌고 가는 정도는 대략 이렇게 정해진다.
끌고 간 정도 ≈ 학습률 × 스텝 수 × (alpha / rank)
정확한 식은 아니다. 셋이 같은 방향으로 작용한다는 것만 기억하자. 하나를 올리면 다른 것을 내려 균형을 맞출 수 있다.
핵심 설정
학습률
한 걸음에 가중치를 얼마나 움직이는가(0-3). LoRA에서는 1e-4(0.0001)가 흔한 출발점이다.
- 너무 높으면: 금방 타 버린다. 색이 깨지고 형태가 무너진다.
- 너무 낮으면: 한참 돌려도 안 닮는다.
스텝 수와 에폭
- 스텝: 가중치를 한 번 움직이는 것.
- 에폭: 데이터 전체를 한 바퀴 도는 것.
총 스텝 = 그림 수 × 반복 횟수 × 에폭 ÷ 배치 크기
캐릭터 LoRA는 대략 1,000~3,000스텝에서 완성되는 경우가 많다. 모델과 데이터에 따라 크게 다르니 숫자를 믿지 말고 아래의 방법으로 직접 확인한다.
랭크와 alpha
4-1에서 본 값이다.
| 뜻 | 흔한 값 | |
|---|---|---|
| rank | 변화의 방향을 몇 가지 허용할지. 클수록 많이 담는다 | 캐릭터 8~32, 화풍 16~64 |
| alpha | 변화의 기본 크기. alpha / rank가 곱해진다 | rank와 같게 하거나 절반 |
랭크가 크다고 좋은 것이 아니다. 크면 데이터의 잡다한 것까지 외울 여유가 생겨 과적합되기 쉽다. 작게 시작해서 모자라면 올린다.
alpha를 랭크의 절반으로 두면 변화가 절반 크기로 들어간다. 학습률을 절반으로 한 것과 비슷하다.
배치 크기
한 걸음에 그림을 몇 장 보는가. 크면 기울기가 안정되지만 메모리를 많이 쓴다. 개인 장비에서는 1~4가 보통이다.
해상도
학습할 때 그림을 어느 크기로 볼지. 기반 모델의 기본 해상도로 한다. 낮추면 메모리는 아끼지만 디테일을 덜 배운다.
그 밖에 보이는 설정
| 설정 | 하는 일 | 다루는 법 |
|---|---|---|
| 옵티마이저 | 가중치를 움직이는 방법(0-3). AdamW가 기본 | 기본값. 학습률을 자동으로 맞춰 주는 종류도 있다 |
| 학습률 스케줄 | 학습 중 학습률을 어떻게 바꿀지 | 일정하게, 또는 서서히 줄이기 |
| 타임스텝 샘플링 | 노이즈 비율 t를 어떻게 뽑을지(1-4) | 기반 모델이 쓴 방식을 따른다 |
| 캡션 드롭아웃 | 가끔 캡션을 비우고 학습(1-6의 CFG용) | 낮은 값으로 |
| 태그 섞기 | 태그 순서를 매번 바꿔 순서에 의존하지 않게 | 태그 모델에서 켠다. 트리거 단어는 고정 |
| 텍스트 인코더 학습 | 인코더에도 LoRA를 붙일지 | 최신 모델에서는 끈다 |
대부분은 학습 도구가 모델별로 주는 기본값을 그대로 쓴다. 손댈 것은 학습률, 스텝, 랭크다.
손실 그래프를 믿지 말자
0-6에서는 손실이 내려가는 것으로 학습을 확인했다. LoRA 학습에서는 손실이 별로 도움이 안 된다.
- 손실은 스텝마다 크게 출렁인다. 뽑힌 t에 따라 문제의 난이도가 다르기 때문이다. 노이즈가 많은 그림은 원래 맞히기 어렵다.
- 손실이 계속 내려간다는 것은 데이터를 외우고 있다는 뜻일 수 있다.
- 손실이 가장 낮은 지점이 가장 좋은 LoRA가 아니다.
그림을 보고 판단한다.
그림으로 진단하기
중간 저장과 표본 생성
학습 도구에 두 가지를 시킨다.
- 일정 간격(예: 에폭마다)으로 LoRA를 저장한다.
- 그때마다 고정된 프롬프트와 시드로 표본 그림을 뽑는다.
학습이 끝나면 시점별 LoRA 파일과 표본 그림이 나란히 남는다. 이것을 순서대로 본다.
표본 프롬프트를 잘 고른다
표본 프롬프트는 학습 데이터에 없던 상황이어야 한다. 데이터에 있던 그대로를 시키면 과적합을 알아챌 수 없다.
| 프롬프트 | 확인하는 것 |
|---|---|
| 트리거 단어만 | 캐릭터가 닮았나 |
| 트리거 단어 + 데이터에 없던 자세와 배경 | 프롬프트를 따르나 |
| 트리거 단어 + 다른 의상 | 옷을 갈아입힐 수 있나 |
| 트리거 단어 없이 평범한 프롬프트 | 다른 것까지 물들지 않았나 |
시점에 따라 보이는 모습
| 단계 | 표본 그림의 모습 |
|---|---|
| 초반 | 기반 모델의 평범한 그림. 캐릭터가 안 닮았다 |
| 닮기 시작 | 머리색, 분위기가 비슷해진다. 세부는 아직 다르다 |
| 알맞음 | 캐릭터가 닮았다. 시킨 자세와 배경을 따른다. 옷도 바뀐다 |
| 과적합 시작 | 더 닮았다. 그런데 자세가 데이터의 자세로 끌려간다. 배경이 데이터의 배경을 닮는다 |
| 과적합 | 프롬프트를 무시하고 데이터의 그림을 거의 그대로 낸다. 색이 진해지고 선이 거칠어진다. 트리거 단어 없이도 그 캐릭터가 나온다 |
알맞음과 과적합 시작 사이의 저장본을 고른다. 마지막 저장본이 가장 좋은 경우는 드물다.
강도로 한 번 더 확인
고른 LoRA를 강도 0.6, 0.8, 1.0, 1.2로 돌려 본다.
- 1.0에서 딱 좋다: 잘 된 것이다.
- 0.6~0.8에서 좋고 1.0에서 과하다: 살짝 과하게 학습됐다. 낮춰 쓰면 된다. 또는 앞 시점의 저장본을 쓴다.
- 1.2에서야 닮는다: 덜 학습됐다. 스텝이나 학습률을 올린다.
증상과 처방
| 증상 | 원인 | 처방 |
|---|---|---|
| 안 닮는다 | 미적합 | 스텝이나 학습률을 올린다. 랭크를 올린다. 캡션에서 흡수시킬 특징을 지웠는지 확인한다 |
| 닮았는데 자세와 배경이 늘 같다 | 데이터가 단조롭다 | 데이터를 다양하게 한다. 캡션에 자세와 배경을 적는다 (4-2) |
| 옷을 못 갈아입힌다 | 옷이 트리거에 흡수됐다 | 캡션에 옷을 적는다. 다른 옷을 입은 그림을 넣는다 |
| 색이 타고 선이 거칠다 | 과적합, 또는 학습률이 높다 | 앞 시점의 저장본을 쓴다. 학습률을 낮춘다 |
| 모든 인물이 그 캐릭터가 된다 | 일반 개념까지 물들었다 | 강도를 낮춘다. 스텝을 줄인다. 정규화 그림을 쓴다 |
| 화풍까지 바뀐다 | 데이터의 화풍을 함께 배웠다 | 여러 화풍으로 그려진 그림을 넣는다. 랭크를 낮춘다 |
절반은 설정이 아니라 데이터의 문제다. 설정을 여러 번 바꿔도 안 풀리면 4-2로 돌아간다.
한 번에 하나만 바꾼다
결과가 마음에 안 들면 학습률, 랭크, 스텝을 한꺼번에 바꾸고 싶어진다. 그러면 무엇이 효과가 있었는지 알 수 없다.
- 한 번에 하나만 바꾼다.
- 표본 프롬프트와 시드는 그대로 둔다.
- 바꾼 것과 결과를 적어 둔다.
2-1의 실험과 같은 원칙이다.
증류 모델에서 학습하면 안 되는 이유
1-7에서 미뤄 둔 이야기다. 4스텝 모델이나 가이던스 증류 모델 위에서 LoRA를 학습하면 잘 안 된다.
LoRA 학습은 "노이즈를 섞고 방향을 맞히는" 보통의 목표를 쓴다. 증류 모델은 그 목표에서 벗어나게 학습된 상태다. 보통의 목표로 조금 더 학습시키면 증류가 풀린다. 몇 스텝 만에 그리는 능력이 망가지고 그림이 흐려진다.
그래서 이렇게 한다.
- 증류하지 않은 원본 모델에서 LoRA를 학습한다.
- 쓸 때 증류 모델(또는 원본 + 가속 LoRA)에 붙인다. 대개 잘 통한다.
모델 제작사가 "학습용 원본"과 "추론용 증류판"을 따로 내놓는 이유다.
확인 문제
- 그림 20장, 반복 10회, 10에폭, 배치 2면 총 몇 스텝인가?
- 표본 프롬프트를 학습 데이터에 없던 상황으로 잡는 이유는?
- 고른 LoRA가 강도 0.7에서 가장 좋고 1.0에서는 색이 탄다. 어떻게 하나?
풀이
- 1,000스텝이다. 20 × 10 × 10 ÷ 2.
- 데이터에 있던 그대로를 시키면 외운 것을 뱉는지, 캐릭터를 배운 것인지 구분할 수 없기 때문이다.
- 조금 과하게 학습된 것이다. 0.7로 낮춰 쓰거나, 더 앞 시점의 저장본을 쓴다.