kimyongtae.com
홈 / 강의 / AI 이미지·애니메이션 생성, 원리부터 / 1단계. 생성 모델의 원리

1-5. 텍스트 조건화: 프롬프트가 그림에 들어가는 길

지금까지 만든 생성기는 무엇을 그릴지 말해 줄 방법이 없었다. 이번 수업은 글자가 숫자가 되고, 그 숫자가 디노이저 안으로 들어가는 과정을 따라간다. 모델마다 프롬프트 쓰는 법이 다른 이유가 여기서 나온다.

조건이 붙은 디노이저

0-2에서 프롬프트로 그림을 뽑는 것은 p(x | 프롬프트)에서 뽑는 일이라고 했다. 디노이저의 입력에 프롬프트를 하나 더 넣으면 된다.

이전:  디노이저( 섞인 그림, t )           → 방향
이후:  디노이저( 섞인 그림, t, 프롬프트 )  → 방향

학습 데이터는 (그림, 그 그림을 설명하는 글) 쌍이다. 모델은 "이 설명이 붙었을 때는 이쪽으로 가야 그림다운 그림이 나온다"를 배운다. 같은 노이즈에서 출발해도 설명이 다르면 다른 곳에 도착한다.

문제는 글자를 신경망에 넣을 수 없다는 것이다. 신경망은 숫자만 받는다.

글자를 숫자로: 텍스트 인코더

세 단계를 거친다.

  1. 토큰으로 쪼갠다. 문장을 단어나 단어 조각으로 나눈다. 각 조각에 번호가 있다.
  2. 토큰마다 벡터를 붙인다. 번호를 숫자 묶음으로 바꾼다.
  3. 트랜스포머를 통과시킨다. 0-5의 셀프 어텐션으로 토큰들이 서로를 본다. "빨간"이 "모자"를 꾸민다는 것이 이 단계에서 벡터에 반영된다.

결과는 토큰마다 하나씩의 벡터다. 77토큰짜리 프롬프트면 벡터 77개가 나온다. 이것이 디노이저에 들어가는 "프롬프트"의 실체다.

이 일을 하는 모델이 텍스트 인코더다. 이미지 모델과 따로 학습한 것을 가져다 얼려서 쓴다.

텍스트 인코더의 종류

인코더어떻게 학습했나특징쓰는 모델
CLIP그림과 설명이 서로 짝인지 맞히기그림에 나오는 개념을 잘 안다. 77토큰까지만 받는다. 문장 구조에는 약하다SD 1.5, SDXL
T5글만 가지고 학습한 언어 모델긴 문장과 관계를 잘 이해한다. 크고 무겁다SD3, Flux, Wan(다국어판)
LLM 계열대화형 언어 모델을 인코더로 쓴다문장 이해가 가장 좋다. 복잡한 지시, 글자 넣기에 강하다Qwen-Image 등 최근 모델

CLIP은 그림 4억 장과 그 설명으로 학습했다. 그림과 글을 같은 공간에 놓는 법을 배웠기 때문에 "그림에 나올 법한 것"을 잘 표현한다. 대신 "A가 B의 왼쪽에 있다" 같은 관계는 잘 못 잡는다. 단어 꾸러미에 가깝게 이해한다.

T5와 LLM 계열은 글을 글로 이해한다. 누가 무엇을 하는지, 무엇이 어디에 있는지를 구분한다. 최신 모델이 긴 문장 프롬프트를 잘 따르는 이유다.

여러 개를 함께 쓰는 모델도 많다. SDXL은 CLIP 두 개를, Flux는 CLIP 하나와 T5 하나를 쓴다.

디노이저에 넣는 방법

토큰 벡터들을 디노이저 안으로 넣는 길은 크게 세 가지다.

크로스 어텐션

0-5에서 본 것이다. 그림 토큰이 질문을 만들고, 텍스트 토큰이 이름표와 내용을 내놓는다. 그림의 각 위치가 프롬프트에서 자기와 관련된 단어를 찾아 정보를 가져온다.

SD 1.5와 SDXL의 U-Net은 블록마다 크로스 어텐션이 끼어 있다. 프롬프트는 여러 깊이에서 반복해서 주입된다.

한 줄로 이어 붙이기

그림 토큰과 텍스트 토큰을 한 줄로 이어 붙여 셀프 어텐션에 함께 넣는다.

[ 텍스트 토큰들 | 그림 토큰들 ] → 셀프 어텐션

그림이 텍스트를 보고, 텍스트도 그림을 본다. 양쪽으로 흐른다. 텍스트 쪽 벡터도 층을 지나며 계속 다듬어진다. SD3와 Flux가 이 방식이다. 프롬프트를 따르는 능력이 크로스 어텐션보다 좋다.

요약 벡터

프롬프트 전체를 벡터 하나로 요약한 것도 만든다. 이것을 시간 정보(t)와 함께 모든 블록에 넣는다. 그림 전체의 분위기나 화풍 같은 "전역적인" 정보를 전한다. SDXL과 Flux가 CLIP의 요약 벡터를 이렇게 쓴다.

프롬프트 쓰는 법이 모델마다 다른 이유

두 가지가 정한다.

텍스트 인코더가 무엇을 이해하는가. CLIP은 단어 꾸러미에 강하고 문장에 약하다. T5와 LLM은 문장을 이해한다.

학습 데이터의 설명이 어떻게 쓰여 있었는가. 모델은 학습 때 본 형식의 글에 가장 잘 반응한다.

태그 모델에 긴 문장을 넣거나, 문장 모델에 태그만 나열하면 결과가 나빠진다. 2단계에서 자세히 다룬다.

77토큰 제한

CLIP은 한 번에 77토큰까지만 받는다. 시작과 끝 표시를 빼면 75개다. 프롬프트가 길면 도구가 75토큰씩 잘라 따로 인코딩한 뒤 이어 붙인다.

잘리는 자리에서 문맥이 끊긴다. "빨간"이 앞 덩어리에, "모자"가 뒤 덩어리에 들어가면 둘의 관계가 약해진다. 중요한 말을 앞에 쓰라는 조언이 여기서 나왔다. T5나 LLM 계열은 수백 토큰을 한 번에 받으므로 이 문제가 없다.

텍스트 인코더도 검열의 한 층이다

프롬프트의 뜻은 텍스트 인코더를 지나야 디노이저에 닿는다. 인코더가 어떤 말을 뭉뚱그리거나 다르게 표현하면 디노이저는 그것을 알 수 없다. 특히 LLM 계열 인코더는 대화형 모델에서 왔기 때문에 이런 일이 생길 수 있다. 5단계에서 다룬다.

확인 문제

  1. 디노이저에 들어가는 "프롬프트"의 실체는 무엇인가?
  2. CLIP이 "고양이가 개의 왼쪽에 있다"를 잘 못 그리게 하는 이유는?
  3. 애니 계열 모델에 태그를 나열하는 것이 문장보다 잘 듣는 이유는?

풀이

  1. 텍스트 인코더가 내놓은 토큰별 벡터 묶음이다. 모델에 따라 요약 벡터 하나가 더 있다.
  2. CLIP은 그림과 글이 짝인지 맞히는 식으로 학습해서 단어 꾸러미에 가깝게 이해한다. 위치 관계 같은 문장 구조를 잘 구분하지 못한다.
  3. 학습 데이터의 설명이 태그 나열이었기 때문이다. 모델은 학습 때 본 형식에 가장 잘 반응한다.
← 1-4 플로우 매칭 1-6 CFG: 프롬프트를 얼마나 강하게 따를 것인가 →