# DiscreteDDIMScheduler

`DiscreteDDIMScheduler` выполняет выборку каждой позиции на холсте из точного дискретного апостериорного распределения равномерного процесса повреждения (D3PM), следуя работе [Structured Denoising Diffusion Models in Discrete State-Spaces](https://huggingface.co/papers/2107.03006). Он не имеет параметров, а на последнем шаге детерминированно фиксирует предсказанные токены. Необязательный режим predictor-corrector добавляет итерации Gibbs leave-one-out из работы [Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation](https://huggingface.co/papers/2605.22765) через `corrector_steps`.

Этот планировщик используется в [DiffusionGemmaPipeline](/docs/diffusers/main/ru/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) : Количество шагов денойзинга, определяющее линейную временную сетку, на которой оценивается апостериорное распределение.

corrector_steps (`int`, по умолчанию 0) : Количество проходов корректора Гиббса, выполняемых после каждого шага предиктора. `0` соответствует обычному анцестральному сэмплированию DDIM.

corrector_k (`int`, по умолчанию 1) : Количество позиций, пересэмплируемых за один проход корректора.

corrector_selection (`str`, по умолчанию `"lowest_log_margin"`) : способ выбора пересэмплированных позиций: `"lowest_log_margin"`, `"lowest_maxprob"`, `"lowest_current_prob"` или `"random"`.

corrector_selection_tau (`float`, по умолчанию 1.0) : Температура выбора позиций Gumbel-top-k (чем ниже, тем жаднее).

Дискретный планировщик DDIM для процесса равномерного повреждения, основанный на статье «Structured Denoising Diffusion Models in Discrete State-Spaces» (D3PM, https://huggingface.co/papers/2107.03006).

На линейном расписании вероятность выживания чистого токена в момент времени `t` равна `alpha(t) = 1 - t`. Один шаг денойзинга от времени `t` до `s < t` выбирает каждый блок позиций из точного апостериорного распределения `q(x_s | x_t, x0)`, которое для равномерного ядра распадается на три сценария: переход к предсказанному чистому токену `x0`, сохранение текущего токена или переход к равномерно случайному токену. В отличие от маскированного диффузионного процесса, здесь нет маскирующего токена; позиции, для которых ещё не принято решение, содержат случайные токены.

Необязательный режим «предиктор-корректор» следует подходу из статьи «Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation» с использованием денойзера leave-one-out (LOO) (https://huggingface.co/papers/2605.22765). Если `corrector_steps > 0`, конвейер выполняет указанное количество проходов корректора Гиббса после каждого шага предиктора (см. [step_correct()](/docs/diffusers/main/ru/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMScheduler.step_correct)), пересэмплируя позиции с наименьшей уверенностью из однокоординатного условного распределения `Cat(alpha_s * x0_loo + (1 - alpha_s) / K)` при фиксированных остальных, что сохраняет маргинальное распределение `p_s` неизменным и улучшает генерацию без дополнительных затрат на обучение.

#### шаг[[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` формы `(batch_size, block_length, vocab_size)`) : Сырые логиты модели для текущего блока.

timestep (`int` или `torch.Tensor`) : Текущий индекс шага в расписании денойзинга, в диапазоне `[0, num_inference_steps - 1]`.

sample (`torch.LongTensor` формы `(batch_size, block_length)`) : ID токенов текущего блока `x_t`.

temperature (`float`) : Температура выборки, применяемая к логитам при извлечении `x0`.

generator (`torch.Generator`, *необязательный*) : генератор случайных чисел для выборки.

return_dict (`bool`) : Нужно ли возвращать [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/ru/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput) или обычный кортеж.

Сэмплируйте следующий блок из апостериорного распределения `q(x_s | x_t, x0)` равномерного процесса деградации.

При `a = alpha_t / alpha_s` (вероятность выживания с `s` до `t`) и `b = alpha_s` апостериорная масса каждой траектории равна

чистый: `b * (1 - a) / K + a * b * 1[x_t = x0]`, остаться: `a * (1 - b) / K`, шум: `(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` формы `(batch_size, block_length, vocab_size)`) : Сырые логиты, пересчитанные моделью для текущего (после предиктора) `sample`.

timestep (`int` или `torch.Tensor`) : индекс шага предиктора, только что завершённого; корректор выполняется в следующей точке сетки `s`.

sample (`torch.LongTensor` формы `(batch_size, block_length)`) : Текущие идентификаторы токенов блока для уточнения.

generator (`torch.Generator`, *необязательный*) : генератор случайных чисел для выборки.

return_dict (`bool`) : Нужно ли возвращать [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/ru/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput) или обычный кортеж.

Выполните один проход корректора Гиббса в момент времени `s` после предиктора, следуя схеме предиктора-корректора с исключением одного элемента (leave-one-out) из https://huggingface.co/papers/2605.22765.

Логиты модели (пересчитанные для текущего `sample`) преобразуются в LOO-денуизер, формируется однокоординатное условное распределение `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` формы `(batch_size, block_length)`) : Обновлённые токены блока после текущего шага денойзинга.

sampled_tokens (`torch.LongTensor` формы `(batch_size, block_length)`) : Идентификаторы токенов, выбранные из логитов модели, то есть предсказанные чистые токены `x0`.

sampled_probs (`torch.Tensor` формы `(batch_size, block_length)`) : Вероятности сэмплированных токенов.

pred_logits (`torch.Tensor` формы `(batch_size, block_length, vocab_size)`) : Логиты денойзера, передаваемые для самоусловливания следующего шага.

Класс вывода для дискретного планировщика DDIM.

