잡음을 맞히는 신경망: DDPM과 잡음 제거 스코어 매칭

자주 하는 실수와 요약

자주 하는 실수

실수 나온 문제 바로잡는 법
세기가 잡음 세기보다 작기만 하면 그 대역이 다 들린다(남는다)고 봄 1 대역마다 세기 ÷ (세기 + 잡음 세기)만큼만 남는다. 둘이 같으면 반이다
잡음 크기를 반으로 줄이면 경계가 4배(또는 늘 2배)로 옮겨 간다고 봄 2 경계는 (A/σ²)^(1/γ)라 2^(2/γ) 배. γ = 2 일 때만 한 옥타브다
잡음 일정의 σₜ 를 그대로 그림의 무늬와 견줌 3 그림은 αₜ 배로 줄어 있으니 σₜ/αₜ 로 견주고, 픽셀 눈금(−1 ~ 1 이면 0~1 의 두 배)도 맞춘다
답이 둘로 갈릴 때 더 그럴듯한 쪽 하나를 고름 4 제곱 오차를 가장 작게 하는 답은 확률로 섞은 평균이다
조건부 타깃을 처음 비중(반반)으로 섞음 5 그 자리를 본 뒤의 확률로 섞는다. 가까운 볼에서 왔을 확률이 크다
잡음 제거 스코어 매칭 손실이 0까지 내려가야 학습이 끝난다고 봄 6 손실의 최솟값은 그 자리에서 타깃이 흔들리는 정도의 평균이고, 잡음 수준마다 다르다
크기가 다른 오차를 그대로 더함 7 맞힐 값의 크기를 고르게 한 뒤 더한다. 잡음을 맞히면 모든 수준에서 크기가 1이다
잡음 예측을 원래 그림으로 바꿀 때 α로 나누는 것을 빠뜨림 8 x̂₀ = (xₜ − σₜ ε̂)/αₜ
잡음 예측에서 스코어를 −ε̂/σ² 로 씀 8 스코어는 −ε̂/σₜ. −(xₜ − x₀)/σ² 는 α = 1 일 때의 식이다
잡음 오차가 작으면 원래 그림의 어림도 늘 정확하다고 봄 9 오차가 σₜ/αₜ 배로 바뀐다. 짙은 잡음에서는 크게 부푼다
비중만 바뀌었는데 결과의 순위가 그대로일 거라 봄 10, 12 같은 점수표도 비중이 바뀌면 1등이 바뀐다
역방향 한 걸음의 KL 에서 분산을 σₜ² 로 씀 11 한 걸음 되돌린 분포의 분산은 βₜ 다. σₜ² 는 처음부터 쌓인 잡음이다
FID 와 로그우도 가운데 한쪽만으로 모델을 판단함 12 무엇을 재느냐에 따라 1등이 다르다. 단순한 손실은 옅은 잡음의 비중을 줄인다
줄어든 양의 합만으로 처음 값을 구함(끝 값을 확인하지 않음) 13 끝 값이 0일 때만 합 = 처음 값. 중간에서 끊으면 아래쪽 경계뿐이다
잡음 섞기 전의 바늘로 모든 수준의 피셔 발산을 계산함 14 잡음 수준마다 두 분포를 다시 적고 그 바늘을 쓴다
짙은 잡음에서 바늘이 맞으면 좋은 모델이라 봄 15 봉우리 모양은 옅은 잡음의 바늘에 있다. 로그우도는 그쪽이 정한다

요약

