3줄 요약

  1. LoRA 캡션은 훈련 시 노이즈 제거 방향을 알려주는 안내 신호다. 캡션한 것은 변수로 남고, 캡션하지 않은 것은 트리거 정체성 안으로 흡수된다. 이 두 방향을 계산하여 무엇을 쓰고 무엇을 뺄지 결정한다.
  2. 잘못된 두 극단이 있다. 트리거만 넣고 아무 캡션도 안 하면 배경·의상까지 트리거에 흡수돼 유연성이 사라진다. 반대로 프롬프트처럼 장문으로 다 묘사하면 신호가 희석되어 정합성이 무너진다. 정답은 자동 캡션 1차 통과 뒤 손 편집으로 정제하는 절충이다.
  3. 익스트림 클로즈업은 문맥이 붕괴하므로 소유격 결속(Lora1234's left eye)으로 트리거에 묶는다. 여러 개념을 한 LoRA에 넣으려면 4개 데이터셋으로 disentanglement를 짜야 한다.

자료의 위치

원저자: /u/AwakenedEyes, r/StableDiffusion, 2026-04-26 게시. 3부작 LoRA 훈련 가이드의 두 번째 편이다.

Part 1이 “데이터셋에서 반복되는 것이 학습된다"는 원리를 세웠다면, Part 2는 그 반복 안에서 무엇이 트리거에 흡수되고 무엇이 변수로 남을지를 결정하는 도구, 즉 캡션을 다룬다.

왜 캡션이 essential한가

훈련 과정을 저자가 정리한 방식은 이렇다.

  1. 데이터셋 이미지에 무작위로 노이즈를 얹는다.
  2. 캡션 신호(T5 임베딩)를 참조해서 노이즈를 걷어낸 “이전 단계"의 이미지를 예측한다. “이 노이즈 레벨과 이 캡션이 주어졌을 때 무엇을 그려야 하나?”
  3. 예측 결과의 조정치를 캡션 토큰과 결합해서 LoRA에 기록한다.

저자는 이 지점에서 한 문장을 특별히 강조한다.

아주 명확히 말한다. 캡셔닝은 essential하다. 데이터셋을 어떻게 캡션하느냐가 LoRA의 품질을 결정한다.

캡션이 훈련 중에 담당하는 역할을 정리하면 여섯 가지다.

  • 무엇이 학습되고 있는지에 context를 부여한다 (익스트림 클로즈업에 특히 중요).
  • 무엇이 변수이고 추론 시 프롬프트로 제어될지를 트리거 밖으로 밀어낸다.
  • 학습될 모든 것에 고유한 트리거 워드를 부여한다.
  • 여러 개념이 동시에 학습될 때 서로 구분한다.
  • 이 LoRA가 refine 중인, 모델이 이미 아는 개념이 무엇인지 알려 준다.
  • 훈련의 오버피팅 경향을 견제한다.

무엇을 캡션할 것인가

자연어(SD1.5·SDXL 같은 구형은 짧은 태그) 문장으로, 짧고 사실적으로. 각 이미지 캡션에는 다음이 포함된다.

  • 트리거 워드 (모델이 아직 모르는 유니크한 조어).
  • 표정·감정.
  • 카메라 각도, 높이, 줌 레벨.
  • 광원의 종류와 방향 (같은 물체가 왜 이미지마다 다른 색으로 보이는지 모델이 이해하도록).
  • 자세와 배경 (아주 짧게, 상세 묘사 없이).
  • 의상 (그 의상이 LoRA에 고정돼야 하는 코스튬 같은 경우는 예외).
  • 액세서리.
  • 헤어스타일과 컬러 (같은 헤어를 정체성으로 고정하려면 예외).
  • 액션.

저자가 권한 템플릿은 다음과 같다.

<camera shot type> of <trigger> seen from <camera angle> at <elevation>
with <hair color and style> wearing <outfit and accessories>.
She is <position or action> and is expressing <emotion>.
<Light description>, <short background description>.

실제 예시 한 개만 옮겨 온다.

Middle-full shot of LoraTrigger1234 standing in a garden, smiling,
seen from the front at eye-level, natural light, soft shadows.
She is wearing a beige cardigan and jeans.
Blurry plants are visible in the background.

캡션의 핵심 논리

저자는 이 원리를 굳이 다시 명제 형식으로 풀어 놓는다.

캡션에 적은 것은 변수로 표시된다. 모델은 그것들이 변할 수 있다고 배운다. 캡션에 적지 않은 것은 조용히 트리거 워드의 정체성 안으로 흡수된다. 모델은 그것들이 고정이라고 배운다.

이는 의도된 설계다. 캐릭터의 헤어 컬러를 영구히 고정하려면 캡션하지 않는다. 생성 시 사용자가 헤어 컬러를 바꿀 수 있어야 하면 캡션한다. 얼굴은 캐릭터 정체성의 핵심이므로 절대 캡션하지 않는다.

색과 조명은 어떻게 나눠 캡션하는가

이 대목이 가이드에서 특히 정교하다. 규칙은 이렇다.

실제로 있는 색을 캡션하라. 조명 때문에 왜곡된 색이 아니다.

텅스텐 조명 아래 흰 벽은 노랗게 보인다. 파란 앰비언트 아래 검은 옷은 짙은 남색으로 보인다. 만약 지각된 색을 그대로 캡션하면, 조명과의 상호작용을 물체의 고정 속성으로 하드코딩하게 된다.

예시로 저자가 든 것은 다음이다. 캐릭터의 헤어가 원래 애시 화이트인데 붉은 네온 아래 서 있는 이미지라면, red hair라고 캡션하지 않는다. 그것은 두 개의 별도 정보(재료 색과 조명)를 하나로 융합해서 모델이 disentangle할 수 없게 만든다. 대신 이렇게 쓴다.

white hair, red neon light

같은 원리는 유색광 아래의 피부톤, 비중립광 아래의 원단 색, 지각과 실제가 어긋나는 모든 상황에 적용된다. 물체 자체를 먼저 서술하고, 그 위에 어떤 빛이 떨어지는지 별도로 서술한다.

부정 캡션은 신호가 약하다

이어지는 규칙도 방향이 같다. 있는 것을 서술하지, 없는 것을 서술하지 않는다.

  • Bare-chested, wearing pants ← 맞다.
  • Wearing only pants ← 약하다. “only"라는 단어가 부재에 대한 추론을 모델에게 요구한다.
  • flat even lightno shadows보다 강하다.
  • neutral expressionnot smiling보다 강하다.

캡션 안에 부정이나 제약을 쓰고 있다는 것을 알아차렸다면, 프레임에 실제로 보이는 것으로 대체할 수 있는지 자문한다. 프레임 밖에 있는 것은 서술하지 않는다. 팔 하나가 각도 때문에 가려졌다면, 그 팔은 언급하지 않는다.

복잡한 포즈는 한 단어로 요약하지 않는다

복잡한 포즈에 하나의 단어를 붙이려는 유혹을 저자는 명시적으로 만류한다. 대신 해부학적 앵커 포인트로 분해한다. 무게가 어디로 지지되는가, 손은 어디 있는가, 몸통 각도는 어떤가, 머리 각도는 어떤가.

Seated on the ground with legs crossed, torso leaning back,
one hand on the ground behind her supporting her weight,
chin slightly raised

이렇게 쓰면 모호함이 없고, 실제 시각적 기하와 캡션이 일대일 대응된다.

트리거 워드는 유니크하고 무의미해야 한다

  • Lora1234, XJ7Kappa ← 좋다.
  • Elena, warrior ← 나쁘다. 모델이 이미 그 단어의 의미를 알기 때문에, LoRA 훈련은 그 사전 학습 가중치를 밀어내며 씨름해야 한다.

트리거 워드는 매 캡션에, 예외 없이 등장해야 한다.

특수 케이스: 익스트림 클로즈업의 소유격 결속

여기가 Part 2에서 가장 정교한 대목이다.

익스트림 클로즈업에서는 문맥이 붕괴한다. 일반 초상에서라면 모델은 이 얼굴이 캐릭터의 얼굴이라고 쉽게 추론할 수 있다. 하지만 눈만 프레임을 가득 채운 익스트림 클로즈업이 오면, 모델은 그 눈이 누구의 눈인지, 캐릭터의 어떤 부위인지, 심지어 이것이 확대 컷인지 매크로 사진인지도 알 방법이 없다.

이런 이미지의 캡션은 세 가지 일을 추가로 해야 한다.

  • 줌 레벨을 명시한다: extreme close-up, macro detail shot 등.
  • 어느 부위·특징인지 명시한다.
  • 소유격으로 트리거에 묶는다: 그냥 an eye가 아니라 Lora1234's left eye.

예시가 인상적이다.

Extreme close-up of LoraTrigger1234's left eye

저자는 이 대목에서 규칙이 겉으로 충돌하는 것처럼 보이는 지점을 짚어 준다.

앞서는 “캡션한 것은 변수, 캡션하지 않은 것은 트리거로 흡수"라고 했다. 그런데 여기서는 눈은 얼굴의 일부이니 트리거로 흡수돼야 하는데도 캡션하라고 말하고 있다.

해결은 소유격에 있다. LoraTrigger1234's eye는 변수 특징을 서술하는 게 아니라, 트리거의 속성을 서술하는 것이다. 소유격이 결정적 역할을 하고, LoRA는 그 눈을 캐릭터와 연결할 문맥을 얻는다.

잘못된 캡션의 두 극단

저자는 커뮤니티의 캡션 논쟁을 이렇게 정리한다. 사람들은 두 진영으로 나뉘어 서로 싸운다. 트리거만 넣고 아무 캡션도 안 하는 진영, 그리고 LLM 자동 캡션으로 다 묘사하는 진영. 저자의 진단은 두 진영 모두 틀렸다는 것이다. 이유는 다음과 같다.

트리거만 넣는 실수. 캡션 없이 트리거만 넣으면, 데이터셋에서 배운 모든 것이 트리거 신호로 흡수될 수밖에 없다. 원치 않는 것도, 상충하는 것도 다 들어간다. 배경·의상·조명 조건이 반복되는 순간 그것들이 트리거의 정체성에 딸려 들어간다. 결과는 매우 뻣뻣한 LoRA다.

프롬프트처럼 장문으로 다 묘사하는 실수. She is wearing a beautiful silky red scarf with intricate woven stitches처럼 쓰면, 모델과 훈련 소프트웨어는 어떤 픽셀이 red인지, scarf인지, intricate인지, woven인지, stitches인지 결정하려고 처리 자원을 낭비한다. 실제로 원한 것은 그 스카프가 트리거에 학습되지 않는 것뿐이었는데. 토큰이 많아지면 신호가 희석되어 리얼리즘, 조명, 얼굴 조명 방식까지 다 새어 나간다. JoyCaption 같은 도구로 전자동 캡션을 돌리는 것이 잘못인 이유가 이것이다. 그 방식은 파인튜닝 데이터엔 정확하지만 LoRA 데이터엔 정확히 반대다.

절충안이 있다. 자동 캡션을 1차 패스로 돌려서 큰 데이터셋의 시간을 절약하고, 매 캡션마다 손으로 편집 패스를 돈다. 트리거 워드를 통일하고, LoRA 목표에 따라 서술할 것과 뺄 것을 의도적으로 결정하고, 전체 캡션 사이의 일관성을 확인한다.

댓글에서 건진 것들

유니크 트리거는 최신 T5 모델에 안 통한다

/u/Tosermepls가 최신 모델(LTX, WAN)에서 트리거 워드의 실효성을 반박했다. 그의 주장은 두 가지다. 첫째, LoRA는 base weight를 “unlearn"할 수 없다, base 위에 스택될 뿐이다. 둘째, xbrsadhad 같은 무의미 조어 트리거를 최신 모델은 텍스트 문자열로 오인해서 이미지에 글자로 튀어나오게 만든다.

저자의 재반론은 두 지점을 분리한다. Unlearning은 물론 완전히 되진 않지만, 알려진 토큰을 새로 정의하려면 훨씬 강한 델타가 필요하니 훈련이 사전 지식과 씨름해야 한다는 것. 그리고 문자열 튀어나옴 문제는 대개 undertraining 상태에서만 봤고, 실전에서 이걸 피하려면 트리거를 제대로 된 자연어 문장 안에 넣어야 한다고 답했다. 이런 캡션은 나쁘다는 것이다.

trigger1234, she is standing in front of a window

대신 이렇게 써야 한다.

trigger1234 is standing in front of a window

그리고 caption dropout·caption shuffle 같은 옵션이 자연어를 흐트려서 이 현상을 유발할 수 있다는 가설도 덧붙였다.

/u/Apprehensive_Sky892는 Part 1 댓글과 같은 결론을 짧게 다시 짚었다. CLIP 안 쓰는 최신 모델에서 유니크 토큰 트리거는 효과가 없다. 예외는 AI-Toolkit의 DOP 사용 시.

성별 명사를 굳이 넣지 않는 실전 기법

/u/red__dragon이 흥미로운 실전 기법을 공유했다. 캐릭터 LoRA 훈련 시 man/woman을 캡션에 쓰지 않는다. 그 단어들은 모델의 편향을 강하게 끌어당기기 때문이다. 대신 대명사(she/he)만 쓰고, 데이터셋에 캐릭터 옆에 다른 사람이 함께 있는 이미지를 넣어 그쪽만 man/woman으로 캡션한다. 이렇게 하면 캐릭터가 모델의 전형적 man/woman 편향에서 멀어질수록 더 좋은 결과가 나온다는 관찰이다.

다중 개념 LoRA를 위한 disentanglement 기법

/u/TekaiGuy가 트리거 두 개를 매 캡션마다 함께 쓰는 경우를 물었다. 저자의 답은 이 3부작에서 가장 실전적인 팁 중 하나로, 별도 절차가 필요하다는 것이다. 이 절차의 이름은 disentanglement이며, 4개의 데이터셋을 동시에 훈련한다.

  • 데이터셋 1: 개념 A와 B가 함께 등장하는 이미지. 두 트리거를 다 쓰고, 어느 트리거가 무엇에 붙는지 자연어로 명확히 한다. Photo of item123trigger drawn in style456trigger style.
  • 데이터셋 2: A만 등장하고 B는 없는 이미지. 트리거 A만, 트리거 B는 절대 쓰지 않는다.
  • 데이터셋 3: B만 등장하고 A는 없는 이미지. 트리거 B만 쓴다. A table with a chair in a kitchen, drawn in style456trigger style.
  • 정규화 데이터셋: A도 B도 없는 일반 이미지. 두 트리거 다 쓰지 않고, 트레이너에 is regularization 플래그를 켠다.

저자는 덧붙였다. 다중 개념 LoRA는 공간이 더 필요하니 dim rank를 평소의 두 배로 잡아야 한다.

캡션 안 하고도 잘 됐다는 반례

/u/vault_nsfw는 ZIT에서 여러 LoRA를 훈련해 봤는데 매우 기본적인 캡션과 상세한 캡션 사이에 큰 차이를 못 느꼈다고 보고했다. 저자의 원 진단과 어긋나는 실전 관찰이다. 저자의 다른 코멘트를 종합하면, 이 경우는 데이터셋 자체가 이미 매우 일관됐거나 훈련 스텝이 sweet spot 근처에 자연스레 안착한 경우로 보인다. 원 가이드도 “매우 신중히 통제된 데이터셋 위에서는 트리거만 넣어도 결과가 그럭저럭 나올 수 있지만, LoRA는 뻣뻣해지고 창의적 프롬프트에 반응하기 어렵다"고 인정한다.

400 클립을 자동 캡션했다는 후회

/u/Superelmostar가 이 가이드를 좀 더 일찍 읽었어야 했다고 아쉬워했다. 400개의 6초 클립을 만들고 자동 캡션으로 처리해 훈련했는데 실패했다는 것. 저자의 응답이 시원하다.

여기 개념 대부분은 영상 훈련에도 유효하지만 특정 부분은 다르다. 하지만 6초 클립이 정확히 같은 것을 다양한 변주로 보여주고 있고 변하는 것만 캡션하고 고정된 것은 캡션하지 않는다면, 실제로 필요한 것은 10개 미만의 클립이다. 400개는 완전히 오버킬이다.

오디언스와의 마찰

Part 2 댓글에도 저자가 “AI가 쓴 것 아니냐"는 시비를 받는 순간이 나온다. /u/hurrdurrimanaccount는 “AI slop text. 너무 파고들지 마"라고 짧게 던졌고, 저자는 이렇게 응수했다.

어떤 사람들은 이제 구조 있는 긴 텍스트만 봐도 “AI가 썼을 것"이라고 결론짓지 않고는 못 배기는 모양이다. 흥미로운 일이다.

가장 눈여겨본 것은

정보 밀도(Part 1)가 데이터셋을 픽셀 예산의 문제로 다시 봤다면, Part 2의 소유격 결속은 캡션을 토큰의 소속 문제로 보게 한다. an eyeLoraTrigger1234's eye는 동일한 시각적 대상을 서술하지만, 훈련 신호로서의 소속은 정반대다. 문법적 소유격 하나가 학습 신호의 방향을 뒤집는다는 관찰은 한국어 캡션을 쓸 일이 있을 때에도 시사점이 있다.

다중 개념 disentanglement 절차도 인상 깊다. LoRA가 두 개념을 얽지 않도록 하는 방법이, 훈련 단계에서 데이터셋을 정보의 부분집합으로 잘라내고 각 부분집합에서 어떤 트리거가 활성화될지 명시적으로 통제하는 형태로 나타난다. 겉으론 이미지 캡션 이야기지만, 밑에는 다중 개념을 얽히지 않게 학습시키는 일반적 아이디어가 있다.

그리고 캡션 논쟁에 대한 저자의 진단이 이 시리즈 전체를 관통하는 태도를 요약한다. 트리거만 넣는 진영도, 자동 캡션 진영도 서로 상대를 이념적으로 밀치는데, 저자의 답은 어느 한쪽 편에 서지 않고 “무엇을 흡수시키고 무엇을 변수로 남길지 매 이미지마다 의도적으로 결정하라"는 원리로 돌아간다. 이해 없는 레시피 복제 대신 원리로 돌아가라는 Part 1의 문제 의식이 캡션에서도 그대로 반복된다.

출처