2P by GN⁺ | ★ favorite | 댓글 1개
  • 디퓨전 모델은 이미지 생성을 넘어 오디오·비디오·3D·단백질 설계·로봇 경로 계획처럼 다봉 분포 샘플링이 필요한 문제에 쓰이며, 이 튜토리얼은 최적화 관점으로 학습과 샘플링을 연결함
  • 학습 과정은 데이터에 노이즈를 섞은 (x_\sigma=x_0+\sigma\epsilon)를 만들고, 신경망 (\epsilon_\theta(x,\sigma))가 노이즈 방향을 예측하도록 평균제곱오차를 최소화함
  • 학습된 denoiser는 데이터 집합 (\mathcal{K})로의 근사 투영으로 해석되며, 이상적 denoiser는 (\sigma)-스무딩된 제곱 거리 함수의 그래디언트와 연결됨
  • DDIM 샘플링은 (f(x)=\frac{1}{2}\mathrm{dist}_{\mathcal{K}}(x)^2)에 대한 근사 그래디언트 하강으로 볼 수 있고, (\sigma_t) 스케줄이 반복 횟수와 denoiser 평가 비용을 결정함
  • 그래디언트 추정 업데이트와 노이즈 추가를 결합하면 DDIM, DDPM, 저자들의 개선 샘플러를 gam·mu 파라미터로 함께 다룰 수 있으며, toy 모델과 latent diffusion 예제로 이어짐

최적화 관점의 디퓨전 모델

  • 디퓨전 모델은 다봉 분포에서 샘플을 생성하는 데 강점을 보이며, Stable Diffusion 같은 텍스트-이미지 생성 도구뿐 아니라 오디오, 비디오, 3D 생성, 단백질 설계, 로봇 경로 계획에도 적용됨
  • 튜토리얼의 이론적 기반은 ICML 2024 논문관련 논문최적화 해석
  • 구현은 smalldiffusion을 주로 참조하며, 본문 코드는 원 라이브러리보다 교육용으로 단순화됨

학습: 노이즈 방향 예측

  • 디퓨전 모델은 학습 예시에서 데이터 집합 (\mathcal{K})를 배우고, 그 집합에서 샘플을 생성하는 것을 목표로 함
    • 이미지라면 (\mathcal{K} \subset \mathbb{R}^{c\times h \times w})는 현실적인 이미지에 해당하는 픽셀값 집합임
    • 같은 틀은 오디오, 비디오, 로봇 궤적, 텍스트 같은 이산 영역에도 적용됨
  • 학습 절차는 세 단계로 볼 수 있음
    • (x_0 \sim \mathcal{K}), (\sigma), (\epsilon \sim N(0,I))를 샘플링함
    • (x_\sigma=x_0+\sigma\epsilon)로 노이즈가 섞인 데이터를 만듦
    • (\epsilon_\theta(x_\sigma,\sigma))가 (\epsilon)를 예측하도록 제곱 손실을 최소화함
  • 코드에서는 training_loop가 배치 x0마다 generate_train_samplesigmaeps를 만들고, model(x0 + sigma * eps, sigma)의 출력과 eps 사이의 MSE를 최적화함
  • (\sigma)는 연속 구간에서 균일 샘플링하기보다 (N)개의 값으로 이산화한 (\sigma) 스케줄에서 뽑음
    • Schedule 클래스는 가능한 sigmas 목록을 감싸고 학습 중 배치별로 값을 샘플링함
    • 본문 예제는 ScheduleLogLinear(N, sigma_min=0.02, sigma_max=10)을 사용함
    • ScheduleDDPM은 픽셀 공간 디퓨전 모델, ScheduleLDM은 Stable Diffusion 같은 latent diffusion 모델용 스케줄임

