자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 오일러 걸음을 나눠 붙이는 이자처럼 「늘 정확히 맞는」 계산으로 봄 | 1 | 구간 처음의 기울기로만 가므로 늘 한쪽으로 틀린다. 걸음을 두 배로 늘리면 오차가 절반으로 준다 |
| 1걸음 오일러 결과를 표본으로 봄 | 2, 3 | 0까지 한 번에 가는 오일러 걸음은 x̂₀, 곧 평균으로 뛴다. 짙은 잡음의 평균은 봉우리 사이 빈 땅이다 |
| 새 잡음을 넣는 샘플러가 오일러의 좁게 뭉침을 메워 준다고 봄 | 4 | 새 잡음은 x̂₀ 를 원래 그림이라고 놓고 계산한 분산만 채운다. 원래 그림의 불확실함 몫이 빠져 걸음이 크면 더 좁게 뭉친다 |
| 같은 시드면 걸음 수를 바꿔도 앤세스트럴 그림이 거의 같다고 봄 | 5 | 걸음마다 새로 섞는 잡음이 도착점을 함께 정한다. 걸음 수를 바꾸면 그 잡음이 섞이는 자리와 크기가 바뀐다 |
| 서로 상관없는 흔들림의 크기를 그대로 더함 | 6 | 분산이 더해진다. σ_down² + σ_up² = σ′² |
| DDIM 과 오일러가 다른 걸음이라고 봄 | 7 | 원래 그림과 잡음을 읽어 다음 수준의 비율로 다시 섞는 같은 걸음이다. 눈금을 바꿔도 같다 |
| 어느 η 가 언제나 가장 좋다고 봄 | 8 | 걸음이 넉넉하면 모든 η 가 같은 분포로 간다. 걸음이 적을 때 어긋나는 모양만 다르다 |
| 걸음 끝의 기울기를 이미 안다고 봄 | 9 | 호인은 먼저 오일러로 가 본 자리에서 기울기를 다시 읽는다. 그만큼 신경망을 한 번 더 부른다 |
| 2차 방법은 걸음이 적어도 늘 낫다고 봄 | 10, 11 | 차수는 걸음이 충분히 작을 때의 이야기다. 아주 큰 걸음 끝에서 읽은 기울기는 걸음 전체를 대표하지 못한다 |
| 걸음 수만 같으면 공평한 비교라고 봄 | 11 | 생성 시간은 신경망 호출 수가 정한다. 호인은 걸음마다 두 번 부른다 |
| 평균 거리가 크면 분포도 나쁘다고 봄 | 11 | 다른 봉우리로 간 점이 많으면 분포는 멀쩡해도 거리가 크다. 같은 출발에서 다른 그림이 나온 것이다 |
| 걸음을 디딜 잡음 크기를 고르게 나눔 | 12 | 잡음 크기는 500배 넘게 걸쳐 있다. 고르게 나누면 작은 잡음 쪽이 비어 버린다 |
| ρ 를 키우면 걸음이 모두 가장 작은 잡음에 붙는다고 봄 | 13 | ρ → ∞ 이면 log σ 를 고르게 나눈 일정이 된다 |
| 시간 밀기를 시간에 대한 임의의 변형으로 봄 | 14 | 신호로 나눈 잡음 크기를 m 배 하는 것, log σ 눈금을 log m 만큼 옮기는 것이다 |
| 잡음과 그림을 아무렇게나 짝지어 한 번에 배우면 된다고 봄 | 15 | 입력이 정답을 정하지 않으면 제곱 오차의 답은 평균이다. 결정적인 길이 지어 준 짝으로 배운다 |
| 표본이 좋은 샘플러가 증류의 좋은 선생이라고 봄 | 16 | 학생은 출발 잡음의 함수만 외운다. 걸음마다 새 잡음을 넣는 선생은 외울 거리를 주지 않는다 |
요약
잡음에서 데이터로 가는 길을 잡음 크기 σ로 적으면, 길의 기울기는 그 자리에서 읽은 잡음 ε̂ = (x − x̂₀)/σ이다. 오일러 방법은 이 기울기로 다음 잡음 크기까지 곧게 가는 걸음으로, 읽은 원래 그림과 잡음을 다음 수준의 비율로 다시 섞는 것과 같고, 걸음을 두 배로 늘리면 오차가 절반이 된다. 0까지 한 번에 가는 오일러 걸음은 평균 x̂₀로 뛴다. 앤세스트럴 샘플링은 걸음마다 읽은 잡음의 일부를 덜어 내고 새 잡음으로 채워(σdown = σ′²/σ, σup² = σ′² − σdown²) 앞 걸음의 어긋남을 흐리지만, 걸음 수를 바꾸면 같은 시드에서도 다른 그림이 나온다. DDIM은 새 잡음의 몫을 다이얼 η로 잇는 가족이고, η = 0이 오일러, η = 1이 앤세스트럴이다. 2차 방법은 걸음을 두 배로 늘리면 오차가 4분의 1로 준다. 호인은 걸음 끝에서 신경망을 한 번 더 부르고, DPM-Solver++ 2M은 지난 걸음의 x̂₀를 늘여 써서 한 번만 부른다. 걸음 일정은 걸음을 디딜 잡음 크기를 정하며, 길이 휘는 곳(데이터의 무늬가 고르는 곳)에 걸음을 몰아야 한다. 증류는 결정적인 길이 출발 잡음마다 정해 주는 끝을 학생 신경망이 한 번에 내도록 배운다.
flowchart LR A["길: dx/dσ = ε̂<br/>(읽은 잡음)"] --> B["오일러<br/>x̂₀ + σ′ε̂ 로 다시 섞기<br/>걸음 ×2 → 오차 ÷2"] B --> C["앤세스트럴<br/>σ_down 까지 + 새 잡음 σ_up"] B --> D["DDIM 다이얼 η<br/>0 = 오일러, 1 = 앤세스트럴"] C --> D B --> E["2차 방법<br/>호인: 한 번 더 묻기<br/>2M: 지난 x̂₀ 다시 쓰기"] E --> F["걸음 일정<br/>길이 휘는 곳에 걸음을 몬다<br/>(karras ρ, 시간 밀기 m)"] B --> G["증류<br/>결정적인 길의 끝을<br/>학생이 한 번에"]
막힌 곳
이제 하나의 길을 몇 걸음에 어떻게 걸을지 고를 수 있다. 오일러에서 2M까지, 잡음을 넣는 걸음과 넣지 않는 걸음, 걸음을 디딜 자리, 한 번에 가는 학생까지.
그런데 이 장의 모든 걸음은 신경망이 x̂₀를 읽어 준다는 데 기댔다. 그 신경망은 잡음 섞인 그림을 받아 그림 전체를 보고 원래 그림을 짐작해야 한다. U-Net은 해상도를 낮춰 멀리 보았지만, 출력 한 칸이 기대는 몫은 여전히 가운데 이웃에 몰렸고, 실제 모델은 멀리 떨어진 칸끼리 직접 읽는 부품을 따로 끼워 그 빈틈을 메웠다. 멀리 떨어진 칸끼리 한 번에 서로를 읽게 하는 그 부품은 어떻게 생겼을까?