# 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 スイープが追加されます。

このスケジューラは、[DiffusionGemmaPipeline](/docs/diffusers/main/ja/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) : デノイジングのステップ数。ポスターiorが評価される線形時間グリッドを定義します。

corrector_steps (`int`、デフォルトは 0) : 各 predictor ステップの後に実行する Gibbs corrector スイープの数。 `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 による位置選択の温度（値が低いほど貪欲になります）。

https://huggingface.co/papers/2107.03006 の「Structured Denoising Diffusion Models in Discrete State-Spaces」（D3PM）に従う、一様破損プロセス用の離散 DDIM スケジューラです。

線形スケジュールでは、時刻 `t` におけるクリーンなトークンの生存確率は `alpha(t) = 1 - t` です。時刻 `t` から `s < t` への 1 ステップのノイズ除去では、すべてのブロック位置について、厳密な事後分布 `q(x_s | x_t, x0)` からサンプリングが行われます。この事後分布は、一様カーネルの場合、予測されたクリーンなトークン `x0` へのジャンプ、現在のトークンの維持、および一様ランダムなトークンへのジャンプという 3 つの経路に分解されます。マスク拡散とは異なり、マスクトークンは存在せず、未確定の位置にはランダムなトークンが保持されます。

任意の predictor-corrector モードは、leave-one-out (LOO) デノイザー (https://huggingface.co/papers/2605.22765) を通じて "Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation" に従います。`corrector_steps > 0` の場合、パイプラインは各 predictor ステップの後にその回数分の Gibbs corrector スイープを実行します（[step_correct()](/docs/diffusers/main/ja/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMScheduler.step_correct) を参照）。このとき、残りの位置を固定したまま、最も確信度の低い位置を 1 座標条件分布 `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`、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`, *任意*) : サンプリング用の乱数生成器。

return_dict (`bool`) : [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/ja/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)`) : 現在の（predictor 適用後の）`sample` で再計算されたモデルからの生の logits。

timestep (`int` または `torch.Tensor`) : 直前に完了した predictor のステップインデックス。corrector は次のグリッドポイント `s` で実行されます。

sample (`torch.LongTensor`、shape `(batch_size, block_length)`) : 洗練する対象の現在のブロックのトークン ID。

generator (`torch.Generator`, *任意*) : サンプリング用の乱数生成器。

return_dict (`bool`) : [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/ja/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput) を返すか、通常のタプルを返すかを指定します。

予測子後の時刻`s`で、https://huggingface.co/papers/2605.22765 に従う leave-one-out 予測子・補正子方式に基づき、Gibbs 補正子のスウィープを 1 回実行します。

モデルの logits（現在の `sample` で再計算されます）は LOO デノイザーに変換され、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)`) : 現在のデノイジングステップ後の更新されたブロックトークン。

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`、形状 `(batch_size, block_length, vocab_size)`) : 次ステップの自己条件付けのためにそのまま渡される、denoiser の logits。

離散型DDIMスケジューラーの出力クラスです。

