# ScoreSdeVeScheduler

`ScoreSdeVeScheduler`는 variance exploding stochastic differential equation (SDE) 스케줄러입니다. Yang Song, Jascha Sohl-Dickstein, Diederik P. Kingma, Abhishek Kumar, Stefano Ermon, Ben Poole의 [Score-Based Generative Modeling through Stochastic Differential Equations](https://huggingface.co/papers/2011.13456) 논문에서 소개되었습니다.

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

*데이터에서 노이즈를 생성하는 것은 쉽지만, 노이즈에서 데이터를 생성하는 것은 생성 모델링입니다. 우리는 복잡한 데이터 분포에 노이즈를 천천히 주입하여 알려진 사전 분포로 부드럽게 변환하는 확률 미분 방정식(SDE)과, 노이즈를 천천히 제거하여 사전 분포를 원래의 데이터 분포로 되돌리는 역시간 SDE를 제시합니다. 핵심적으로, 역시간 SDE는 교란된 데이터 분포의 시간 의존적 그라디언트 필드(또는 스코어)에만 의존합니다. 스코어 기반 생성 모델링의 발전 덕분에 신경망을 사용하여 이러한 스코어를 정확하게 추정할 수 있으며, 수치적 SDE 솔버를 이용해 샘플을 생성할 수 있습니다. 이 프레임워크가 스코어 기반 생성 모델링과 확산 확률 모델링의 이전 접근법들을 포괄하며, 새로운 샘플링 절차와 새로운 모델링 기능을 가능하게 한다는 것을 보여줍니다. 특히, 이산화된 역시간 SDE의 진화 과정에서 발생하는 오류를 보정하기 위한 예측자-보정자(predictor-corrector) 프레임워크를 도입합니다. 또한, SDE와 동일한 분포에서 샘플링하는 등가 신경 ODE를 유도했는데, 이는 정확한 가능도(likelihood) 계산과 향상된 샘플링 효율성을 추가로 제공합니다. 추가로, 클래스 조건부 생성, 이미지 인페인팅, 컬러라이제이션 실험을 통해 시연하듯, 스코어 기반 모델로 역문제(inverse problems)를 해결하는 새로운 방법을 제공합니다. 여러 아키텍처 개선과 결합하여, CIFAR-10 무조건부 이미지 생성에서 Inception score 9.89, FID 2.20이라는 기록적인 성능과 경쟁력 있는 2.99 bits/dim의 가능도를 달성했으며, 스코어 기반 생성 모델로부터 1024 x 1024 이미지의 고충실도 생성을 최초로 시연했습니다.*

## ScoreSdeVeScheduler[[diffusers.ScoreSdeVeScheduler]]

#### diffusers.ScoreSdeVeScheduler[[diffusers.ScoreSdeVeScheduler]]

```python
diffusers.ScoreSdeVeScheduler(num_train_timesteps: int = 2000, snr: float = 0.15, sigma_min: float = 0.01, sigma_max: float = 1348.0, sampling_eps: float = 1e-05, correct_steps: int = 1)
```

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

**매개변수:**

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

snr (`float`, 기본값 0.15) : `model_output` 샘플(네트워크에서 생성)에서 랜덤 노이즈로 이동하는 단계에 가중치를 부여하는 계수.

sigma_min (`float`, 기본값 0.01) : 샘플링 절차에서 시그마 시퀀스의 초기 노이즈 스케일입니다. 최소 시그마 값은 데이터의 분포를 반영해야 합니다.

sigma_max (`float`, 기본값 1348.0) : 모델에 전달되는 연속 시간 단계 범위에 사용되는 최대 값입니다.

sampling_eps (`float`, 기본값 1e-5) : timesteps가 1에서 epsilon으로 점진적으로 감소하는 샘플링의 종료 값입니다.

correct_steps (`int`, 기본값 1) : 생성된 샘플에 수행되는 보정 단계의 수입니다.

`ScoreSdeVeScheduler`는 variance exploding stochastic differential equation (SDE) 스케줄러입니다.

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

#### add_noise[[diffusers.ScoreSdeVeScheduler.add_noise]]

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

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

**매개변수:**

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

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

timesteps (`torch.Tensor`) : 노이즈를 추가할 타임스텝으로, 스케줄에서 노이즈 레벨을 결정합니다.

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

timestep 스케줄에 따라 노이즈가 스케일링되어 추가된 노이즈 샘플.

지정된 timesteps의 noise schedule에 따라 원래 샘플에 노이즈를 추가합니다. 이는 forward diffusion process입니다.

#### get_adjacent_sigma[[diffusers.ScoreSdeVeScheduler.get_adjacent_sigma]]

```python
get_adjacent_sigma(timesteps: Tensor, t: Tensor)
```

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

**매개변수:**

timesteps (`torch.Tensor`) : 이산 시간 단계 인덱스의 텐서.

t (`torch.Tensor`) : 연속 시간 단계 값의 텐서.

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

인접한(이전) 시간 단계 인덱스에 대한 sigma 값입니다.

이전 timestep 인덱스에 해당하는 sigma 값을 반환합니다. timestep이 0인 경우(이전 timestep이 없는 경우) 0을 반환합니다.

#### scale_model_input[[diffusers.ScoreSdeVeScheduler.scale_model_input]]

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

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

**매개변수:**

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

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

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

스케일된 입력 샘플.

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

#### set_sigmas[[diffusers.ScoreSdeVeScheduler.set_sigmas]]

```python
set_sigmas(num_inference_steps: int, sigma_min: float | None = None, sigma_max: float | None = None, sampling_eps: float | None = None)
```

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

**매개변수:**

num_inference_steps (`int`) : 사전 학습된 모델로 샘플을 생성할 때 사용되는 확산 단계의 수.

sigma_min (`float`, *선택 사항*) : 초기 노이즈 스케일 값입니다(스케줄러 인스턴스화 시 제공된 값을 덮어씀).

sigma_max (`float`, *선택 사항*) : 최종 노이즈 스케일 값(스케줄러 인스턴스화 시 제공된 값을 덮어씀).

sampling_eps (`float`, *선택 사항*) : 최종 timestep 값입니다(스케줄러 인스턴스화 시 제공된 값을 덮어씀).

추론 실행 전에 실행되는 diffusion chain에 사용되는 노이즈 스케일을 설정합니다. 시그마는 샘플 업데이트의 `drift` 및 `diffusion` 구성 요소의 가중치를 제어합니다.

#### set_timesteps[[diffusers.ScoreSdeVeScheduler.set_timesteps]]

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

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

**매개변수:**

num_inference_steps (`int`) : 사전 학습된 모델로 샘플을 생성할 때 사용되는 확산 단계의 수.

sampling_eps (`float`, *선택 사항*) : 최종 timestep 값입니다(스케줄러 인스턴스화 시 제공된 값을 덮어씀).

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

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

#### step_correct[[diffusers.ScoreSdeVeScheduler.step_correct]]

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

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

**매개변수:**

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

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

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

return_dict (`bool`, *선택 사항*, 기본값 `True`) : [SchedulerOutput](/docs/diffusers/main/ko/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) 또는 `tuple`을 반환할지 여부.

**반환값:** [SchedulerOutput](/docs/diffusers/main/ko/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) 또는 `tuple`

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

`model_output`를 기반으로 예측된 샘플을 보정합니다. 이는 이전 타임스텝에 대한 예측을 수행한 후 반복적으로 실행되는 경우가 많습니다.

#### step_pred[[diffusers.ScoreSdeVeScheduler.step_pred]]

```python
step_pred(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_sde_ve.py#L177)

**매개변수:**

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

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

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

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

return_dict (`bool`, *선택 사항*, 기본값 `True`) : [SdeVeOutput](/docs/diffusers/main/ko/api/schedulers/score_sde_ve#diffusers.schedulers.scheduling_sde_ve.SdeVeOutput) 또는 `tuple`를 반환할지 여부.

**반환값:** [SdeVeOutput](/docs/diffusers/main/ko/api/schedulers/score_sde_ve#diffusers.schedulers.scheduling_sde_ve.SdeVeOutput) 또는 `tuple`

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

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

## SdeVeOutput[[diffusers.schedulers.scheduling_sde_ve.SdeVeOutput]]

#### diffusers.schedulers.scheduling_sde_ve.SdeVeOutput[[diffusers.schedulers.scheduling_sde_ve.SdeVeOutput]]

```python
diffusers.schedulers.scheduling_sde_ve.SdeVeOutput(prev_sample: Tensor, prev_sample_mean: Tensor)
```

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

**매개변수:**

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

prev_sample_mean (`torch.Tensor`, 이미지인 경우 shape는 `(batch_size, num_channels, height, width)`) : 이전 타임스텝에 걸쳐 평균화된 `prev_sample`.

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

