인공지능
확산 모델 이해하기: 생성형 AI에 대한 심층 분석
확산 모델은 이미지, 오디오, 비디오 생성 분야에서 최첨단 결과를 생산하며 생성형 AI의 강력한 접근법으로 부상했습니다. 이 심층 기술 기사에서 우리는 확산 모델이 어떻게 작동하는지, 그 핵심 혁신은 무엇인지, 그리고 왜 그렇게 성공적이 되었는지 탐구해 보겠습니다. 이 흥미로운 신기술의 수학적 기초, 훈련 과정, 샘플링 알고리즘, 그리고 최첨단 응용 분야를 다룰 것입니다.
확산 모델 소개
확산 모델은 확산 과정을 역전시켜 데이터를 점진적으로 노이즈 제거하는 방법을 학습하는 생성 모델의 한 종류입니다. 핵심 아이디어는 순수한 노이즈로 시작하여 목표 분포에서 고품질 샘플로 반복적으로 정제하는 것입니다.
이 접근법은 비평형 열역학, 특히 구조를 복구하기 위해 확산을 역전시키는 과정에서 영감을 받았습니다. 기계 학습의 맥락에서 우리는 이를 데이터에 노이즈를 점진적으로 추가하는 과정을 역전시키는 것을 학습하는 것으로 생각할 수 있습니다.
확산 모델의 주요 장점은 다음과 같습니다:
- 많은 경우 GAN을 능가하는 최첨단 이미지 품질
- 적대적 역학 없이 안정적인 훈련
- 고도로 병렬화 가능
- 유연한 아키텍처 – 동일한 차원의 입력을 출력으로 매핑하는 모든 모델을 사용할 수 있음
- 강력한 이론적 기반
이제 확산 모델이 어떻게 작동하는지 더 깊이 알아보겠습니다.

Source: Song et al.
확산 모델의 순방향 및 역방향 과정은 확률적 미분 방정식에 의해 지배됩니다. 순방향 SDE는 데이터에 노이즈를 추가하여 점차적으로 노이즈 분포로 변환합니다. 학습된 스코어 함수에 의해 안내되는 역방향 SDE는 노이즈를 점진적으로 제거하여 무작위 노이즈에서 사실적인 이미지를 생성하도록 합니다. 이 접근법은 연속 상태 공간에서 고품질 생성 성능을 달성하는 데 핵심적입니다.
순방향 확산 과정
순방향 확산 과정은 실제 데이터 분포에서 샘플링된 데이터 포인트 x₀로 시작하여 T 시간 단계에 걸쳐 가우시안 노이즈를 점진적으로 추가하여 점점 더 노이즈가 많은 버전 x₁, x₂, …, xT를 생성합니다.
각 시간 단계 t에서 우리는 다음과 같이 소량의 노이즈를 추가합니다:
x_t = √(1 - β_t) * x_{t-1} + √(β_t) * ε
여기서:
- β_t는 각 단계에서 얼마나 많은 노이즈가 추가되는지 제어하는 분산 일정입니다.
- ε는 무작위 가우시안 노이즈입니다.
이 과정은 xT가 거의 순수한 가우시안 노이즈가 될 때까지 계속됩니다.
수학적으로 우리는 이를 마르코프 체인으로 설명할 수 있습니다:
q(x_t | x_{t-1}) = N(x_t; √(1 - β_t) * x_{t-1}, β_t * I)
여기서 N은 가우시안 분포를 나타냅니다.
β_t 일정은 일반적으로 초기 시간 단계에서는 작게 선택되고 시간이 지남에 따라 증가하도록 선택됩니다. 일반적인 선택에는 선형, 코사인 또는 시그모이드 일정이 포함됩니다.
역방향 확산 과정
확산 모델의 목표는 이 과정의 역을 학습하는 것입니다. 즉, 순수한 노이즈 xT로 시작하여 점진적으로 노이즈를 제거하여 깨끗한 샘플 x₀를 복구하는 것입니다.
우리는 이 역방향 과정을 다음과 같이 모델링합니다:
p_θ(x_{t-1} | x_t) = N(x_{t-1}; μ_θ(x_t, t), σ_θ^2(x_t, t))
여기서 μ_θ와 σ_θ^2는 θ로 매개변수화된 학습된 함수(일반적으로 신경망)입니다.
핵심 혁신은 우리가 전체 역방향 분포를 명시적으로 모델링할 필요가 없다는 점입니다. 대신, 우리가 알고 있는 순방향 과정의 관점에서 이를 매개변수화할 수 있습니다.
구체적으로, 최적의 역방향 과정 평균 μ*는 다음과 같음을 보일 수 있습니다:
μ* = 1/√(1 - β_t) * (x_t - β_t/√(1 - α_t) * ε_θ(x_t, t))
여기서:
- α_t = 1 – β_t
- ε_θ는 학습된 노이즈 예측 네트워크입니다.
이것은 우리에게 간단한 목적을 제공합니다. 각 단계에서 추가된 노이즈를 예측하도록 신경망 ε_θ를 훈련시키는 것입니다.
훈련 목적
확산 모델의 훈련 목적은 변분 추론에서 유도될 수 있습니다. 약간의 단순화 후에 우리는 간단한 L2 손실에 도달합니다:
L = E_t,x₀,ε [ ||ε - ε_θ(x_t, t)||² ]
여기서:
- t는 1부터 T까지 균일하게 샘플링됩니다.
- x₀는 훈련 데이터에서 샘플링됩니다.
- ε는 샘플링된 가우시안 노이즈입니다.
- x_t는 순방향 과정에 따라 x₀에 노이즈를 추가하여 구성됩니다.
다시 말해, 우리는 모델이 각 시간 단계에서 추가된 노이즈를 예측하도록 훈련시키는 것입니다.
모델 아키텍처

