# ScoreSdeVeScheduler

`ScoreSdeVeScheduler` は、分散爆発型確率微分方程式（SDE）スケジューラーです。Yang Song、Jascha Sohl-Dickstein、Diederik P. Kingma、Abhishek Kumar、Stefano Ermon、Ben Poole による論文 [Score-Based Generative Modeling through Stochastic Differential Equations](https://huggingface.co/papers/2011.13456) で紹介されました。

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

*データからノイズを作るのは容易ですが、ノイズからデータを作るのが生成モデリングです。本稿では、ノイズを徐々に注入することで複雑なデータ分布を既知の事前分布へ滑らかに変換する確率微分方程式（SDE）と、ノイズを徐々に除去することで事前分布をデータ分布へ変換する対応する逆時間SDEを提案します。重要なのは、逆時間SDEが、擾乱されたデータ分布の時間依存勾配場（別名、スコア）にのみ依存する点です。スコアベースの生成モデリングの進歩を活用することで、ニューラルネットワークを用いてこれらのスコアを正確に推定し、数値SDEソルバーを用いてサンプルを生成できます。本フレームワークは、スコアベースの生成モデリングや拡散確率モデリングの従来の手法を包含し、新しいサンプリング手順や新しいモデリング機能を実現することを示します。特に、離散化された逆時間SDEの進化における誤差を補正するための予測子-補正子フレームワークを導入します。また、SDEと同じ分布からサンプリングする等価なニューラルODEを導出し、これにより厳密な尤度計算とサンプリング効率の向上が可能になります。さらに、クラス条件付き生成、画像インペインティング、カラー化に関する実験で示すように、スコアベースモデルを用いた逆問題の解法を新たに提供します。複数のアーキテクチャの改善と組み合わせることで、CIFAR-10における無条件画像生成でInception score 9.89、FID 2.20という記録的な性能を達成し、2.99 bits/dimという競争力のある尤度を示すとともに、スコアベースの生成モデルから初めて1024 x 1024の高忠実度画像生成を実現しました。*

## ScoreSdeVeScheduler[[diffusers.ScoreSdeVeScheduler]]

#### diffusers.ScoreSdeVeScheduler[[diffusers.ScoreSdeVeScheduler]]

```python
diffusers.ScoreSdeVeScheduler(num_train_timesteps: int = 2000, snr: float = 0.15, sigma_min: float = 0.01, sigma_max: float = 1348.0, sampling_eps: float = 1e-05, correct_steps: int = 1)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L45)

**パラメータ:**

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

snr (`float`、デフォルト値は 0.15) : `model_output` サンプル（ネットワーク由来）からランダムノイズへのステップを重み付けする係数。

sigma_min (`float`、デフォルト値は 0.01) : サンプリング手順におけるシグマシーケンスの初期ノイズスケールです。最小シグマは、データの分布を反映するべきです。

sigma_max (`float`、デフォルト値は 1348.0) : モデルに渡される連続タイムステップの範囲に使用される最大値。

sampling_eps (`float`、デフォルト値は 1e-5) : ステップが 1 から epsilon へ段階的に減少するサンプリングの終了値。

correct_steps (`int`、デフォルトは 1) : 生成されたサンプルに対して実行される補正ステップの数。

`ScoreSdeVeScheduler` は、分散爆発型確率微分方程式（SDE）スケジューラーです。

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

#### add_noise[[diffusers.ScoreSdeVeScheduler.add_noise]]

```python
add_noise(original_samples: Tensor, noise: Tensor, timesteps: Tensor)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L300)

**パラメータ:**

original_samples (`torch.Tensor`) : ノイズが加えられる元のサンプル。

noise (`torch.Tensor`) : 元のサンプルに追加するノイズのテンソル。

timesteps (`torch.Tensor`) : ノイズを追加するタイムステップ。スケジュールに基づいてノイズレベルを決定します。

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

タイムステップスケジュールに従ってスケーリングされたノイズが加えられたノイズ付きサンプル。

指定されたタイムステップにおけるノイズスケジュールに従って、元のサンプルにノイズを追加します。これはフォワード拡散プロセスです。

#### get_adjacent_sigma[[diffusers.ScoreSdeVeScheduler.get_adjacent_sigma]]

```python
get_adjacent_sigma(timesteps: Tensor, t: Tensor)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L156)

**パラメータ:**

timesteps (`torch.Tensor`) : 離散タイムステップのインデックスのテンソル。

t (`torch.Tensor`) : 連続的なタイムステップ値のテンソル。

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

隣接する（直前の）タイムステップインデックスの sigma 値。

直前のタイムステップインデックスに対応するシグマ値を返します。タイムステップがゼロ（直前のタイムステップが存在しない）の場合、ゼロを返します。

#### scale_model_input[[diffusers.ScoreSdeVeScheduler.scale_model_input]]

```python
scale_model_input(sample: Tensor, timestep: int | None = None)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L88)

**パラメータ:**

