자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| p(밝음 ∣ 낮)을 p(낮 ∣ 밝음)으로 읽음 | 1 | 방향이 반대다. 베이즈 정리로 p(낮)과 p(밝음)을 함께 넣어 뒤집는다 |
| 두 무리를 섞은 분포의 바늘을 처음 비중대로 섞음 | 2 | 그 자리에서 무리마다 왔을 확률(책임도)로 섞는다 |
| 조건부 스코어로 걸으면 애매한 그림이 나오지 않는다고 봄 | 3 | 조건부 분포를 그대로 재현할 뿐이다. 조건부 분포에 애매한 그림이 원래 들어 있다 |
| 확률을 그대로 곱하거나 더해 증거를 쌓음 | 4 | 비(승산)를 곱한다. 확률을 w제곱하면 같은 증거를 w번 센 셈이다 |
| 배율을 올리면 평균만 옮겨 간다고 봄 | 5 | 분포가 좁아진다. 다양성을 내주고 조건다움을 얻는다 |
| 깨끗한 그림으로 배운 분류기를 가이던스에 그대로 씀 | 6 | 잡음 섞인 그림에서 근거 없는 기울기를 낸다. 잡음 수준마다 그 수준의 그림으로 배운 분류기가 필요하다 |
| 세기(배율)를 결과에 곱함 | 7 | 원본(빈 조건)에서 차이만 늘린다. 0이면 원본, 1이면 조건부 |
| 가이던스가 조건부 분포의 평균까지만 민다고 봄 | 8 | 겨냥하는 분포의 평균은 조건 너머까지 간다. 조건부 분포가 더 넓은 방향이 있으면 분포가 아니게 된다 |
| cfg 1에서도 신경망을 두 번 부른다고 봄 | 9 | 빈 조건 예측이 식에서 지워지므로 ComfyUI는 부르지 않는다 |
| 부정 프롬프트가 배율 1에서도 듣는다고 봄 | 10, 12 | 배율 1이면 빈 조건 자리가 식에서 지워진다. 배율이 1을 넘어야 피할 것에서 멀어진다 |
| 부정 프롬프트는 피할 것만 지운다고 봄 | 11, 12 | 같은 배율로 반대쪽에서 민다. 밀리는 거리는 (배율 − 1) × 두 분포의 거리다 |
| 범위로 잘라 넣으면 과포화가 사라진다고 봄 | 13 | 끝값에 몰린 칸들은 구별되지 않는다. 날아간 것이 범위 안에 쌓일 뿐이다 |
| 모든 잡음 수준에서 가이던스가 같은 일을 한다고 봄 | 14 | 짙은 잡음에서는 두 예측 차이가 커서 구름 전체를 옮기고, 옅은 잡음에서는 폭을 조인다 |
| 원래 그림에 배율 1을 걸면 가이던스가 없다고 봄 | 15 | 다시 섞는 잡음을 빈 조건에서 읽으면 그것만으로 조건 쪽으로 밀린다 |
요약
조건을 넣고 배운 바늘, 곧 조건부 스코어는 베이즈 정리로 s(xₜ ∣ y) = s(xₜ) + ∇ log pₜ(y ∣ xₜ)로 갈라진다. 이 바늘로 걸으면 조건이 붙은 분포가 그대로 나오고, 거기에는 애매한 그림이 원래 들어 있다. 분류기 가이던스는 잡음 섞인 그림으로 따로 배운 분류기의 바늘을 배율 w만큼 더해 p(x) p(y ∣ x)^w를 겨냥한다. 같은 증거를 w번 센 셈이라 조건다움은 오르고 다양성은 준다. 분류기 없는 가이던스는 학습 때 조건을 10%쯤 지워 한 신경망이 조건부 예측과 조건 없는 예측을 함께 배우게 하고, 걸음마다 두 번 읽어 x̂₀(∅) + w(x̂₀(c) − x̂₀(∅))로 섞는다. 두 예측의 차이가 분류기의 바늘 자리에 들어간다. 부정 프롬프트는 빈 조건 자리에 피할 글을 넣어 p(x ∣ c⁺)^w / p(x ∣ c⁻)^(w − 1)을 겨냥하며, 배율 1에서는 듣지 않고 1을 넘으면 같은 배율로 반대쪽에서 민다. 배율을 키우면 짙은 잡음에서 두 예측의 큰 차이가 길 전체를 데이터 범위 밖으로 끌고 가 과포화가 생기고, 잘라내기, 크기 다시 맞추기, CFG++, 구간 좁히기, APG가 각자 다른 곳을 원인으로 보고 이를 줄인다.
flowchart LR A["조건부 스코어<br/>s(x | y) = s(x) + ∇ log p(y | x)<br/>애매한 그림도 그대로"] --> B["분류기 가이던스<br/>s(x) + w ∇ log pφ(y | x)<br/>분류기를 따로 배움"] B --> C["분류기 없는 가이던스<br/>조건을 10% 지우며 배우기<br/>x̂₀(∅) + w(x̂₀(c) − x̂₀(∅))"] C --> D["부정 프롬프트<br/>빈 조건 자리에 피할 글<br/>w > 1 에서만 듣는다"] C --> E["배율을 키우면<br/>짙은 잡음에서 크게 밀려<br/>과포화, 다양성 감소"] E --> F["대책<br/>잘라내기 · 다시 맞추기<br/>CFG++ · 구간 · APG"] C --> G["가이던스 증류<br/>배율을 입력으로, 호출 한 번"]
막힌 곳
이제 조건 쪽으로 얼마나 세게 끌지 고를 수 있다. 걸음마다 조건을 넣은 예측과 빈 조건의 예측을 읽고, 그 차이를 배율만큼 키우면 된다. 피할 것을 빈 조건 자리에 넣을 수도 있고, 배율을 너무 키우면 무엇이 무너지는지도 안다.
그런데 이 장의 조건은 「낮」「성」「안개」 같은 라벨이었고, 라벨마다 벡터를 하나씩 두는 표로 신경망에 넣었다. 가이던스가 미는 방향은 조건을 넣은 예측과 넣지 않은 예측의 차이이고, 그 차이는 조건이 신경망 안에서 어떤 벡터로 들어갔느냐에 달려 있다. 프롬프트는 라벨 몇 개가 아니라 「파란 공 위의 빨간 정육면체」처럼 끝없이 많은 문장이다. 문장을 어떤 벡터로 바꿔 넣어야, 신경망이 그 문장을 비슷하지만 다른 문장과 가려 읽을 수 있을까? 두 문장이 거의 같은 벡터가 된다면, 배율을 아무리 키워도 어느 쪽 그림을 그려야 할지는 정해지지 않는다.