Swissroll toy 예제

  • toy 데이터셋은 초기 디퓨전 논문 중 하나인 Sohl-Dickstein et al. 2015에서 사용한 나선형 점 집합이며, (\mathcal{K}\subset\mathbb{R}^2)임
  • 단순 데이터셋에서는 denoiser를 MLP로 구현함
    • 입력은 (x\in\mathbb{R}^2)와 (\sigma)의 2차원 임베딩을 이어붙인 값임
    • 출력은 노이즈 (\epsilon\in\mathbb{R}^2) 예측값임
    • 많은 디퓨전 모델이 (\sigma)에 sinusoidal positional embedding을 쓰지만, 이 예제에서는 단순한 2차원 임베딩도 잘 동작함
  • 예제 학습 설정은 ScheduleLogLinear(N=200, sigma_min=0.005, sigma_max=10)epochs=15000을 사용함
  • 학습된 denoiser는 (x-\sigma\epsilon_\theta(x,\sigma))를 그려 벡터장으로 시각화할 수 있음
    • (\sigma)가 클 때 denoiser는 데이터 평균을 예측하는 경향이 있음
    • (\sigma)가 낮고 입력 (x)가 데이터에 가까우면 실제 데이터 포인트를 예측함

Denoising을 투영으로 해석하기

  • 데이터 집합 (\mathcal{K})에 대한 거리 함수는 (\mathrm{dist}_{\mathcal{K}}(x)=\min{|x-x_0|:x_0\in\mathcal{K}})로 정의됨
  • (x)의 투영 (\mathrm{proj}_{\mathcal{K}}(x))는 이 거리를 달성하는 (\mathcal{K}) 안의 점 집합임
  • (\mathcal{K})가 닫힌 집합이고 (x\notin\mathcal{K})이며 투영이 유일하면, 제곱 거리 함수의 그래디언트는 (x-\mathrm{proj}_{\mathcal{K}}(x))가 됨
  • 거리 함수 (\mathrm{dist}_{\mathcal{K}})는 모든 곳에서 미분 가능하지 않기 때문에, min 대신 softmin을 사용해 (\sigma)로 스무딩한 제곱 거리 함수를 도입함
  • 스무딩된 거리 함수의 그래디언트는 (x)가 정하는 가중치에 따라 (\mathcal{K})의 점들의 가중 평균 쪽을 향함

이상적 denoiser와 상대 오차 모델

  • 이상적 denoiser (\epsilon^*)는 특정 (\sigma)에서 학습 손실을 정확히 최소화하는 denoiser임
  • 데이터가 유한 집합 (\mathcal{K}) 위의 이산 균일 분포라면, 이상적 denoiser는 닫힌형 식으로 표현됨
    • 각 데이터 포인트의 가중치는 (x_\sigma)와 해당 점 사이의 거리에 따라 정해짐
    • 작은 데이터셋에서는 IdealDenoiser로 직접 계산 가능함
  • toy 데이터에서 이상적 denoiser는 (\sigma)가 클 때 데이터 평균을 향하고, (\sigma)가 작을 때 가장 가까운 데이터 포인트를 향함
  • 핵심 정리는 모든 (\sigma>0), (x\in\mathbb{R}^n)에 대해 (\frac{1}{2}\nabla_x \mathrm{dist}^2_{\mathcal{K}}(x,\sigma)=\sigma\epsilon^*(x,\sigma))라는 관계를 둠
  • 상대 오차 모델은 (x-\sigma\epsilon_\theta(x,\sigma))가 (\mathrm{proj}_{\mathcal{K}}(x))를 잘 근사하는 조건을 사용함
    • (\sqrt{n}\sigma)가 (\mathrm{dist}_{\mathcal{K}}(x))를 상수 배 안에서 잘 추정할 때 적용됨
    • 오차는 (\eta\mathrm{dist}_{\mathcal{K}}(x)) 이하로 제한된다고 가정함
    • 낮은 노이즈에서는 manifold hypothesis 아래 추가 노이즈 대부분이 데이터 다양체에 직교하므로 denoising이 투영을 근사함
    • 높은 노이즈에서는 (\sigma)가 (\mathcal{K})의 지름보다 크면 데이터의 가중 평균을 예측하는 denoiser도 작은 상대 오차를 가짐
  • CIFAR-10은 이상적 denoiser 계산이 가능한 크기이며, 실험에서 샘플링 궤적 위의 정확한 투영과 이상적 denoiser 출력 사이 상대 오차가 작게 나타남