sample (`torch.Tensor`) : 入力サンプル。

timestep (`int`, *任意*) : 拡散チェーンにおける現在のタイムステップ。

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

スケーリングされた入力サンプル。

現在のタイムステップに応じて、デノイジングモデルの入力をスケーリングする必要があるスケジューラとの相互運用性を保証します。

#### set_sigmas[[diffusers.ScoreSdeVeScheduler.set_sigmas]]

```python
set_sigmas(num_inference_steps: int, sigma_min: float | None = None, sigma_max: float | None = None, sampling_eps: float | None = None)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L124)

**パラメータ:**

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

sigma_min (`float`, *任意*) : 初期ノイズスケール値（スケジューラーのインスタンス化時に指定された値を上書きします）。

sigma_max (`float`, *任意*) : 最終的なノイズスケール値（スケジューラーのインスタンス化時に指定した値を上書きします）。

sampling_eps (`float`、*任意*) : 最終タイムステップの値（スケジューラーのインスタンス化時に指定した値を上書きします）。

拡散チェーンで使用されるノイズスケールを設定します（推論の実行前に呼び出します）。`drift` と `diffusion` は、サンプル更新におけるそれぞれの成分の重みを制御します。

#### set_timesteps[[diffusers.ScoreSdeVeScheduler.set_timesteps]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L105)

**パラメータ:**

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

sampling_eps (`float`、*任意*) : 最終タイムステップの値（スケジューラーのインスタンス化時に指定した値を上書きします）。

device (`str` または `torch.device`、*任意*) : timesteps を移動先とするデバイスです。`None` の場合、timesteps は移動されません。

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

#### step_correct[[diffusers.ScoreSdeVeScheduler.step_correct]]

```python
step_correct(model_output: Tensor, sample: Tensor, generator: typing.Optional[torch.Generator] = None, return_dict: bool = True)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L245)

**パラメータ:**

model_output (`torch.Tensor`) : 学習済み拡散モデルからの直接の出力です。

sample (`torch.Tensor`) : 拡散プロセスによって生成されたサンプルの現在のインスタンス。

generator (`torch.Generator`, *任意*) : 乱数生成器。

return_dict (`bool`、*任意*、デフォルトは`True`) : [SchedulerOutput](/docs/diffusers/main/ja/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput)を返すか、`tuple`を返すかを指定します。

**戻り値:** [SchedulerOutput](/docs/diffusers/main/ja/api/schedulers/ipndm#diffusers.schedulers.scheduling_utils.SchedulerOutput) または `tuple`

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

ネットワークの`model_output`に基づいて、予測されたサンプルを修正します。これは、前回のタイムステップの予測を行った後に繰り返し実行されることがよくあります。

#### step_pred[[diffusers.ScoreSdeVeScheduler.step_pred]]

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

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L177)

**パラメータ:**

model_output (`torch.Tensor`) : 学習済み拡散モデルからの直接の出力です。

timestep (`int`) : 拡散チェーンにおける現在の離散タイムステップ。

sample (`torch.Tensor`) : 拡散プロセスによって生成されたサンプルの現在のインスタンス。

generator (`torch.Generator`, *任意*) : 乱数生成器。

return_dict (`bool`、*任意*、デフォルトは `True`) : [SdeVeOutput](/docs/diffusers/main/ja/api/schedulers/score_sde_ve#diffusers.schedulers.scheduling_sde_ve.SdeVeOutput) を返すか、`tuple` を返すかを指定します。

**戻り値:** [SdeVeOutput](/docs/diffusers/main/ja/api/schedulers/score_sde_ve#diffusers.schedulers.scheduling_sde_ve.SdeVeOutput) または `tuple`

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

前回のタイムステップからのサンプルを、SDEを逆方向に適用することで予測します。この関数は、学習済みモデルの出力（最もよく使われるのは予測ノイズ）から拡散過程を伝播させます。

## SdeVeOutput[[diffusers.schedulers.scheduling_sde_ve.SdeVeOutput]]

#### diffusers.schedulers.scheduling_sde_ve.SdeVeOutput[[diffusers.schedulers.scheduling_sde_ve.SdeVeOutput]]

```python
diffusers.schedulers.scheduling_sde_ve.SdeVeOutput(prev_sample: Tensor, prev_sample_mean: Tensor)
```

[ソース](https://github.com/huggingface/diffusers/blob/main/src/diffusers/schedulers/scheduling_sde_ve.py#L29)

**パラメータ:**

prev_sample (`torch.Tensor`、画像の場合は `(batch_size, num_channels, height, width)` の形状) : 前のタイムステップの計算済みサンプル `(x_{t-1})`。`prev_sample` は、デノイジングループの次のモデル入力として使用する必要があります。

prev_sample_mean (`torch.Tensor`、画像の場合は `(batch_size, num_channels, height, width)` の形状) : 過去のタイムステップにわたる `prev_sample` の平均。

スケジューラの`step`関数の出力用のクラス。