Source: Ronneberger et al.
U-Net 아키텍처는 확산 모델의 노이즈 제거 단계에서 핵심적입니다. 이는 재구성 과정 중 미세한 세부 사항을 보존하는 데 도움이 되는 스킵 연결이 있는 인코더-디코더 구조를 특징으로 합니다. 인코더는 고수준 특징을 포착하면서 입력 이미지를 점진적으로 다운샘플링하고, 디코더는 인코딩된 특징을 업샘플링하여 이미지를 재구성합니다. 이 아키텍처는 이미지 분할과 같은 정확한 위치 지정이 필요한 작업에서 특히 효과적입니다.
노이즈 예측 네트워크 ε_θ는 입력을 동일한 차원의 출력으로 매핑하는 모든 아키텍처를 사용할 수 있습니다. U-Net 스타일 아키텍처는 특히 이미지 생성 작업에서 인기 있는 선택입니다.
일반적인 아키텍처는 다음과 같을 수 있습니다:
class DiffusionUNet(nn.Module): def __init__(self): super().__init__() # Downsampling self.down1 = UNetBlock(3, 64) self.down2 = UNetBlock(64, 128) self.down3 = UNetBlock(128, 256) # Bottleneck self.bottleneck = UNetBlock(256, 512) # Upsampling self.up3 = UNetBlock(512, 256) self.up2 = UNetBlock(256, 128) self.up1 = UNetBlock(128, 64) # Output self.out = nn.Conv2d(64, 3, 1) def forward(self, x, t): # Embed timestep t_emb = self.time_embedding(t) # Downsample d1 = self.down1(x, t_emb) d2 = self.down2(d1, t_emb) d3 = self.down3(d2, t_emb) # Bottleneck bottleneck = self.bottleneck(d3, t_emb) # Upsample u3 = self.up3(torch.cat([bottleneck, d3], dim=1), t_emb) u2 = self.up2(torch.cat([u3, d2], dim=1), t_emb) u1 = self.up1(torch.cat([u2, d1], dim=1), t_emb) # Output return self.out(u1)












