자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 서로 상관없는 두 흔들림의 표준편차를 그대로 더함 | 1, 4 | 더해지는 것은 분산이다. 표준편차가 그대로 더해지는 것은 둘이 늘 같은 쪽으로 움직일 때뿐이다 |
| 잡음 한 걸음의 크기를 시간 간격에 비례하게 잡음 | 2 | 그러면 걸음을 잘게 나눌수록 잡음이 사라진다. 한 걸음의 분산이 시간 간격에 비례해야 하므로 크기는 √Δt에 비례한다 |
| 픽셀마다 σ인 잡음이면 그림 전체도 σ쯤 움직인다고 봄 | 3 | d개 숫자의 거리는 σ√d다. 3072차원에서 σ = 1이면 원래 그림에서 55.4 떨어진 얇은 껍질 위에 놓인다 |
| 그림과 잡음을 더한 벡터의 길이를 길이끼리 더해 구함 | 3 | 거의 직각인 두 벡터라 제곱이 더해진다 |
| 두 점의 봉우리가 종의 폭이 두 점 사이 거리만큼 넓어져야 합쳐진다고 봄 | 5 | 한가운데의 두 번 미분이 0이 되는 때로 정해진다. 두 점 ±2이면 σ = 2, 각 점에서 한가운데까지의 거리다 |
| 블러와 잡음 섞기를 같은 일로 봄 | 6 | 블러는 그림 한 장의 밝기가 픽셀 평면에서 퍼지는 것이라 그림 안의 차이를 줄이고, 잡음 섞기는 그림들의 확률이 데이터 공간에서 퍼지는 것이라 그림 안의 차이를 늘린다 |
| 무늬가 n배 가늘면 n배 빨리 지워진다고 봄 | 7, 8 | 배율의 지수에 k²가 들어 있다. 파장이 5분의 1이면 같은 만큼 지워지는 시간은 약 25분의 1이다 |
| 잡음이 모든 픽셀에 고르게 섞였으니 모든 무늬가 똑같이 망가진다고 봄 | 9 | 잡음의 세기는 파장마다 같지만 그림의 세기는 가는 무늬일수록 약하다. 가는 무늬부터 묻힌다 |
| 진하기(신호로 나눈 잡음 크기)를 양(α, σ의 크기)으로 견줌 | 10 | 알아볼 수 있는 정도는 σ/α 하나가 정한다. α로 나누면 모든 일정이 분산 폭발의 꼴이 된다 |
| 직선 일정도 분산을 지킨다고 봄 | 11 | 분산은 α² + σ²다. 직선 일정은 t = 0.5에서 분산이 0.5로 줄어든다 |
| 마지막 걸음의 β만 보고 그림이 많이 남았다고 봄 | 12 | 남는 비율은 모든 걸음의 (1 − β)를 곱한 것이다. DDPM은 마지막에 0.64%만 남는다 |
요약
그림에 서로 상관없는 정규분포 잡음을 여러 번 더하면 분산이 더해진다. 그래서 잡음을 잘게 나눠 쌓아도 한 번에 섞어도 같은 분포가 나오고, 학습 코드는 잡음 수준을 뽑아 한 번만 섞는다. 이 장의 기본 일정에서 잡음은 xₜ = x₀ + σₜε, σₜ² = 2Dt로 쌓인다. 그림들을 모아 놓은 분포는 이웃 평균, 곧 열 방정식 ∂pₜ/∂t = D∇²pₜ를 따라 퍼지고, 그 답은 데이터의 점마다 가우시안 종을 씌워 더한 것(데이터 분포와 가우시안의 합성곱)이다. 분포를 물결무늬로 쪼개면 파수 k인 무늬가 e^(−Dk²t)배로 줄어들어, 촘촘한 구조가 먼저 지워지고 굵은 구조가 가장 오래 남는다. 그림 한 장에서도 가는 무늬가 먼저 잡음에 묻힌다. 잡음 일정은 xₜ = αₜx₀ + σₜε의 αₜ와 σₜ를 정하는 시간표이고, 분산 폭발·분산 보존·직선 일정은 αₜ로 나누면 모두 잡음 크기가 σₜ/αₜ(신호로 나눈 잡음 크기)인 분산 폭발의 꼴이 된다.
flowchart LR A["잡음 한 걸음<br/>x + √(2DΔt)·ε"] -->|"분산이 더해진다"| B["한 번에 섞기<br/>xₜ = x₀ + σₜε, σₜ² = 2Dt"] B -->|"분포로 모으면"| C["열 방정식<br/>∂pₜ/∂t = D∇²pₜ"] C -->|"물결무늬로 쪼개면"| D["푸리에 성분<br/>e^(−Dk²t)배: 촘촘한 것부터"] B -->|"αₜ로 나누면"| E["잡음 일정<br/>분산 폭발 · 분산 보존 · 직선<br/>= σₜ/αₜ 하나로 읽는다"]
막힌 곳
이제 그림을 망가뜨리는 길은 완전히 안다. 어느 잡음 수준이든 식 한 줄로 바로 만들 수 있고, 그 길에서 분포가 어떤 규칙으로 퍼지며 무엇이 먼저 지워지는지도 안다. 남은 일은 그 길을 거꾸로 걷는 것이다.
그런데 거꾸로 걸으려면 잡음 섞인 그림을 읽고 「어느 쪽으로 고쳐야 할지」를 내놓는 신경망이 있어야 한다. 가로세로 수백 픽셀 그림이면 입력 숫자가 수십만 개다. 숫자마다 모든 숫자를 보는 신경망으로 그런 그림을 읽을 수 있을까? 이 장에서 분포를 퍼뜨린 이웃 평균은 각 칸이 바로 옆 칸만 보았는데, 그림을 읽는 쪽도 이웃만 보면 안 될까? 그리고 망가뜨리기가 식 한 줄이었다면, 되돌리기도 그 식을 거꾸로 풀기만 하면 될까?