# DiscreteDDIMScheduler

`DiscreteDDIMScheduler`는 [Structured Denoising Diffusion Models in Discrete State-Spaces](https://huggingface.co/papers/2107.03006)에 따라 균일한 손상 과정(D3PM)의 정확한 이산 사후 분포에서 각 캔버스 위치를 샘플링합니다. 이 스케줄러는 매개변수가 없으며, 마지막 단계에서 예측된 토큰을 결정적으로 확정합니다. 선택적인 predictor-corrector 모드는 `corrector_steps`를 통해 [Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation](https://huggingface.co/papers/2605.22765)의 leave-one-out Gibbs sweeps를 추가합니다.

이 스케줄러는 [DiffusionGemmaPipeline](/docs/diffusers/main/ko/api/pipelines/diffusion_gemma#diffusers.DiffusionGemmaPipeline)에서 사용됩니다.

## DiscreteDDIMScheduler[[diffusers.DiscreteDDIMScheduler]]

#### diffusers.DiscreteDDIMScheduler[[diffusers.DiscreteDDIMScheduler]]

```python
diffusers.DiscreteDDIMScheduler(num_inference_steps: int = 32, corrector_steps: int = 0, corrector_k: int = 1, corrector_selection: str = 'lowest_log_margin', corrector_selection_tau: float = 1.0)
```

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

**매개변수:**

num_inference_steps (`int`, 기본값 32) : 디노이징 단계 수로, 포스터iors가 평가되는 선형 시간 그리드를 정의합니다.

corrector_steps (`int`, 기본값 0) : 각 predictor 단계 이후에 실행되는 Gibbs corrector sweep의 수입니다. `0`은 순수한 ancestral DDIM 샘플링을 복원합니다.

corrector_k (`int`, 기본값 1) : 각 corrector sweep에서 재샘플링할 위치의 수.

corrector_selection (`str`, 기본값 `"lowest_log_margin"`) : 리샘플링된 위치를 선택하는 방법: `"lowest_log_margin"`, `"lowest_maxprob"`, `"lowest_current_prob"` 또는 `"random"`.

corrector_selection_tau (`float`, 기본값 1.0) : Gumbel-top-k 위치 선택의 온도(값이 낮을수록 탐욕적).

"Structured Denoising Diffusion Models in Discrete State-Spaces"(D3PM, https://huggingface.co/papers/2107.03006)를 따르는 균일한 손상 과정(uniform corruption process)을 위한 Discrete DDIM 스케줄러입니다.

선형 스케줄에서 시간 `t` 시점의 클린 토큰 생존 확률은 `alpha(t) = 1 - t`입니다. 시간 `t`에서 `s < t`로의 단일 디노이징 단계에서는 모든 블록 위치를 정확한 사후 분포 `q(x_s | x_t, x0)`에서 샘플링하며, 균일 커널의 경우 이는 세 가지 경로로 분해됩니다: 예측된 클린 토큰 `x0`으로 점프, 현재 토큰 유지, 균일하게 무작위 선택된 토큰으로 점프. 마스크 디퓨전과 달리 마스크 토큰이 없으며, 확정되지 않은 위치에는 무작위 토큰이 배치됩니다.

선택적인 predictor-corrector 모드는 leave-one-out (LOO) denoiser를 통해 "Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation"을 따릅니다 (https://huggingface.co/papers/2605.22765). `corrector_steps > 0`인 경우, 파이프라인은 각 predictor 단계 후 해당 수만큼의 Gibbs corrector sweeps를 실행합니다([step_correct()](/docs/diffusers/main/ko/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMScheduler.step_correct) 참조). 이때 나머지 위치를 고정하고 가장 확신이 낮은 위치들을 one-coordinate conditional `Cat(alpha_s * x0_loo + (1 - alpha_s) / K)`에서 다시 샘플링하여, marginal `p_s`는 불변을 유지하면서 학습 비용 없이 생성 품질을 향상시킵니다.

#### step[[diffusers.DiscreteDDIMScheduler.step]]

```python
step(model_output: torch.Tensor, timestep: int | torch.Tensor, sample: torch.LongTensor, temperature: float = 0.0, generator: torch.Generator | None = None, return_dict: bool = True)
```

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

**매개변수:**

model_output (`torch.Tensor`, shape `(batch_size, block_length, vocab_size)`) : 현재 블록에 대한 모델의 원시 logits.

timestep (`int` 또는 `torch.Tensor`) : `[0, num_inference_steps - 1]` 범위 내의 노이즈 제거 스케줄에서 현재 스텝 인덱스.

sample (`torch.LongTensor`, shape `(batch_size, block_length)`) : 현재 블록의 토큰 ID `x_t`.

temperature (`float`) : `x0`를 추출할 때 logits에 적용되는 샘플링 온도입니다.

generator (`torch.Generator`, *선택 사항*) : 샘플링을 위한 RNG.

return_dict (`bool`) : [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/ko/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput)를 반환할지, 아니면 일반 튜플을 반환할지를 결정합니다.

균일 손상 과정의 사후 분포 `q(x_s | x_t, x0)`에서 다음 블록을 샘플링합니다.

`a = alpha_t / alpha_s` (`s`에서 `t`까지의 생존 확률) 및 `b = alpha_s`일 때, 각 경로의 사후 질량은

clean: `b * (1 - a) / K + a * b * 1[x_t = x0]`, stay: `a * (1 - b) / K`, noise: `(1 - a) * (1 - b) / K`,

따라서 마지막 단계(`b = 1`)에서 예측된 클린 토큰이 결정적으로 커밋됩니다.

#### step_correct[[diffusers.DiscreteDDIMScheduler.step_correct]]

```python
step_correct(model_output: torch.Tensor, timestep: int | torch.Tensor, sample: torch.LongTensor, generator: torch.Generator | None = None, return_dict: bool = True)
```

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

**매개변수:**

model_output (`torch.Tensor`, shape `(batch_size, block_length, vocab_size)`) : 현재 (post-predictor) `sample`에서 다시 계산된 모델의 raw logits.

timestep (`int` 또는 `torch.Tensor`) : 방금 완료된 predictor 단계 인덱스이며, corrector는 다음 그리드 포인트 `s`에서 실행됩니다.

sample (`torch.LongTensor`, shape `(batch_size, block_length)`) : 정제할 현재 블록의 토큰 ID입니다.

generator (`torch.Generator`, *선택 사항*) : 샘플링을 위한 RNG.

return_dict (`bool`) : [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/ko/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput)를 반환할지, 아니면 일반 튜플을 반환할지를 결정합니다.

https://huggingface.co/papers/2605.22765의 leave-one-out predictor-corrector를 따르며, post-predictor 시점 `s`에서 Gibbs corrector sweep를 한 번 실행합니다.

모델 로짓(현재 `sample`에서 다시 계산됨)은 LOI 디노이저로 변환되며, 1좌표 조건부 `p_s(x^l | x^{-l}) = Cat(alpha_s * x0_loo + (1 - alpha_s) / K)`가 형성됩니다. 이후 가장 확신이 낮은 `corrector_k` 위치가 선택되고, 해당 위치는 재샘플링되며 나머지 위치는 고정됩니다. 이 스윕은 `p_s`를 보존하므로, 주변 분포를 변경하지 않으면서도 샘플을 정제할 수 있으며 추가 학습이 필요하지 않습니다.

## DiscreteDDIMSchedulerOutput[[diffusers.DiscreteDDIMSchedulerOutput]]

#### diffusers.DiscreteDDIMSchedulerOutput[[diffusers.DiscreteDDIMSchedulerOutput]]

```python
diffusers.DiscreteDDIMSchedulerOutput(prev_sample: torch.LongTensor, sampled_tokens: torch.LongTensor, sampled_probs: torch.Tensor, pred_logits: torch.Tensor)
```

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

**매개변수:**

prev_sample (`torch.LongTensor`, shape `(batch_size, block_length)`) : 현재 denoising 단계 이후 업데이트된 block tokens.

sampled_tokens (`torch.LongTensor`, shape `(batch_size, block_length)`) : 모델 logits에서 샘플링된 토큰 ID, 즉 예측된 클린 토큰 `x0`.

sampled_probs (`torch.Tensor`, shape `(batch_size, block_length)`) : 샘플링된 토큰의 확률.

pred_logits (`torch.Tensor`, shape `(batch_size, block_length, vocab_size)`) : 다음 단계의 self-conditioning을 위해 전달되는 denoiser logits입니다.

이산 DDIM 스케줄러의 출력 클래스입니다.

