# DDPMScheduler

Jonathan Ho, Ajay Jain, Pieter Abbeel의 [Denoising Diffusion Probabilistic Models](https://huggingface.co/papers/2006.11239)(DDPM)은 동일한 이름의 diffusion 기반 모델을 제안합니다. 🤗 Diffusers 라이브러리 컨텍스트에서 DDPM은 해당 논문에서 제시한 discrete denoising scheduler와 파이프라인을 모두 가리킵니다.

해당 논문의 초록은 다음과 같습니다:

*비평형 열역학의 고려 사항에서 영감을 받은 잠재 변수 모델의 한 종류인 확률적 확산 모델(diffusion probabilistic models)을 사용하여 고품질 이미지 합성 결과를 제시합니다. 우리의 최우수 결과는 확률적 확산 모델과 Langevin 동역학을 갖는 노이즈 제거 점수 매칭(denoising score matching) 사이의 새로운 연결에 따라 설계된 가중치 변분 경계(weighted variational bound)를 사용하여 학습함으로써 얻어졌으며, 우리의 모델은 자기 회귀 디코딩(autoregressive decoding)의 일반화로 해석될 수 있는 점진적 손실 압축 해제(progressive lossy decompression) 스키마를 자연스럽게 허용합니다. 무조건적 CIFAR10 데이터셋에서 Inception score 9.46과 최첨단 FID score 3.17을 달성했습니다. 256x256 LSUN에서는 ProgressiveGAN과 유사한 샘플 품질을 얻었습니다. 구현은 [이 https URL](https://github.com/hojonathanho/diffusion)에서 사용할 수 있습니다.*

## DDPMScheduler[[diffusers.DDPMScheduler]]

#### diffusers.DDPMScheduler[[diffusers.DDPMScheduler]]

```python
diffusers.DDPMScheduler(num_train_timesteps: int = 1000, beta_start: float = 0.0001, beta_end: float = 0.02, beta_schedule: typing.Literal['linear', 'scaled_linear', 'squaredcos_cap_v2', 'sigmoid'] = 'linear', trained_betas: numpy.ndarray | list[float] | None = None, variance_type: typing.Literal['fixed_small', 'fixed_small_log', 'fixed_large', 'fixed_large_log', 'learned', 'learned_range'] = 'fixed_small', clip_sample: bool = True, prediction_type: typing.Literal['epsilon', 'sample', 'v_prediction'] = 'epsilon', thresholding: bool = False, dynamic_thresholding_ratio: float = 0.995, clip_sample_range: float = 1.0, sample_max_value: float = 1.0, timestep_spacing: typing.Literal['linspace', 'leading', 'trailing'] = 'leading', steps_offset: int = 0, rescale_betas_zero_snr: bool = False)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L137)

**매개변수:**

num_train_timesteps (`int`, 기본값 `1000`) : 모델을 학습하기 위한 diffusion step 수입니다.

beta_start (`float`, 기본값 `0.0001`) : 추론의 시작 `beta` 값입니다.

beta_end (`float`, 기본값 `0.02`) : 최종 `beta` 값.

beta_schedule (`"linear"`, `"scaled_linear"`, `"squaredcos_cap_v2"`, 또는 `"sigmoid"`, 기본값은 `"linear"`) : 베타 스케줄입니다. 베타 범위를 모델의 스테핑에 사용할 베타 시퀀스로 매핑합니다.

trained_betas (`np.ndarray`, *선택 사항*) : `beta_start`와 `beta_end`를 사용하지 않고 생성자에 직접 전달할 베타 배열입니다.

variance_type (`"fixed_small"`, `"fixed_small_log"`, `"fixed_large"`, `"fixed_large_log"`, `"learned"`, 또는 `"learned_range"`, 기본값은 `"fixed_small"`) : 노이즈 제거 샘플에 노이즈를 추가할 때 분산을 클립합니다.

clip_sample (`bool`, 기본값 `True`) : 수치적 안정성을 위해 예측된 샘플을 클리핑합니다.

clip_sample_range (`float`, 기본값 `1.0`) : 샘플 클리핑의 최대 크기입니다. `clip_sample=True`일 때만 유효합니다.

prediction_type (`"epsilon"`, `"sample"`, or `"v_prediction"`, 기본값은 `"epsilon"`) : 스케줄러 함수의 예측 유형; `epsilon` (확산 과정의 노이즈를 예측), `sample` (노이즈가 포함된 샘플을 직접 예측`) or `v_prediction` ([Imagen Video](https://huggingface.co/papers/2210.02303) 논문 2.4절 참조)를 사용할 수 있습니다.

thresholding (`bool`, 기본값은 `False`) : "dynamic thresholding" 방법을 사용할지 여부입니다. Stable Diffusion과 같은 latent-space diffusion 모델에는 적합하지 않습니다.

dynamic_thresholding_ratio (`float`, 기본값 `0.995`) : 동적 임계값 설정 방법의 비율입니다. `thresholding=True`일 때만 유효합니다.

sample_max_value (`float`, 기본값 `1.0`) : 동적 임계값 설정의 임계값입니다. `thresholding=True`일 때만 유효합니다.

timestep_spacing (`"linspace"`, `"leading"`, 또는 `"trailing"`, 기본값은 `"leading"`) : timesteps를 스케일링하는 방식. 자세한 내용은 [일반적인 확산 노이즈 스케줄과 샘플 스텝은 결함이 있다](https://huggingface.co/papers/2305.08891)의 Table 2를 참조하세요.

steps_offset (`int`, 기본값 `0`) : 일부 모델 계열에서 요구하는 추론 단계에 추가되는 오프셋입니다.

rescale_betas_zero_snr (`bool`, 기본값 `False`) : 베타를 재조정하여 최종 SNR이 0이 되도록 할지 여부입니다. 이를 통해 모델은 중간 밝기의 샘플로 제한되는 대신 매우 밝고 어두운 샘플을 생성할 수 있습니다. [`--offset_noise`](https://github.com/huggingface/diffusers/blob/74fd735eb073eb1d774b1ab4154a0876eb82f055/examples/dreambooth/train_dreambooth.py#L506)와 느슨하게 관련이 있습니다.

`DDPMScheduler`는 denoising score matching과 Langevin dynamics sampling 간의 연결을 탐구합니다.

이 모델은 [SchedulerMixin](/docs/diffusers/main/ko/api/schedulers/overview#diffusers.SchedulerMixin)과 [ConfigMixin](/docs/diffusers/main/ko/api/configuration#diffusers.ConfigMixin)을 상속합니다. 로딩 및 저장과 같은 모든 스케줄러에 대해 라이브러리가 구현하는 일반적 메서드에 대해서는 상위 클래스 문서를 확인하세요.

#### add_noise[[diffusers.DDPMScheduler.add_noise]]

```python
add_noise(original_samples: Tensor, noise: Tensor, timesteps: IntTensor)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L569)

**매개변수:**

original_samples (`torch.Tensor`) : 노이즈가 추가될 원래 샘플.

noise (`torch.Tensor`) : 샘플에 추가할 노이즈.

timesteps (`torch.IntTensor`) : 각 샘플의 노이즈 수준을 나타내는 timesteps.

**반환값:** `torch.Tensor`

노이즈가 포함된 샘플.

각 timestep의 노이즈 크기에 따라 원래 샘플에 노이즈를 추가합니다(이것은 forward diffusion process입니다).

#### get_velocity[[diffusers.DDPMScheduler.get_velocity]]

```python
get_velocity(sample: Tensor, noise: Tensor, timesteps: IntTensor)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L611)

**매개변수:**

sample (`torch.Tensor`) : 입력 샘플.

noise (`torch.Tensor`) : 노이즈 텐서.

timesteps (`torch.IntTensor`) : 속도 계산에 사용되는 timesteps입니다.

**반환값:** `torch.Tensor`

계산된 속도.

속도 공식에 따라 샘플과 노이즈로부터 속도 예측을 계산합니다.

#### previous_timestep[[diffusers.DDPMScheduler.previous_timestep]]

```python
previous_timestep(timestep: int)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L648)

**매개변수:**

timestep (`int`) : 현재 타임스텝.

**반환값:** `int` 또는 `torch.Tensor`

이전 시간 단계(timestep).

확산 체인의 이전 시간 단계를 계산합니다.

#### scale_model_input[[diffusers.DDPMScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: int | None = None)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L257)

**매개변수:**

sample (`torch.Tensor`) : 입력 샘플.

timestep (`int`, *선택 사항*) : 확산 체인에서의 현재 시간 단계입니다.

**반환값:** `torch.Tensor`

스케일된 입력 샘플.

현재 타임스텝에 따라 디노이징 모델 입력을 스케일링해야 하는 스케줄러와의 호환성을 보장합니다.

#### set_timesteps[[diffusers.DDPMScheduler.set_timesteps]]

```python
set_timesteps(num_inference_steps: int = None, device: typing.Union[str, torch.device] = None, timesteps: list[int] | None = None)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L274)

**매개변수:**

num_inference_steps (`int`, *선택 사항*) : 사전 학습된 모델로 샘플을 생성할 때 사용되는 확산 단계 수입니다. 이 값을 사용하는 경우 `timesteps`는 `None`이어야 합니다.

device (`str` 또는 `torch.device`, *선택 사항*) : timesteps를 이동할 대상 device입니다. `None`인 경우 timesteps는 이동되지 않습니다.

timesteps (`list[int]`, *선택 사항*) : timestep 간 임의의 간격을 지원하기 위해 사용되는 사용자 지정 timestep입니다. `None`인 경우, timestep 간 균등 간격이라는 기본 timestep 간격 전략이 사용됩니다. `timesteps`가 전달되면 `num_inference_steps`는 `None`이어야 합니다.

추론 실행 전에 실행할 diffusion chain에 사용할 이산 timesteps를 설정합니다.

#### step[[diffusers.DDPMScheduler.step]]

```python
step(model_output: Tensor, timestep: int, sample: Tensor, generator: typing.Optional[torch.Generator] = None, return_dict: bool = True)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L461)

**매개변수:**

model_output (`torch.Tensor`) : 학습된 diffusion model의 직접적인 출력입니다.

timestep (`int`) : 확산 체인(diffusion chain)의 현재 이산 시간 단계(discrete timestep).

sample (`torch.Tensor`) : 확산 과정에서 생성된 샘플의 현재 인스턴스.

generator (`torch.Generator`, *선택 사항*) : 난수 생성기입니다.

return_dict (`bool`, 기본값 `True`) : [DDPMSchedulerOutput](/docs/diffusers/main/ko/api/schedulers/ddpm#diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput) 또는 `tuple`를 반환할지 여부.

**반환값:** [DDPMSchedulerOutput](/docs/diffusers/main/ko/api/schedulers/ddpm#diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput) 또는 `tuple`

return_dict가 `True`인 경우 [DDPMSchedulerOutput](/docs/diffusers/main/ko/api/schedulers/ddpm#diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput)이 반환되고, 그렇지 않으면 첫 번째 요소가 샘플 텐서인 튜플이 반환됩니다.

이전 시간 단계의 샘플을 SDE를 역방향으로 적용하여 예측합니다. 이 함수는 학습된 모델의 출력(대부분 예측된 노이즈)으로부터 확산 과정을 전파합니다.

## DDPMSchedulerOutput[[diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput]]

#### diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput[[diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput]]

```python
diffusers.schedulers.scheduling_ddpm.DDPMSchedulerOutput(prev_sample: Tensor, pred_original_sample: typing.Optional[torch.Tensor] = None)
```

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_ddpm.py#L31)

**매개변수:**

prev_sample (`torch.Tensor`, 이미지인 경우 shape는 `(batch_size, num_channels, height, width)`) : 이전 timestep의 계산된 샘플 `(x_{t-1})`. `prev_sample`은 denoising 루프에서 다음 모델 입력으로 사용해야 합니다.

pred_original_sample (`torch.Tensor`, 이미지인 경우 shape는 `(batch_size, num_channels, height, width)`) : 현재 timestep의 모델 출력에 기반한 예측된 노이즈 제거 샘플 `(x_{0})`. `pred_original_sample`은 진행 상황 미리보기 또는 가이던스에 사용할 수 있습니다.

스케줄러의 `step` 함수 출력을 위한 출력 클래스입니다.