그림들을 공간 주파수마다 세기가 정해진 정규분포로 보면, 잡음 σ 를 섞은 그림의 가장 좋은 복원기는 무늬마다 P(f)/(P(f) + σ²)를 곱한다. 세기가 σ² 보다 큰 굵은 무늬만 남고, σ 를 한 단계 줄일 때마다 경계가 가는 쪽으로 대역 하나만큼 옮겨 간다. 잡음 수준마다 막 드러나는 대역을 채우며 여러 번 디노이징하는 것이 디퓨전 모델이다. 신경망은 잡음 섞인 분포의 바늘을 정답으로 받을 수 없다. 대신 데이터에 잡음을 섞어 본 기록 한 줄마다 「떠나온 점 쪽 바늘」 −(xₜ − x₀)/σₜ²를 타깃으로 주면, 제곱 오차를 가장 작게 하는 답은 그 자리에 선 사람들의 타깃의 평균이고, 그 평균이 트위디 공식에 따라 참 스코어다. 이것이 잡음 제거 스코어 매칭이다. 섞은 잡음 ε를 맞히든, 원래 그림 x₀를 맞히든, 바늘을 맞히든 같은 정보이고(x̂₀ = (xₜ − σₜ ε̂)/αₜ, s = −ε̂/σₜ), 잡음을 맞히면 모든 잡음 수준에서 맞힐 값의 크기가 1로 고르다. 잡음을 천 걸음에 나눠 섞는 사슬을 VAE처럼 보면, 데이터 x₀가 그림이고 나머지 사슬이 잠재 변수이며 인코더는 고정된 잡음 섞기다. 그 ELBO는 걸음마다의 잡음 맞히기 오차에 가중치 λₜ를 붙인 합이 되고(DDPM), 가중치를 모두 같게 한 단순한 손실이 그림의 질을 높였다. 같은 잡음을 섞은 두 분포의 KL은 잡음 분산을 따라 피셔 발산의 절반 빠르기로 줄어드므로, 모든 잡음 수준의 스코어 매칭을 알맞은 가중치로 합하면 KL로 돌아온다. 디퓨전 손실들의 차이는 잡음 수준마다의 가중치다.

flowchart LR
  Z["가장 좋은 복원기<br/>무늬마다 P/(P + σ²)"] --> Y["σ 를 줄일 때마다 대역 하나<br/>= 디퓨전 모델"]
  Y --> A
  A["정답 바늘을 모른다"] --> B["잡음을 섞어 본 기록<br/>타깃 −(xₜ − x₀)/σ²"]
  B --> C["제곱 오차의 답 = 그 자리의 평균<br/>= 참 스코어 (잡음 제거 스코어 매칭)"]
  C --> D["타깃 크기가 1/σ 로 오르내림"]
  D --> E["섞은 잡음 ε 를 맞힌다 (잡음 예측)<br/>x̂₀ 와 s 는 식 한 줄"]
  F["VAE 의 ELBO"] --> G["인코더 = 고정된 잡음 섞기<br/>사슬의 ELBO = Σ λₜ ‖ε − εθ‖² (DDPM)"]
  E --> G
  G --> H["단순한 손실: λₜ 를 모두 같게"]
  C --> I["피셔 발산의 합 = KL<br/>(모든 잡음 수준을 합치면)"]
  I --> H

막힌 곳

이제 신경망에게 무엇을 맞히게 할지 안다. 그림과 잡음 수준 t를 받아 그림과 같은 크기의 잡음 εθ(xt, t)를 내놓게 하고, 단순한 제곱 오차로 배우면 된다. 그 출력은 식 한 줄로 그 잡음 수준의 바늘이 되고, 잡음 수준을 줄여 가며 걸으면 대역마다 무늬가 채워진다.

그런데 걷는 법이 둘이다. 수리공의 걸음과 거꾸로 흐르기는 출발 잡음만 뽑고 나면 잡음 없이 걸었다. DDPM 사슬의 역방향 한 걸음은 분산 βt인 가우시안에서 새로 뽑으니, 걸음마다 잡음을 다시 넣는다. 잡음을 걷어 내려고 걷는 길에 잡음을 다시 넣어도 같은 곳에 닿을까? 넣는다면 얼마나 넣어야 할까? 그리고 잡음 수준을 줄여 가지 않고 바늘 하나만 들고 걸어도 분포에서 표본을 뽑을 수 있을까?