LoRA가 서 있는 자세만 배웠다
캐릭터 하나를 이미지 생성 모델에 학습시키는 소규모 파인튜닝(LoRA)을 진행했다. 기준 사진은 47장, 한 장도 빼지 않고 전부 사용했다. 캡션(각 사진에 붙이는 설명 텍스트)은 원칙을 하나 세워서 썼다 — 거의 모든 사진에 공통으로 나오는 요소(체형, 머리색, 특징적인 장신구)는 캡션에 적지 않는다. 그래야 모델이 그것을 “매번 프롬프트로 불러와야 하는 것”이 아니라 “이 캐릭터의 정체성 자체”로 받아들인다. 반대로 가끔만 나오는 요소(의상, 자세, 배경)는 캡션에 적어서, 모델이 그것을 선택적인 것으로 다루게 했다.
학습 자체는 전용 GPU가 있는 환경에서 1,880스텝을 71분 만에 끝냈다 — 스텝당 약 2.3초로, 이전까지 쓰던 학습 환경보다 3.8배 빠른 속도였다. 기록해둘 만한 건, 같은 작업에 대해 말로 미리 추정했던 시간(처음엔 15분, 다음엔 53분)이 둘 다 완전히 빗나갔다는 점이다. 실측하지 않은 추정치는 믿을 게 못 된다.
강도를 낮추면 얼마나 남는가
LoRA는 항상 100% 강도로 적용할 필요가 없다. 강도를 1.0에서 0.6까지 낮춰가며 같은 장면을 생성해 캐릭터가 언제부터 “다른 사람”이 되는지 확인했다. 1.0에서 0.8까지는 정체성이 유지됐다. 0.7부터는 얼굴이 눈에 띄게 다른 사람이 됐고, 0.6에서는 옷차림까지 바뀌었다. 오히려 일부 파인튜닝에서 흔한 “밋밋하고 평범해지는” 현상이 사라지는 지점도 최대 강도(1.0)였다 — 이번 경우엔 강도를 낮추는 쪽이 더 안전한 선택이 아니었다.
캡션 하나가 예상 밖으로 새어 나온 사례도 있었다. 47장의 캡션 중 정확히 한 장에만 적혀 있던 특정 소품이, 최대 강도에서 실제로 요청한 프롬프트(다른 소품)를 밀어내고 그대로 등장했다. 강도를 낮추자 다시 정상으로 돌아왔다. 47장 중 단 한 장이었는데도 결과를 바꾸기에 충분했다 — “달라지는 것만 캡션에 적는다”는 원칙에도 이런 예외가 실제로 생길 수 있다는 걸 확인한 셈이다.
포즈 테스트가 찾아낸 구멍
가장 쓸모 있는 실패는 별도로 돌린 포즈 테스트에서 나왔다. 12가지 자세를 하나씩 생성해서 확인했는데, 서 있거나 공중에 뜬 자세는 전부 완벽했다. 반면 바닥 자세(쭈그려 앉기, 무릎 꿇기, 낮게 웅크리기, 매달리기)는 네 번 시도해 네 번 다 실패했다. 원인은 돌이켜보니 명확했다 — 학습에 쓴 47장 중에는 앉은 사진은 있었지만, 바닥에 닿는 자세는 단 한 장도 없었다. 모델이 “일반화에 실패한” 게 아니라, “이 캐릭터는 그런 자세를 취하지 않는다”고 정확하게 학습한 것이었다. 한 번도 본 적이 없으니까.
이건 파인튜닝에서 말하긴 쉽지만 실제로는 자주 건너뛰는 교훈의 깔끔한 사례다 — LoRA는 학습 데이터가 보여준 자세·각도·상황의 범위를 정확히 그대로 재현한다. “보통 캐릭터라면 당연히 되겠지”라고 가정한 범위는 재현되지 않는다. 해결책도 학습 파라미터를 조정하는 게 아니라 단순하다 — 바닥 자세 사진 네다섯 장을 추가로 찍어서 같은 배치를 다시 돌리는 것.