샘플링: 반복 denoising과 DDIM

  • 학습된 denoiser가 있으면, 노이즈가 섞인 (x_t)와 노이즈 수준 (\sigma_t)에서 (\hat{x}0^t=x_t-\sigma_t\epsilon\theta(x_t,\sigma_t))로 (x_0)를 예측함
  • 시작점은 (\sigma_T)를 (\mathcal{K})의 지름에 비해 크게 잡고, (x_T)를 (N(0,\sigma_T))에서 독립 샘플링해 (\mathcal{K})에서 멀리 떨어지게 함
  • 높은 노이즈에서 한 번의 denoiser 호출은 상대 오차가 작아도 절대 오차가 클 수 있으며, 이상적 denoiser의 예측은 데이터 평균에 가까움
  • 그래서 샘플링은 (\sigma_t) 스케줄을 따라 denoiser를 반복 호출해 (x_T,\ldots,x_0) 시퀀스를 만듦
  • 업데이트 (x_{t-1}=x_t-(\sigma_t-\sigma_{t-1})\epsilon_\theta(x_t,\sigma_t))는 좌표 변환을 거친 결정론적 DDIM 샘플링 알고리듬과 같음
    • DDIM과의 동등성 증명은 논문 Appendix A에 있음

거리 최소화로 본 DDIM

  • DDIM은 (f(x)=\frac{1}{2}\mathrm{dist}_{\mathcal{K}}(x)^2)에 대한 근사 그래디언트 하강으로 해석됨
    • 스텝 크기는 (1-\sigma_{t-1}/\sigma_t)임
    • (\nabla f(x_t))는 (\epsilon_\theta(x_t,\sigma_t))로 추정됨
  • (\sigma_t) 스케줄은 샘플링 중 그래디언트 스텝 수와 크기를 결정함
    • 스텝이 너무 적으면 (\mathrm{dist}_{\mathcal{K}}(x_t))가 줄지 않아 수렴하지 않을 수 있음
    • 작은 스텝을 많이 쓰면 denoiser 평가 횟수가 늘어나 계산 비용이 커짐
  • admissible schedule은 각 반복에서 (\sqrt{n}\sigma_t)가 (\mathrm{dist}_{\mathcal{K}}(x_t))와 상수 배 안에서 맞도록 하는 스케줄임
    • 기하급수적으로 감소하는 log-linear (\sigma_t) 시퀀스는 admissible schedule임
  • 정리에 따르면 DDIM으로 생성된 (x_t)에서 (\nabla\mathrm{dist}{\mathcal{K}}(x))가 존재하고 (\mathrm{dist}{\mathcal{K}}(x_T)=\sqrt{n}\sigma_T)이면, (x_t)가 제곱 거리 함수의 그래디언트 하강으로 생성되고 (\mathrm{dist}_{\mathcal{K}}(x_t)/\sqrt{n}\approx\sigma_t)가 유지됨
  • toy 예제에서는 원래 log-linear 스케줄에서 부분 샘플링해 20개 스텝의 DDIM 샘플러를 구현하며, 대부분의 샘플이 원 데이터에 가깝지만 개선 여지가 남아 있음

