자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 서로 상관없는 두 흔들림의 표준편차를 그대로 더함 | 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%만 남는다 |
| 마지막 걸음에 남은 그림은 픽셀마다 잡음에 묻히니 상관없다고 봄 | 13 | 픽셀 d개를 평균 내면 잡음은 1/√d로 줄지만 밝기 신호는 줄지 않는다. SD 1.x 마지막 걸음에서 밝기 분산의 75%가 읽히고, 순수 잡음에서 만든 그림은 밝기 폭이 절반(0.199)이 된다 |
| 끝 신호 0 일정에도 잡음을 맞히는 출력을 그대로 씀 | 14 | 마지막 걸음의 입력이 잡음 그 자체라 맞히기가 받은 것을 그대로 내놓는 일이 되고, 원래 그림으로 되돌리는 식은 0/0이 된다 |
| 일정만 끝 신호 0으로 고치면 된다고 봄 | 15 | 샘플러가 마지막 걸음에서 출발하지 않으면(맨 앞부터 고른 10걸음의 첫 걸음 901) 밝기 폭이 다시 0.233으로 준다 |
요약
그림에 서로 상관없는 정규분포 잡음을 여러 번 더하면 분산이 더해진다. 그래서 잡음을 잘게 나눠 쌓아도 한 번에 섞어도 같은 분포가 나오고, 학습 코드는 잡음 수준을 뽑아 한 번만 섞는다. 이 장의 기본 일정에서 잡음은 xₜ = x₀ + σₜε, σₜ² = 2Dt로 쌓인다. 그림들을 모아 놓은 분포는 이웃 평균, 곧 열 방정식 ∂pₜ/∂t = D∇²pₜ를 따라 퍼지고, 그 답은 데이터의 점마다 가우시안 종을 씌워 더한 것(데이터 분포와 가우시안의 합성곱)이다. 분포를 물결무늬로 쪼개면 파수 k인 무늬가 e^(−Dk²t)배로 줄어들어, 촘촘한 구조가 먼저 지워지고 굵은 구조가 가장 오래 남는다. 그림 한 장에서도, 세기 스펙트럼이 평평한 잡음 아래 내리막인 그림의 가는 무늬가 먼저 묻힌다. 그래서 잡음 수준마다 살아남는 대역이 다르다. 짙은 잡음에는 구도만, 옅은 잡음에는 결까지 남아, 잡음 수준이 그림의 특징을 굵기별로 갈라 놓는다. 잡음 일정은 xₜ = αₜx₀ + σₜε의 αₜ와 σₜ를 정하는 시간표이고, 분산 폭발·분산 보존·직선 일정은 αₜ로 나누면 모두 잡음 크기가 σₜ/αₜ(신호로 나눈 잡음 크기)인 분산 폭발의 꼴이 된다. 흔히 쓰는 일정은 마지막 걸음에도 그림을 조금 남겨(SD 1.x 에서 αₜ = 0.068), 픽셀을 모두 평균 낸 밝기 같은 가장 굵은 무늬가 새어 나간다. 순수 잡음에서 출발하는 생성과 어긋나지 않으려면 일정을 끝 신호 0으로 맞추고, 샘플러도 마지막 걸음에서 출발해야 한다.
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)배: 촘촘한 것부터"] D -->|"그림 한 장에서는"| F["잡음 수준마다 살아남는 대역<br/>짙으면 구도, 옅으면 결까지"] B -->|"αₜ로 나누면"| E["잡음 일정<br/>분산 폭발 · 분산 보존 · 직선<br/>= σₜ/αₜ 하나로 읽는다"] E -->|"마지막 걸음에서"| G["끝 신호 0<br/>α_T = 0: 학습의 끝 = 생성의 출발"]
막힌 곳
이제 그림을 망가뜨리는 길은 완전히 안다. 어느 잡음 수준이든 식 한 줄로 바로 만들 수 있고, 그 길에서 분포가 어떤 규칙으로 퍼지며 무엇이 먼저 지워지는지도 안다. 수리공이 믿던 「σ 만큼 망가진 그림」은 이 길 위의 한 시점이었다. 그리고 잡음 수준마다 그림에 살아남는 대역이 달랐다. 짙은 잡음 아래에는 구도와 큰 덩어리만, 옅은 잡음 아래에는 가는 결까지 남는다.
그렇다면 그 길을 거꾸로 걷는 신경망은 한 몸으로 두 가지 일을 해야 한다. 잡음이 짙을 때는 살아남은 굵은 대역만 보고 그림 전체의 모양을 짐작해야 하고, 잡음이 옅을 때는 칸 하나하나의 가는 결을 정확히 다듬어야 한다. 그런데 작은 합성곱 커널을 그림 크기 그대로 쌓으면 출력 한 칸이 실제로 기대는 폭이 층 수의 제곱근으로만 넓어졌다. 굵은 대역은 넓게, 가는 대역은 촘촘히 읽는 신경망을 어떻게 짤까? 라플라시안 피라미드가 그림을 대역마다 나눠 적었듯, 신경망도 대역마다 나눠 읽을 수는 없을까? 그리고 지금 어느 잡음 수준인지는 숫자 하나인데, 그 숫자를 칸마다 같은 커널을 쓰는 신경망의 어디에 넣어야 할까?