이미지 생성 코드에서 프롬프트 다음으로 자주 만지는 값이 guidance_scale입니다.
image = pipe(
prompt="a photo of a red fox in snow",
guidance_scale=7.5,
num_inference_steps=30,
).images[0]
7.5를 3으로 낮추면 흐릿하고 프롬프트를 덜 따르는 그림이 나오고, 20으로 올리면 색이 타 버린 것처럼 진해지면서 열 장을 뽑아도 거의 같은 그림이 나옵니다. 경험적으로는 다들 압니다. 그런데 7.5는 무엇에 곱해지는 숫자이고, 왜 올리면 선명해지다가 어느 지점부터 망가지는 걸까요.
지난 글에서 확산 모델의 샘플링이 미분방정식을 푸는 일이고, 그 방정식의 드리프트 안에 스코어, 곧 로그밀도의 기울기가 들어 있다는 것까지 정리했습니다. 이 글은 그 스코어 자리에 무엇을 대신 넣는지를 봅니다. 답을 먼저 적으면 guidance_scale은 두 스코어를 잇는 직선 위에서 얼마나 멀리 나가느냐를 정하는 값이고, 그 결과 모델이 실제로 뽑는 분포는 학습한 조건부 분포가 아니라 그것을 한 번 더 기울인 다른 분포입니다.
가이던스 한 줄
두 노이즈 예측
확산 모델의 신경망은 시각 의 잡음 섞인 이미지 를 받아 거기 섞인 노이즈 를 예측합니다. 조건부 모델은 프롬프트 도 함께 받습니다. classifier-free guidance는 같은 신경망에게 조건을 넣은 예측과 뺀 예측을 둘 다 구하게 한 뒤, 그 차를 부풀려 쓰는 방법입니다.
eps_uncond = unet(x_t, t, cond=null_embedding)
eps_cond = unet(x_t, t, cond=prompt_embedding)
eps_tilde = eps_uncond + w * (eps_cond - eps_uncond) # w = guidance_scale
식으로는 이렇습니다.
괄호 안의 차 는 「프롬프트를 알려 주었을 때 예측이 어느 쪽으로 얼마나 바뀌었는가」입니다. 조건이 아무 정보도 주지 않는 자리라면 이 차는 0이고, 그 자리에서는 를 얼마로 두든 결과가 같습니다. 가이던스가 움직이는 것은 조건이 무언가를 말하는 자리뿐입니다.
내삽과 외삽
이면 조건을 무시한 예측이고, 이면 조건부 예측 그대로입니다. 그 사이는 두 점을 잇는 선분 위의 내삽, 곧 두 값의 가중평균이고, 부터는 같은 직선을 선분 바깥까지 연장해 값을 읽는 외삽입니다. 실무에서 쓰는 7.5는 조건부 예측을 지나 여섯 배 반쯤 더 나간 지점입니다.
내삽은 두 예측이 모두 학습 데이터로 뒷받침되는 범위 안에 머뭅니다. 외삽은 그렇지 않습니다. 신경망은 자리의 노이즈를 한 번도 예측하도록 학습된 적이 없고, 그 값은 두 예측의 차가 직선으로 계속 이어진다는 가정 위에서만 뜻을 가집니다. 그 가정이 확률의 언어로 무엇을 뜻하는지가 뒤의 절들이 할 일입니다.
두 배의 계산
코드를 다시 보면 한 스텝에 신경망을 두 번 부릅니다. num_inference_steps=30이면 가이던스 없이 30번이면 될 호출이 60번이 됩니다. 샘플링 비용이 그대로 두 배이고, 확산 모델에서 비용의 거의 전부가 이 호출이라 체감도 두 배입니다.
실제 구현은 두 호출을 따로 하지 않고 배치로 묶습니다. 같은 를 두 벌 복사해 이어 붙이고, 조건 자리에는 빈 임베딩과 프롬프트 임베딩을 나란히 넣어 배치 크기 2로 한 번 돌린 뒤 결과를 반으로 가릅니다. GPU는 한 장을 돌리나 두 장을 돌리나 걸리는 시간이 크게 다르지 않은 경우가 많아 벽시계 시간은 두 배보다 덜 늘지만, 메모리와 연산량은 정확히 두 배입니다. 로 둘 때만 조건 없는 호출을 건너뛸 수 있고, 그때는 가이던스를 안 쓰는 것과 같습니다.
다른 예측 대상
신경망이 노이즈 대신 깨끗한 이미지 를 예측하게 학습된 모델도 있습니다. 가이던스를 노이즈에 걸었을 때와 예측에 걸었을 때 결과가 다를까요. 이므로 노이즈 예측에서 예측으로 가는 식은 다음과 같습니다.
이 식은 에 대해 일차이고 상수항 가 있습니다. 그런데 가이던스의 계수는 로 합이 1이라 상수항이 그대로 보존됩니다.
어느 쪽에 걸어도 같은 식입니다. 속도를 예측하는 모델도 와 예측의 일차 결합이라 마찬가지입니다. 가이던스는 예측 대상을 고르는 문제가 아니라 두 예측 사이의 직선을 어디까지 따라가느냐의 문제이고, 그래서 뒤에서 스코어로 바꿔 읽어도 잃는 것이 없습니다.
조건 없는 예측
조건 드롭아웃
조건 없는 예측 는 어디서 올까요. 조건 없는 모델을 따로 하나 더 학습시키면 비용이 두 배이고 두 모델의 오차 성질도 달라집니다. 실제로는 한 모델이 두 가지를 다 배우게 합니다. 학습 중에 일정한 확률로 프롬프트를 빈 조건 으로 바꿔 넣는 것이고, 이 조작을 조건 드롭아웃이라고 부릅니다. 확률은 흔히 10% 안팎으로 둡니다. 텍스트 조건이면 빈 문자열을 인코딩한 임베딩이 그 빈 조건입니다.
빈 조건이 붙은 10%의 학습 예시에서 신경망이 맞춰야 하는 것은 프롬프트 없이 본 노이즈 예측, 곧 조건 없는 분포의 스코어입니다. 나머지 90%에서는 조건부 스코어를 배웁니다. 같은 가중치가 입력의 조건 자리에 무엇이 들어왔느냐에 따라 두 함수를 번갈아 흉내 내게 되고, 추론 때 그 두 얼굴을 차례로 불러내는 것이 앞 절의 두 호출입니다.
이 비율에는 값이 따릅니다. 드롭아웃 비율을 너무 낮추면 조건 없는 예측이 학습 신호를 적게 받아 부정확해지고, 너무 높이면 조건부 예측이 그만큼 덜 배웁니다. 가이던스는 두 예측의 차를 배로 부풀리므로 어느 쪽의 오차든 함께 부풀어 나옵니다.
분류기 가이던스
이름의 'classifier-free'는 그 전에 있던 방법과 대비해 붙은 말입니다. 먼저 나온 분류기 가이던스는 조건 없는 확산 모델 옆에 분류기를 하나 따로 학습시키고, 그 분류기의 로그확률 기울기를 스코어에 더했습니다.
여기서 는 잡음 낀 이미지를 보고 그것이 부류 일 확률을 내는 분류기입니다. 깨끗한 이미지용 분류기로는 안 되고 모든 시각 의 잡음 수준에서 따로 동작하도록 학습해야 했습니다.
이 방법을 버린 이유는 셋입니다. 잡음 낀 입력용 분류기를 따로 만들어야 하고, 정해진 부류가 아니라 자유로운 문장을 조건으로 받는 분류기는 만들기 어렵고, 분류기의 기울기는 이미지를 실제로 그 부류답게 만들지 않고도 분류기만 속이는 방향을 가리킬 수 있습니다. classifier-free guidance는 분류기 없이 같은 신경망의 두 예측만으로 그 기울기를 대신합니다. 두 방법이 결국 같은 분포를 겨눈다는 것이 다음 절에서 드러납니다.
스코어 공간의 기울이기
스코어 변환
지난 글에서 정리한 관계를 다시 적습니다. 시각 의 주변분포 에 대해
입니다. 는 그 자리에서의 최적 노이즈 예측이고 는 그 시각의 잡음 크기입니다. 스코어는 로그밀도의 기울기, 즉 지금 위치에서 밀도가 가장 빠르게 커지는 방향이고, 노이즈 예측은 그 스코어에 를 곱한 것에 지나지 않습니다.
가이던스 식의 양변을 로 나누면 그대로 스코어의 식이 됩니다.
두 스코어의 차 는 조건이 가리키는 방향입니다. 프롬프트를 알려 주면 밀도가 커지는 쪽이 어느 쪽으로 틀어지는지를 벡터로 적은 것이고, 는 그 방향으로 조건 없는 스코어에서부터 얼마나 더 가느냐를 정합니다.
기하평균 기울이기
기울기는 선형이므로 계수를 로그 안으로 넣을 수 있습니다.
즉 샘플러가 따라가는 스코어는 어떤 분포의 스코어이고, 그 분포는 를 정규화한 것입니다. 두 밀도에 각각 지수 가중을 주어 곱하고 다시 정규화하는 이 조작을 두 분포의 기하평균 기울이기라고 부릅니다. 이면 말 그대로 가중 기하평균이고, 이면 한쪽 지수가 음수가 되어 조건 없는 분포로 나눠 주는 꼴이 됩니다.
이 조작이 손으로 끝까지 풀리는 분포의 무리가 있습니다. 밀도가 꼴로 적히는 분포의 무리를 지수족이라 하고, 그 지수 안의 계수 를 자연 파라미터라고 합니다. 두 분포가 같은 지수족에 있으면 기하평균 기울이기는 로그를 선형결합하는 일이므로 자연 파라미터를 로 섞는 것과 같고, 결과도 같은 지수족에 남습니다. 정규분포는 인 지수족이라 뒤에서 기울인 분포를 정확히 계산할 수 있습니다. 단, 둘째 성분이 음수로 남아야 적분이 되는 분포이고, 외삽은 이 조건을 깰 수 있습니다.
증거의 거듭제곱
베이즈 정리로 한 번 더 정리하면 더 읽기 좋아집니다. 이고 는 에 무관하므로 기울기에서 사라집니다.
이 한 줄이 이 글의 중심입니다. 분류기 가이던스의 스코어를 로그 안으로 넣어도 정확히 같은 가 나옵니다. classifier-free guidance는 분류기를 없앤 것이 아니라, 조건부와 조건 없는 모델의 비 에 숨어 있는 암묵적인 분류기를 쓰는 것입니다.
이면 그냥 베이즈 정리라 정확한 조건부 분포 가 나옵니다. 이면 조건이 맞다는 증거를 제곱해서 곱합니다. 프롬프트와 잘 맞는 는 가 1에 가까우니 제곱해도 별로 안 줄어듭니다. 입니다. 반쯤 맞는 는 로 180분의 1이 되고, 만 되어도 로 절반을 잃습니다. 어중간하게 맞는 것일수록 더 가파르게 사라지므로, 가이던스가 하는 일은 분포의 꼬리를 자르는 것입니다.
정확히 풀리는 두 경우
「꼬리를 자른다」는 말은 아직 느낌입니다. 손으로 끝까지 풀리는 경우 둘로 값을 재 봅니다. 정규분포 하나는 봉우리가 하나뿐이라 폭과 평균이 어떻게 움직이는지를 대표하고, 봉우리 둘은 가끔 나오던 다른 갈래가 어떻게 사라지는지를 대표합니다.
정규분포 하나
, 라고 두겠습니다. 조건이 붙으면 분포가 좁아지므로 입니다. 로그를 적어 봅니다.
의 이차식이니 이것도 정규분포입니다. 앞의 계수가 정밀도, 곧 분산의 역수이고, 일차항을 정밀도로 나눈 것이 평균입니다. 앞 절의 자연 파라미터를 섞은 결과와 같습니다.
로 값을 넣어 보겠습니다.
| 평균 | 표준편차 | |
|---|---|---|
| 1 | 2.000 | 1.000 |
| 2 | 2.118 | 0.728 |
| 4 | 2.182 | 0.522 |
| 8 | 2.215 | 0.372 |
| 16 | 2.233 | 0.264 |
두 가지가 동시에 벌어집니다. 첫째로 폭이 줄어듭니다. 가 커지면 이므로
로 처럼 줄어듭니다. 위 표의 자리에 넣으면 0.265가 나와 정확한 값 0.264와 소수 셋째 자리까지 맞습니다. 같은 프롬프트로 여러 장을 뽑았을 때 다 비슷해 보이는 이유가 이 식입니다. 를 네 배 올리면 다양성의 폭이 절반이 됩니다.
둘째로 평균이 조건부 평균을 지나칩니다. 극한을 취하면
입니다. 위 예에서는 입니다. 조건부 평균 2보다 12.5% 더 나간 자리에서 멈춥니다. 이것이 과포화의 정체입니다 — 「빨간 여우」의 빨강이 데이터에 있던 빨강의 평균이 아니라 그것보다 더 빨간 쪽으로 밀린 값이 됩니다.
넘어가는 정도는 조건이 얼마나 강하게 분포를 좁히느냐가 정합니다. 배율은 입니다.
| (조건 없는 폭) | (조건부 폭) | 평균이 넘어가는 배율 |
|---|---|---|
| 5 | 1 | 1.04배 |
| 3 | 1 | 1.125배 |
| 2 | 1 | 1.33배 |
| 1.5 | 1 | 1.80배 |
| 1.2 | 1 | 3.27배 |
조건이 분포를 별로 안 좁히는 축에서 과포화가 가장 심합니다. 프롬프트가 색을 강하게 정하는 축에서는 라 얌전하고, 프롬프트가 거의 정보를 안 주는 축(배경의 질감 같은 것)에서는 라 크게 밀립니다. 한 그림 안에서 어떤 부분은 멀쩡한데 어떤 부분만 타 보이는 이유입니다.
그렇다면 축마다 를 달리 주면 되지 않을까요. 와 를 축마다 알면 배율을 맞추는 를 거꾸로 풀 수 있습니다. 그런데 모델이 매 스텝 주는 것은 한 점에서의 스코어 벡터 두 개뿐입니다. 그 벡터에는 어느 방향으로 분포가 얼마나 넓은지, 곧 공분산이 적혀 있지 않습니다. 이미지의 축은 픽셀 수십만 개가 얽힌 방향이라 사람이 골라 줄 수도 없습니다. 그래서 실제 파이프라인은 스칼라 하나를 모든 방향에 똑같이 곱하고, 축마다 다른 과포화는 그 대가로 남습니다.
정밀도의 부호
정밀도 는 양수여야 합니다. 음수면 꼴이 되어 적분이 발산하고, 그것은 더 이상 확률분포가 아닙니다.
이면 가 커질수록 가 커지는 방향이라 항상 성립합니다. 그런데 조건부가 오히려 더 넓은 축()이 있으면 이야기가 달라집니다. 을 넣으면 이고, 에서 음수가 됩니다.
| 1.0 | 1.1 | 1.125 | 1.2 | 1.5 | |
|---|---|---|---|---|---|
| +0.111 | +0.022 | 0 | −0.067 | −0.333 |
실제 모델에서 이 상황은 드물지만 없지는 않습니다. 프롬프트가 어색해 조건부 예측이 조건 없는 예측보다 오히려 불확실한 자리, 학습 데이터가 얇아 조건부 스코어가 잘못 잡힌 자리가 그렇습니다. 그런 축에서는 외삽이 분포를 좁히는 게 아니라 밖으로 밀어내고, 화면에는 값이 범위를 벗어나 뭉개진 얼룩으로 나옵니다. 높은 에서 그림의 특정 부분만 깨지는 현상은 대개 이 자리입니다.
봉우리 둘
정규분포 하나로는 다양성이 사라지는 모습이 폭으로만 보입니다. 봉우리가 둘인 경우를 격자에서 직접 적분해 보겠습니다. 이고 조건부가 오른쪽 봉우리 이라고 두면, 기울인 분포는 다음과 같습니다.
import numpy as np
xs = np.linspace(-10, 12, 400001)
dx = xs[1] - xs[0]
gauss = lambda x, m, s: np.exp(-(x-m)**2 / (2*s*s)) / (s*np.sqrt(2*np.pi))
p_uncond = 0.5*gauss(xs, -2, 1) + 0.5*gauss(xs, 2, 1)
p_cond = gauss(xs, 2, 1)
for w in [1, 2, 5, 10]:
logp = (1-w)*np.log(p_uncond) + w*np.log(p_cond)
p = np.exp(logp - logp.max())
p /= p.sum() * dx
mean = (xs*p).sum() * dx
std = np.sqrt(((xs-mean)**2 * p).sum() * dx)
left = p[xs < 0].sum() * dx
print(f"w={w:4.1f} 평균 {mean:.4f} 표준편차 {std:.4f} x<0 질량 {left:.3e}")
w= 1.0 평균 2.0000 표준편차 1.0000 x<0 질량 2.275e-02
w= 2.0 평균 2.0710 표준편차 0.9366 x<0 질량 5.800e-03
w= 5.0 평균 2.1394 표준편차 0.8889 x<0 질량 3.216e-04
w=10.0 평균 2.1907 표준편차 0.8586 x<0 질량 5.461e-06
폭이 1.00에서 0.86으로 주는 동안 0보다 왼쪽, 곧 조건 없는 분포라면 다른 봉우리가 차지했을 쪽으로 새던 질량은 2.3%에서 0.0005%로 4천 배 줄었습니다. 평균 이동은 0.19로 작고 폭 감소도 14%뿐인데 한쪽 끝은 사실상 비어 버립니다. 세 지표가 같은 속도로 움직이지 않는다는 점이 중요합니다.
실제 이미지에서 봉우리 둘에 해당하는 것은 한 프롬프트가 두 가지로 읽히는 경우입니다. 「a bat」가 박쥐로도 야구 방망이로도 그려질 수 있는 식입니다. 조건부 분포 자체에 소수 해석이 섞여 있다고 두고 로 바꾸어 보면, 봉우리가 충분히 떨어져 있을 때 각 봉우리 근처에서 비 는 거의 상수라 왼쪽에서 0.2, 오른쪽에서 1.8입니다. 기울인 분포는 이므로 두 봉우리의 무게 비는 가 됩니다. 에서 1대 9이던 것이 에서 1대 81, 에서 1대 729이고, 에서는 라 1대 1,400만쯤입니다. 봉우리를 ±4로 벌려 격자로 확인하면 소수 쪽 질량이 에서 1.22%, 에서 0.137%로 이 어림과 맞습니다. 폭을 좁히는 것과 별개로 한 해석을 통째로 지우는 이 현상을 모드 소실이라 부릅니다.
봉우리 간격
두 경우는 따로 떨어진 이야기가 아니라 봉우리 사이 간격이라는 손잡이 하나의 양 끝입니다. 조건 없는 분포를 , 조건부를 로 두고 앞의 격자 적분을 만 바꿔 되풀이하면 에서 다음이 나옵니다.
| 조건 없는 분포의 봉우리 | 평균이 를 넘는 양 | 질량 | |
|---|---|---|---|
| 2 | 둘 | 0.169 | 4.0e-05 |
| 1.5 | 둘 | 0.391 | 1.6e-04 |
| 1.25 | 둘 | 0.553 | 3.2e-04 |
| 1 | 하나(꼭대기가 평평) | 0.749 | 7.2e-04 |
| 0.75 | 하나 | 0.971 | 1.9e-03 |
| 0.5 | 하나 | 1.173 | 7.5e-03 |
같은 분산의 정규분포 둘을 반씩 섞은 분포는 두 평균의 간격이 표준편차의 두 배를 넘을 때만 봉우리가 둘이고, 여기서는 이 그 경계입니다. 봉우리가 뚜렷이 떨어져 있는 동안 가이던스의 효과는 반대편을 지우는 쪽에 몰리고 평균은 조금만 넘어갑니다. 경계를 지나 둘이 하나로 합쳐지면 지울 반대편이 없어지는 대신 평균이 넘어가는 양이 0.17에서 1.17까지 커집니다. 에서 조건 없는 분포를 분산 1.25의 정규분포 하나로 보고 앞의 정규분포 식에 넣으면 평균이 1.63으로, 격자 값 1.67에 가깝습니다. 봉우리가 합쳐지면 문제가 모드 소실에서 과포화로 넘어간다는 뜻입니다.
같은 식의 변형
실무의 가이던스 옵션 대부분은 새 방법이 아니라 지금까지 본 한 줄의 어느 자리를 바꾼 것입니다.
부정 프롬프트
조건 없는 예측 자리에 빈 조건 대신 피하고 싶은 조건 를 넣는 것이 부정 프롬프트입니다. 식은 로 바뀌고, 같은 유도를 따라가면 기울인 분포가 이렇게 됩니다.
의 증거는 제곱으로 올리고 의 증거는 제곱으로 나눕니다. 「흐릿한」「손가락이 여섯 개」 같은 부정 프롬프트가 그 성질을 가진 를 거듭제곱으로 눌러 버리는 것이 이 식입니다.
정규분포로 재 보면 성질이 하나 더 보입니다. , 처럼 둘의 폭이 같으면 정밀도가 로 그대로라 폭은 전혀 안 줄고, 평균만 로 움직여 에서 28이 됩니다. 앞에서 폭이 줄어든 것은 조건 없는 분포가 조건부보다 넓었기 때문이었습니다. 부정 프롬프트의 분포가 조건 없는 분포만큼 넓지 않으면 가이던스는 좁히는 힘을 잃고 미는 힘만 남습니다. 같은 라도 빈 조건 자리에 무엇을 넣느냐에 따라 전혀 다른 크기로 작용한다는 뜻입니다.
가이던스 스케줄
를 모든 스텝에 같은 상수로 둘 이유는 없습니다. 시각 에 따라 를 바꾸는 것을 가이던스 스케줄이라 하고, 흔한 모양은 잡음이 큰 초반에 낮게 두었다가 뒤로 갈수록 올리는 것입니다.
이유는 샘플링이 거치는 순서에 있습니다. 잡음이 큰 초반에는 이미지의 큰 구도, 곧 어느 봉우리로 갈지가 정해지고, 잡음이 작은 후반에는 이미 정해진 봉우리 안에서 세부만 다듬어집니다. 앞 절의 모드 소실은 봉우리를 고르는 단계의 일이니, 그 구간에서 를 낮추면 소수 해석이 살아남을 여지가 남습니다. 봉우리가 정해진 뒤에 를 올리면 폭을 좁혀 선명하게 하는 쪽의 효과만 남깁니다. 다양성과 프롬프트 충실도를 한 숫자로 맞바꾸던 것을 시간 축에 나눠 싣는 셈입니다.
동적 임계
가 크면 스텝마다 만든 의 값이 학습 데이터의 범위, 예를 들어 을 크게 벗어납니다. 과포화와 정밀도 부호에서 본 밀어내기가 픽셀 값으로 드러나는 자리입니다. 동적 임계는 매 스텝 의 절댓값에서 높은 분위수(예를 들어 99.5%) 를 구하고, 이면 로 자른 뒤 로 나눠 범위 안으로 되돌리는 조작입니다. 단순히 로 잘라 버리면 넘친 픽셀이 전부 같은 값으로 뭉개지는데, 분위수로 나누면 넘친 정도에 따라 크기를 줄이면서 서로의 차이는 남깁니다.
이것으로 화면은 살아납니다. 타 버린 색이 가라앉고 높은 를 쓸 여유가 생깁니다. 그러나 그것은 가이던스가 만든 분포를 고치는 것이 아니라 그 분포에서 나온 값을 되접는 것입니다. 평균이 조건부 평균 너머로 밀리는 것도, 소수 해석이 지워지는 것도 스코어 단계에서 이미 일어났고, 임계는 그 뒤의 값 범위만 다룹니다. 그래서 동적 임계를 켠 채 를 올리면 색은 멀쩡해도 다양성은 여전히 사라집니다.
7.5가 정하는 것
스텝마다의 누적
지금까지 계산한 것은 한 시각의 분포 를 한 번 기울인 결과였습니다. 샘플러는 이것을 모든 스텝에서 되풀이합니다. 그리고 매 스텝 기울인 분포들을 이어 붙인 결과는 끝 분포 를 한 번 기울여 얻은 분포와 정확히 같지 않습니다.
앞의 정규분포 예에 분산 만큼의 잡음을 더해 보면 이유가 보입니다. 잡음이 섞이면 조건 없는 분포는 , 조건부는 가 되어 둘의 폭이 비슷해집니다. 과포화 배율 표에서 본 대로 폭이 비슷할수록 평균이 더 멀리 밀립니다. , 에서 기울인 는 평균 3.0, 분산 1.0입니다. 반면 한 번 기울인 에 같은 잡음을 더하면 평균 2.21, 분산 4.15이니 전혀 다른 분포를 겨누고 있습니다. 잡음이 큰 스텝일수록 가이던스가 더 세게 작용한다는 뜻이고, 앞 절의 가이던스 스케줄이 초반을 낮추는 것과 같은 방향의 이야기입니다.
이 예에서 지난 글의 확률 흐름 ODE를 매 스텝 기울인 스코어로 끝까지 수치 적분하면, 에서 평균 약 2.42, 표준편차 0.333이 나옵니다. 한 번 기울인 분포의 2.118, 0.728보다 훨씬 좁고 더 멀리 가 있습니다. 에서는 표준편차가 0.001도 안 됩니다. 앞의 표들은 가이던스가 어느 쪽으로 미는지를 정확히 보여 주지만, 실제 샘플러에서 효과의 크기는 그 누적이라 더 클 수 있습니다. 확률적 샘플러는 스텝마다 잡음을 새로 넣어 이 누적을 얼마간 흩어 놓으므로 값이 또 달라집니다.
지수로서의 w
guidance_scale=7.5로 돌아가면 그 숫자가 무엇을 정하는지 말할 수 있습니다. 그것은 선명도 손잡이가 아니라 지수입니다. 모델이 학습한 것은 인데, 매 스텝 샘플러가 겨누는 것은 입니다. 조건의 증거를 7.5제곱하니 프롬프트를 어중간하게 만족하는 그림이 지워지고, 남은 것들만 보니 선명해 보입니다. 같은 조작이 폭을 로 줄여 다양성을 없애고, 평균을 조건부 평균 너머로 밀어 색을 태우고, 두 가지로 읽히는 프롬프트에서 한쪽 해석을 지웁니다. 넷은 부작용이 아니라 같은 한 식의 여러 얼굴입니다.
그리고 를 올려도 나아지지 않는 자리가 있습니다. 조건부 스코어 자체가 틀린 곳입니다. 틀린 방향으로 7.5배 밀면 더 확실하게 틀립니다.
w를 재는 법
그래서 좋은 는 모델이 아니라 원하는 것이 정합니다. 프롬프트를 정확히 따르는 한 장이 필요하면 높이고, 여러 장을 뽑아 고를 생각이면 낮춰야 합니다. 고르기 전에 잴 것은 한 프롬프트로 여러 장을 뽑아 폭과 모드 소실을 따로 보는 것입니다. 봉우리 둘의 계산에서 폭은 14% 줄 때 소수 쪽은 4천 배 줄었으므로, 이미지끼리의 평균 거리 같은 폭의 지표 하나로는 모드 소실을 못 봅니다. 두 가지로 읽히는 프롬프트를 몇 개 골라 마다 수십 장씩 뽑고, 소수 해석이 몇 장 나오는지를 따로 세야 합니다.
모델마다 좋은 가 다른 것도 같은 식으로 설명됩니다. 가이던스는 두 예측의 차를 부풀리므로 그 차가 얼마나 정확한지에 모든 것이 걸려 있습니다. 조건 드롭아웃 비율이 다르면 조건 없는 예측의 정확도가 다르고, 학습 데이터와 텍스트 인코더가 다르면 조건부 스코어의 정확도가 다릅니다. 두 스코어의 차가 정확한 모델은 적은 로도 조건을 충분히 따르고, 차가 흐릿한 모델은 같은 효과를 내려고 더 큰 가 필요하지만 그만큼 오차도 커집니다. 한 모델에서 좋았던 7.5를 다른 모델에 그대로 옮기면 안 되는 이유입니다.
정리
- 가이던스 한 줄 은 두 예측을 잇는 직선 위의 외삽이다. 이 조건부 그대로이고 그 너머가 선분 밖이다. 신경망을 두 번 부르므로 비용이 두 배이고, 계수의 합이 1이라 노이즈에 걸든 에 걸든 같다.
- 조건 없는 예측은 학습 때 조건을 10% 안팎의 확률로 빼는 조건 드롭아웃에서 온다. 분류기를 따로 두지 않지만 조건부와 조건 없는 모델의 비가 암묵적인 분류기 노릇을 한다.
- 을 스코어로 바꾸면 , 곧 조건의 증거를 제곱한 분포다. 정규분포에서는 자연 파라미터의 선형결합으로 정확히 풀린다.
- 정규분포에서 폭은 처럼 줄고 평균은 까지 넘어간다. 조건이 폭을 별로 안 줄이는 축일수록 과포화가 심하고, 조건부가 더 넓은 축에서는 분포이기를 그만둔다.
- 봉우리가 둘이면 소수 해석의 무게가 제곱으로 준다. 봉우리가 합쳐지면 모드 소실 대신 과포화가 커진다.
- 부정 프롬프트·가이던스 스케줄·동적 임계는 같은 식의 조건 없는 자리··결과 값을 바꾼 것이다. 임계는 값을 되접을 뿐 기울인 분포를 고치지 않는다.
- 스텝마다 기울인 효과는 누적되어 한 번 기울인 분포보다 더 좁고 멀리 갈 수 있다. 조건부 스코어가 틀린 자리에서 를 올리는 것은 틀린 방향으로 더 멀리 가는 일이다.
읽어주셔서 감사합니다. 😊