그래디언트 추정 기반 개선 샘플러

  • (\nabla\mathrm{dist}{\mathcal{K}}(x))가 (x)와 (\mathrm{proj}{\mathcal{K}}(x)) 사이에서 불변이라는 점을 이용해, 현재 추정과 이전 추정을 섞는 업데이트를 사용함
  • 업데이트 (\bar{\epsilon}t=\gamma\epsilon\theta(x_t,\sigma_t)+(1-\gamma)\epsilon_\theta(x_{t+1},\sigma_{t+1}))는 이전 스텝의 오차를 현재 추정으로 보정하는 방식임
  • toy 모델 샘플에서는 이 방식이 DDIM보다 빠르게 수렴하고, 샘플이 원 데이터에 더 가까워짐
  • DDIM과 비교하면 이 샘플러는 모멘텀을 추가한 해석이 가능하며, 궤적이 overshoot할 수 있지만 더 빠르게 수렴할 수 있음
  • 생성 과정에서 노이즈를 추가하면 샘플링 품질이 경험적으로 개선됨
    • 원래 (\sigma_t) 스케줄을 유지하려면 더 작은 (\sigma_{t'})까지 denoise한 뒤 (w_t\sim N(0,I)) 노이즈를 다시 추가함
    • (\mu=\frac{1}{2})일 때 DDPM sampler를 정확히 복원함
  • 전체 업데이트 (x_{t-1}=x_t-(\sigma_t-\sigma_{t'})\bar{\epsilon}_t+\eta w_t)는 세 샘플러를 일반화함
    • DDIM: gam=1, mu=0
    • DDPM: gam=1, mu=0.5
    • 그래디언트 추정 샘플러: gam=2, mu=0

더 큰 모델과 참고 자료

  • 앞의 학습 코드는 toy 데이터뿐 아니라 이미지 디퓨전 모델을 처음부터 학습하는 데도 사용 가능함
  • FashionMNIST 예제는 FashionMNIST 데이터셋에서 학습해 Papers with Code 리더보드의 FID 기준 2위 점수를 얻는 예제로 제공됨
  • 샘플링 코드는 수정 없이 사전학습된 latent diffusion 모델에도 사용 가능함
    • 예시는 ScheduleLDM(1000)ModelLatentDiffusion('stabilityai/stable-diffusion-2-1-base')를 사용함
    • 텍스트 조건은 An astronaut riding a horse로 설정하고, 50개 (\sigma) 스텝으로 샘플링한 뒤 latent를 디코딩함
  • (\gamma) 모멘텀 항의 효과는 고해상도 텍스트-이미지 생성에서 비교 시각화됨
  • 추가로 볼 만한 자료

댓글과 토론

Hacker News 의견들
  • 작성자임. 확산 모델을 이해하려고 하다 보니 코드와 수학을 크게 단순화할 수 있다는 걸 깨달았고, 그래서 이 블로그 글과 확산 라이브러리를 만들게 됨
    질문 있으면 답할 수 있음
    • 연구자 입장에서 마음에 들지 않는 확산 모델 블로그가 많은데, 이 글은 정말 좋았음. 핵심으로 바로 들어가면서도 흔히 빠지는 복잡한 부분을 보여주고, 길을 잃거나 산만해지지 않음
      특히 궤적 논의가 좋았는데, 스케줄러 같은 주제에서 많은 사람이 어려워하는 부분을 이해하는 데 동기가 되기 때문임. Song이나 Lilian의 글만큼 완전하진 않아도 훨씬 접근하기 쉬워서 다른 사람들에게 추천할 생각임
      참고로 친구가 예전에 작성한 최소 확산 구현이 있는데, DDPM 관점에서는 조금 더 “완전한” 편이라 유용했음: https://github.com/VSehwag/minimal-diffusion/
    • 마지막 예시 이미지에서 모멘텀 항이 집 디지털 페인팅에는 해로운 영향을 준 것처럼 보임. gamma = 2.0 이미지에서는 문이 사라져 있어서, 기울기 정보를 쓰는 DDIM 샘플러의 효과를 직관적으로 이해하려면 그 예시의 세부사항이 더 궁금함
      Stable Diffusion에서 샘플링 절차를 조금 실험해 본 입장에서는, DDIM 대비 수렴 시간과 단계 수 비교도 보고 싶었음. 모멘텀, 수렴, 오차 사이에 관계가 있는지 궁금함. 예를 들어 모멘텀 샘플러 16단계가 DDIM 20단계 ± 오차항과 거의 동등한지 같은 비교가 있으면 좋겠음
    • get_sigma_embeds(batches, sigma)가 첫 번째 입력을 사용하지 않는 것 같음. sigma(batches, 1) 형태로 브로드캐스트하려던 의도였는지 궁금함
    • 이런 개념 중 일부가 물리 원리에서 나온 것인지 궁금함. 신경망이 생물학적 신경망을 본떴다고 말하는 것과 비슷한 식인지, 그런 관점에 대한 통찰이 있는지 알고 싶음
  • 또 다른 좋은 글도 Diffusion Models From Scratch라는 제목임: https://www.tonyduan.com/diffusion/index.html
    수학적 세부사항을 훨씬 더 깊게 다루면서도, 500줄 미만의 매우 이해하기 쉬운 최소 구현이 함께 제공됨
  • 코드가 있어서 좋음. 확산 논문들은 방정식이 많기로 유명하지만(https://twitter.com/cto_junior/status/1766518604395155830), 나머지 사람들에게는 코드가 훨씬 읽기 쉽고 더 정확할 수도 있음. 모든 이론 논문에는 참조 구현 코드가 같이 있어야 한다고 봄
    Sora와 다른 비디오 생성 모델을 움직이는 확산 트랜스포머 버전으로도 확장되면 좋겠음. 이 글과 https://jaykmody.com/blog/gpt-from-scratch/를 합쳐서 “처음부터 만드는 확산 트랜스포머” 입문 글을 만들 수 있을 듯함
    • 확산 논문들이 방정식이 많기로 유명하긴 하지만, 솔직히 내가 아는 확산 연구자들도 대부분 똑같이 반응함. 많은 사람이 같은 방정식을 반복해서 쓰고, 그 방정식들은 사실상 복습 목적에 가깝다 봄
      반대로 정말 깊이 파고들고 싶다면 Kingma, Gao, Ricky Tian Qi Chen, 그리고 Max Welling의 제자들(Tomczak은 박사후연구원, Hoogeboom 등), 그리고 숨은 공로자인 Aapo Hyvärinen의 작업을 읽어보는 걸 권함. Kingma & Gao의 비교적 가벼운 쪽 작업이면서 SD3 논문과도 관련 있는 예시는 여기 있음: https://arxiv.org/abs/2303.00848
      아쉬운 점은 이전 연구를 알고 이해해야 하는 의존성이 커서 접근성이 떨어진다는 건데, 이걸 의미 있는 비판이라고 부르기는 어렵기도 함. 연구이지 대중을 위한 교육 자료는 아니기 때문임
    • U-net을 트랜스포머 인코더로 바꾸기만 하면 됨. 임베딩을 제거하고 이미지 패치를 n_embd 크기의 벡터로 투영하면 되고, 확산 과정 자체는 그대로 둘 수 있음
  • 좋은 글이지만, 확산 모델이 스코어 함수(로그 확률의 도함수)를 모델링한다는 중요한 성질[1]과 확산 샘플링이 랑주뱅 동역학[2]과 비슷하다는 점이 빠진 느낌임. 이 관점들이 GAN보다 학습이 쉬운 이유를 잘 설명해 준다고 봄. 모델링 목표가 더 쉽기 때문임
    [1] https://yang-song.net/blog/2021/score/
    [2] https://lilianweng.github.io/posts/2021-07-11-diffusion-mode...
    • 맞음. 이 블로그 글들은 본문에서 설명한 “데이터로의 투영” 관점과는 다른 확산 모델 해석을 제공함. 같은 학습 목표와 샘플링 과정을 해석하는 여러 방식으로 볼 수 있음
      우리 관점에서는 확산 모델이 학습하기 쉬운 이유가, 정확한 거리 함수의 기울기를 예측하는 대신 평활화된 거리 함수의 기울기를 예측하는 학습 목표를 쓰기 때문임. 확산 모델 샘플링은 여러 번의 근사 기울기 단계를 밟는 것과 비슷함
      확산 모델을 더 깊게 이해하려면 이런 블로그 글들을 모두 읽고 서로 다른 해석을 배워보는 걸 권함
  • 매우 흥미로움. Iterative alpha-(de)Blending[1]이 바로 떠올랐음. 이 작업도 개념적으로 더 단순한 확산 모델을 세우려 하고, 근사적인 반복 투영 과정으로 정식화한다는 결론에 도달함
    다만 이 글의 접근은 잡음 제거기 오차 분석 같은 더 흥미로운 실험을 가능하게 해주는 듯함
    [1] https://arxiv.org/pdf/2305.03486.pdf
  • 이론 설명이 좋음. 데이터셋과는 독립적인 설명처럼 보이는데, 실제 이미지 생성의 구체적인 부분이 궁금함
    예를 들어 이미지 생성기가 피아노 건반을 만들기 어려운 이유는 무엇일까? 검은 건반이 두 개와 세 개씩 번갈아 나오는 구조를 만들려면 중간 거리 제약을 더 잘 표현해야 하는 것처럼 보임
    • 이건 손가락 문제와 같음. 개수, 크기, 각도, 위치 등을 매번 모두 맞춰야 하고, 하나라도 틀리면 사람들이 아주 빨리 알아챔. 나뭇가지처럼 갈라지는 위치가 “틀려도” 사람들이 잘 눈치채지 못하는 대상과는 다름
  • 확산의 아이디어 중 일부는 훈련 데이터를 엄청나게 늘리는 것인가? 무작위로 확산된 이미지들을 원래의 확산되지 않은 이미지와 대조할 수 있게 되는 식인지 궁금함
  • 모든 기계학습 모델은 합성곱임. 두고 보셈
    • 이 말을 몇 번 올린 것 같은데, 좀 더 자세히 설명해 줄 수 있음? 예를 들어 강화학습을 합성곱으로 보기는 어렵게 느껴짐