# VQDiffusionScheduler

`VQDiffusionScheduler` は、transformer モデルの出力を、直前の拡散タイムステップにおけるノイズ除去済み画像のサンプルに変換します。Shuyang Gu、Dong Chen、Jianmin Bao、Fang Wen、Bo Zhang、Dongdong Chen、Lu Yuan、Baining Guo による [Vector Quantized Diffusion Model for Text-to-Image Synthesis](https://huggingface.co/papers/2111.14822) で紹介されました。

論文の抄録は以下の通りです：

*テキストから画像を生成するためのベクトル量子化拡散（VQ-Diffusion）モデルを提案します。この手法は、潜在空間を最近開発されたDenoising Diffusion Probabilistic Model（DDPM）の条件付きバリアントでモデル化するベクトル量子化変分オートエンコーダ（VQ-VAE）に基づいています。この潜在空間手法は、既存の手法に存在する一方向性のバイアスを排除するだけでなく、既存の手法における深刻な問題である誤差の蓄積を回避するために、マスクと置換の拡散戦略を組み込むこともできるため、テキストから画像を生成するタスクに非常に適していることがわかりました。実験により、同程度のパラメータ数を持つ従来の自己回帰（AR）モデルと比較した場合、VQ-Diffusionははるかに優れたテキストから画像を生成する結果をもたらすことが示されました。従来のGANベースのテキストから画像を生成する手法と比較すると、VQ-Diffusionはより複雑なシーンを処理でき、合成画像の品質を大幅に向上させることができます。最後に、当社の手法における画像生成の計算を、再パラメータ化によって非常に効率的にできることを示します。従来のAR手法では、テキストから画像を生成する時間は出力画像の解像度に対して線形に増加するため、通常のサイズの画像であってもかなり時間がかかります。VQ-Diffusionにより、品質と速度の間のより良いトレードオフを実現できます。実験の結果、再パラメータ化を備えたVQ-Diffusionモデルは、従来のAR手法よりも15倍速く、より良い画像品質を実現していることが示されました。*

## VQDiffusionScheduler[[diffusers.VQDiffusionScheduler]]

#### diffusers.VQDiffusionScheduler[[diffusers.VQDiffusionScheduler]]

```python
diffusers.VQDiffusionScheduler(num_vec_classes: int, num_train_timesteps: int = 100, alpha_cum_start: float = 0.99999, alpha_cum_end: float = 9e-06, gamma_cum_start: float = 9e-06, gamma_cum_end: float = 0.99999)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_vq_diffusion.py#L142)

**パラメータ:**

num_vec_classes (`int`) : 潜在ピクセルのベクトル埋め込みのクラス数です。マスクされた潜在ピクセルのクラスを含みます。

num_train_timesteps (`int`、デフォルトは`100`) : モデルを学習するための拡散ステップ数。

alpha_cum_start (`float`、デフォルトは `0.99999`) : 初期の累積アルファ値です。

alpha_cum_end (`float`、デフォルトは`0.000009`) : 終了時の累積アルファ値。

gamma_cum_start (`float`、デフォルトは`0.000009`) : 初期の累積ガンマ値です。

gamma_cum_end (`float`、デフォルトは `0.99999`) : 終了時の累積ガンマ値です。

ベクトル量子化拡散のためのスケジューラー。

このモデルは [SchedulerMixin](/docs/diffusers/v0.43.0/ja/api/schedulers/overview#diffusers.SchedulerMixin) と [ConfigMixin](/docs/diffusers/v0.43.0/ja/api/configuration#diffusers.ConfigMixin) を継承しています。読み込みや保存など、ライブラリがすべてのスケジューラに対して実装している汎用的なメソッドについては、スーパークラスのドキュメントを参照してください。

#### apply_cumulative_transitions[[diffusers.VQDiffusionScheduler.apply_cumulative_transitions]]

```python
apply_cumulative_transitions(q: Tensor, t: typing.Union[int, torch.Tensor])
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_vq_diffusion.py#L491)

**パラメータ:**

q (`torch.Tensor`、shape `(batch size, num classes - 1, num latent pixels)`) : マスクされていない潜在ピクセルのクラスに対する対数確率。

t (`int` または `torch.Tensor`) : どの累積遷移行列が使用されるかを決定するタイムステップ。

**戻り値:** `torch.Tensor`、形状は `(batch size, num classes, num latent pixels)`

マスククラスの確率が追加された、遷移後の対数確率です。

タイムステップにおける累積遷移行列を、マスクされていないクラスの対数確率に適用します。

#### log_Q_t_transitioning_to_known_class[[diffusers.VQDiffusionScheduler.log_Q_t_transitioning_to_known_class]]

```python
log_Q_t_transitioning_to_known_class(t: typing.Union[int, torch.Tensor], x_t: LongTensor, log_onehot_x_t: Tensor, cumulative: bool)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_vq_diffusion.py#L392)

**パラメータ:**

t (`int` または `torch.Tensor`) : どの遷移行列が使用されるかを決定するタイムステップ。

x_t (`torch.LongTensor`、shape `(batch size, num latent pixels)`) : 時刻 `t` における各潜在ピクセルのクラス。

log_onehot_x_t (`torch.Tensor`、形状 `(batch size, num classes, num latent pixels)`) : `x_t` の log one-hot ベクトルです。

cumulative (`bool`) : `False` の場合、単一ステップの遷移行列 `t-1`->`t` が使用されます。`True` の場合、累積遷移行列 `0`->`t` が使用されます。

**戻り値:** `torch.Tensor`

返される行列の各_列_は、完全確率遷移行列の_行_である対数確率です。`cumulative`が`True`の場合、テンソルの形状は`(batch size, num classes - 1, num latent pixels)`となり、それ以外の場合は`(batch size, num classes, num latent pixels)`となります。

累積の場合、初期の潜在ピクセルをマスクできないため、テンソルは1行少なくなります。

ここで:
- `q_n` は、`n` 番目の潜在ピクセルのフォワードプロセスにおける確率分布です。
- C_0 は潜在ピクセル埋め込みのクラスです
- C_k は、マスクされた潜在ピクセルのクラスです

非累積の結果（対数を省略）:
```
q_0(x_t | x_{t-1} = C_0) ... q_n(x_t | x_{t-1} = C_0)
          .      .                     .
          .               .            .
          .                      .     .
q_0(x_t | x_{t-1} = C_k) ... q_n(x_t | x_{t-1} = C_k)
```

累積結果（対数を省略）:
```
q_0_cumulative(x_t | x_0 = C_0)    ...  q_n_cumulative(x_t | x_0 = C_0)
          .               .                          .
          .                        .                 .
          .                               .          .
q_0_cumulative(x_t | x_0 = C_{k-1}) ... q_n_cumulative(x_t | x_0 = C_{k-1})
```

`x_t`の各潜在ピクセルについて、（累積または非累積の）遷移行列の行の対数確率を計算します。

#### q_posterior[[diffusers.VQDiffusionScheduler.q_posterior]]

```python
q_posterior(log_p_x_0: Tensor, x_t: LongTensor, t: typing.Union[int, torch.Tensor])
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_vq_diffusion.py#L281)

**パラメータ:**

log_p_x_0 (`torch.Tensor`、形状 `(batch size, num classes - 1, num latent pixels)`) : 初期潜在ピクセルの予測クラスに対する対数確率です。初期のノイズなし画像はマスクできないため、マスクされたクラスの予測は含まれません。

x_t (`torch.LongTensor`、shape `(batch size, num latent pixels)`) : 時刻 `t` における各潜在ピクセルのクラス。

t (`int` または `torch.Tensor`) : どの遷移行列が使用されるかを決定するタイムステップ。

**戻り値:** `torch.Tensor`、形状は `(batch size, num classes, num latent pixels)`

タイムステップ `t-1` における、画像の予測クラスに対する対数確率です。

タイムステップ`t-1`における画像の予測クラスに対する対数確率を計算します:

```
p(x_{t-1} | x_t) = sum( q(x_t | x_{t-1}) * q(x_{t-1} | x_0) * p(x_0) / q(x_t | x_0) )
```

#### set_timesteps[[diffusers.VQDiffusionScheduler.set_timesteps]]

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

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_vq_diffusion.py#L214)

**パラメータ:**

num_inference_steps (`int`) : 事前学習済みモデルでサンプルを生成する際に使用される拡散ステップの数。

device (`str` または `torch.device`、*任意*) : timesteps と拡散プロセスのパラメータ (alpha, beta, gamma) を移動先とするデバイス。

拡散チェーンで使用される離散タイムステップを設定します（推論の実行前に実行する必要があります）。

#### ステップ[[diffusers.VQDiffusionScheduler.step]]

```python
step(model_output: Tensor, timestep: typing.Union[int, torch.Tensor], sample: LongTensor, generator: typing.Optional[torch.Generator] = None, return_dict: bool = True)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_vq_diffusion.py#L236)

**パラメータ:**

model_output (`torch.Tensor`、形状 `(batch size, num classes - 1, num latent pixels)`) : 初期潜在ピクセルの予測クラスに対する対数確率です。初期のノイズなし画像はマスクできないため、マスクされたクラスの予測は含まれません。

timestep (`int` または `torch.Tensor`) : どの遷移行列が使用されるかを決定するタイムステップ。

sample (`torch.LongTensor`、shape `(batch size, num latent pixels)`) : 現在のタイムステップにおける、各潜在ピクセルのクラス。

generator (`torch.Generator`, *任意*) : `p(x_{t-1} | x_t)`からサンプリングする前に適用されるノイズ用の乱数生成器。

return_dict (`bool`、デフォルトは`True`) : [VQDiffusionSchedulerOutput](/docs/diffusers/v0.43.0/ja/api/schedulers/vq_diffusion#diffusers.schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput)を返すか、`tuple`を返すかを指定します。

**戻り値:** [VQDiffusionSchedulerOutput](/docs/diffusers/v0.43.0/ja/api/schedulers/vq_diffusion#diffusers.schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput) または `tuple[torch.LongTensor]`

`True` の場合、[VQDiffusionSchedulerOutput](/docs/diffusers/v0.43.0/ja/api/schedulers/vq_diffusion#diffusers.schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput) が返され、それ以外の場合は、最初の要素がサンプルテンソルであるタプルが返されます。

逆遷移分布を用いて、1ステップ前のタイムステップからのサンプルを予測します。分布の計算方法の詳細については、[q_posterior()](/docs/diffusers/v0.43.0/ja/api/schedulers/vq_diffusion#diffusers.VQDiffusionScheduler.q_posterior)を参照してください。

## VQDiffusionSchedulerOutput[[diffusers.schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput]]

#### diffusers.schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput[[diffusers.schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput]]

```python
diffusers.schedulers.scheduling_vq_diffusion.VQDiffusionSchedulerOutput(prev_sample: LongTensor)
```

[ソース](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_vq_diffusion.py#L27)

**パラメータ:**

prev_sample (`torch.LongTensor`、shape `(batch size, num latent pixels)`) : 前回のタイムステップで計算されたサンプル。`prev_sample` は、デノイジングループの次のモデル入力として使用する必要があります。

スケジューラーのステップ関数の出力用の出力クラス。

