# DiscreteDDIMScheduler

[Structured Denoising Diffusion Models in Discrete State-Spaces](https://huggingface.co/papers/2107.03006) là cơ sở cho `DiscreteDDIMScheduler`, bộ điều độ này lấy mẫu từng vị trí trên canvas từ hậu nghiệm rời rạc chính xác của quá trình phá hủy đồng nhất (D3PM). Nó không có tham số, và bước cuối cùng sẽ cam kết một cách tất định các token được dự đoán. Chế độ predictor-corrector tùy chọn bổ sung các lượt quét Gibbs leave-one-out của [Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation](https://huggingface.co/papers/2605.22765) thông qua `corrector_steps`.

Trình lập lịch này được sử dụng bởi [DiffusionGemmaPipeline](/docs/diffusers/main/vi/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)
```

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

**Tham số:**

num_inference_steps (`int`, mặc định là 32) : Số bước khử nhiễu, xác định lưới thời gian tuyến tính mà posterior được đánh giá trên đó.

corrector_steps (`int`, mặc định là 0) : Số lần quét của bộ hiệu chỉnh Gibbs được thực hiện sau mỗi bước dự báo. `0` khôi phục quá trình lấy mẫu DDIM tổ tiên thông thường.

corrector_k (`int`, mặc định là 1) : Số vị trí được lấy mẫu lại trong mỗi lượt quét của bộ hiệu chỉnh.

corrector_selection (`str`, mặc định là `"lowest_log_margin"`) : Cách các vị trí được lấy mẫu lại được chọn: `"lowest_log_margin"`, `"lowest_maxprob"`, `"lowest_current_prob"`, hoặc `"random"`.

corrector_selection_tau (`float`, mặc định là 1.0) : Nhiệt độ của việc chọn vị trí Gumbel-top-k (thấp hơn nghĩa là tham lam hơn).

Trình lập lịch DDIM rời rạc cho quá trình phá hủy đồng đều, dựa theo "Structured Denoising Diffusion Models in Discrete State-Spaces" (D3PM, https://huggingface.co/papers/2107.03006).

Trên lịch trình tuyến tính, xác suất sống sót của một token sạch tại thời điểm `t` là `alpha(t) = 1 - t`. Một bước khử nhiễu từ thời điểm `t` đến `s < t` sẽ lấy mẫu mọi vị trí khối từ hậu nghiệm chính xác `q(x_s | x_t, x0)`, mà đối với kernel đều thì phân rã thành ba đường dẫn: nhảy sang token sạch dự đoán `x0`, giữ nguyên token hiện tại, hoặc nhảy sang một token ngẫu nhiên đều. Khác với khuếch tán có mặt nạ, không có token mặt nạ; các vị trí chưa cam kết mang các token ngẫu nhiên.

Chế độ predictor-corrector tùy chọn tuân theo "Uniform Diffusion Models Revisited: Leave-One-Out Denoiser and Absorbing State Reformulation" thông qua bộ khử nhiễu leave-one-out (LOO) (https://huggingface.co/papers/2605.22765). Khi `corrector_steps > 0`, pipeline sẽ thực hiện số lượt quét corrector Gibbs tương ứng sau mỗi bước predictor (xem [step_correct()](/docs/diffusers/main/vi/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMScheduler.step_correct)), lấy mẫu lại các vị trí kém tự tin nhất từ điều kiện một tọa độ `Cat(alpha_s * x0_loo + (1 - alpha_s) / K)` trong khi giữ nguyên các vị trí còn lại, điều này giữ bất biến phân phối biên `p_s` và cải thiện chất lượng sinh mà không phát sinh chi phí huấn luyện.

#### bước[[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)
```

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

**Tham số:**

model_output (`torch.Tensor` có hình dạng `(batch_size, block_length, vocab_size)`) : Logit thô từ mô hình cho khối hiện tại.

timestep (`int` hoặc `torch.Tensor`) : Chỉ số bước hiện tại trong lịch trình khử nhiễu, nằm trong khoảng `[0, num_inference_steps - 1]`.

sample (`torch.LongTensor` có hình dạng `(batch_size, block_length)`) : Các ID token của khối hiện tại `x_t`.

temperature (`float`) : Nhiệt độ lấy mẫu được áp dụng cho logits khi rút `x0`.

generator (`torch.Generator`, *tùy chọn*) : RNG để lấy mẫu.

return_dict (`bool`) : Xác định việc trả về một [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput) hay một tuple thông thường.

Mẫu khối tiếp theo từ hậu nghiệm `q(x_s | x_t, x0)` của quá trình làm hỏng đồng đều.

Với `a = alpha_t / alpha_s` (xác suất sống sót từ `s` đến `t`) và `b = alpha_s`, khối lượng hậu nghiệm của mỗi tuyến đường là

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

do đó bước cuối cùng (`b = 1`) cam kết một cách tất định các token sạch đã dự đoán.

#### 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)
```

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

**Tham số:**

model_output (`torch.Tensor` có hình dạng `(batch_size, block_length, vocab_size)`) : Logit thô từ mô hình được tính lại trên `sample` hiện tại (sau predictor).

timestep (`int` hoặc `torch.Tensor`) : Chỉ số bước dự đoán vừa hoàn thành; bước hiệu chỉnh được thực hiện tại điểm lưới tiếp theo `s`.

sample (`torch.LongTensor` có shape `(batch_size, block_length)`) : Các ID token của khối hiện tại cần tinh chỉnh.

generator (`torch.Generator`, *tùy chọn*) : RNG để lấy mẫu.

return_dict (`bool`) : Xác định việc trả về một [DiscreteDDIMSchedulerOutput](/docs/diffusers/main/vi/api/schedulers/discrete_ddim#diffusers.DiscreteDDIMSchedulerOutput) hay một tuple thông thường.

Chạy một lượt quét corrector Gibbs tại thời điểm sau predictor `s`, theo phương pháp predictor-corrector leave-one-out của https://huggingface.co/papers/2605.22765.

Các logits của mô hình (được tính lại trên `sample` hiện tại) được chuyển đổi thành bộ khử nhiễu LOO, điều kiện một tọa độ `p_s(x^l | x^{-l}) = Cat(alpha_s * x0_loo + (1 - alpha_s) / K)` được hình thành, các vị trí `corrector_k` kém tự tin nhất được chọn, và các vị trí đó được lấy mẫu lại trong khi phần còn lại được giữ nguyên. Quá trình quét này bảo toàn `p_s`, do đó nó tinh chỉnh mẫu mà không thay đổi phân phối biên của nó và không cần huấn luyện thêm.

## 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)
```

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

**Tham số:**

prev_sample (`torch.LongTensor` có hình dạng `(batch_size, block_length)`) : Các token khối đã cập nhật sau bước khử nhiễu hiện tại.

sampled_tokens (`torch.LongTensor` có hình dạng `(batch_size, block_length)`) : Các ID token được lấy mẫu từ logits của mô hình, tức là các token sạch dự đoán `x0`.

sampled_probs (`torch.Tensor` có hình dạng `(batch_size, block_length)`) : Xác suất của các token được lấy mẫu.

pred_logits (`torch.Tensor` có shape `(batch_size, block_length, vocab_size)`) : Các logits của denoiser, được truyền qua để tự điều kiện cho bước tiếp theo.

Lớp đầu ra cho trình lập lịch DDIM rời rạc.

