Denoising Diffusion Probabilistic Modelsの個人的理解用メモ

# 論文情報
[Denoising Diffusion Probabilistic Models, Jonathan Hoら, 2020](https://arxiv.org/abs/2006.11239)

# 論文の立ち位置
diffusionの実用化に大きく貢献した論文。これでかなり広まった。ベースは[こちら](https://qiita.com/ma_si_/items/1a945183775899f263df)。

# 簡単な説明
- 拡散モデルで、高品質な画像を作れることを示した。
- 係数を無視したlossを使ったら学習がうまくいった。
- デノイズ結果ではなく、乗っているノイズを予測した方がうまくいった。
- 途中の$x_t$を混ぜたら、画像を補完できた。

# 説明
拡散モデルでは、ノイズデータ$x_T$から徐々にノイズを除去していって、データ$x_0$を生成する。よって、学習時はデータ$x_0$にノイズ$\epsilon$を乗せたノイズ入りデータ$x_t$を入力として、乗っているノイズ$\epsilon$を推定する。
**データにノイズを乗せる**
```math
x_t = \sqrt{\overline{\alpha_t}}x_0+\sqrt{1-\overline{\alpha_t}}\epsilon
\\
\epsilon \sim \mathcal{N}(0, I)
\\
\overline{\alpha_t}:=\prod_{s = 1}^{t} \alpha_s
```
**ノイズを除去する**
```math
p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_{t-1};\mu_\theta(x_t, t), \Sigma_\theta(x_t, t))
```
学習時以外は、$\Sigma_\theta(x_t, t)=\sigma_t^2I$に固定。$\sigma_t^2I=\beta_t$とか、$\sigma_t^2I=\frac{1-\overline{\alpha_{t-1}}}{1-\overline{\alpha_t}}$にする。結果下記になる。
```math
p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_{t-1};\mu_\theta(x_t, t), \sigma_t^2I)
```
**学習時のロス**
ノイズを予測する関数を$\epsilon_\theta(x_t, t)$とする。
```math
\mathbb{E}_{x_0, \epsilon}[\frac{\beta_t^2}{2\sigma_t^2\alpha_t(1-\overline{\alpha_t})}||\epsilon-\epsilon_\theta(x_t, t)||^2]
```
**学習時のロスの係数を無視する**
```math
\mathbb{E}_{x_0, \epsilon}[||\epsilon-\epsilon_\theta(x_t, t)||^2]
```
これで学習がうまくいった。
# 損失関数の詳細
**損失関数のstart**
```math
\mathbb{E_{q(x_0)}}[-\log p_\theta(x_0)]
```
　$x_0$はノイズ無しのデータ。$p_\theta$はパラメータ$\theta$の学習対象の確率分布なので、$p_\theta(x_0)$はその確率分布における$x_0$の確率となる。負の対数をとっているので、確率が1に近いほど0に近づき、0に近づくほど無限大に近づく。つまり、$p_\theta(x_0)$が1に近い（ノイズのないデータ$x_0$の確率が高くなるよう学習する）と$-\log p_\theta(x_0)$は小さくなる（損失関数が小さくなる）→良いということ。さらに$q(x_0)$はノイズ無しデータ$x_0$の真の分布でその期待値をとる。
**損失関数の変分下限**

　上記を式変形すると以下になる（詳細は[こちらのブログ様](https://qiita.com/iitachi_tdse/items/6cdd706efd0005c4a14a)など参照）。
```math
\mathbb{E_{q(x_0)}}[-\log p_\theta(x_0)]\leq L
\\
L = \mathbb{E_{q(x_0)}}[L_T+\sum_{t>1}L_{t-1}+L_0]
```
結局Lを下げれば、先ほどの損失関数も一緒に下がるので、Lが下がるように学習していく。

**$L_T$の項**
```math
L_T = D_{KL}(q(x_T|x_0)\parallel p(x_T))
```
$q(x_T|x_0)$はノイズ無しのデータ$x_0$にノイズを乗せていったときにできる、ノイズオンリーのデータ$x_T$の確率分布。一方$p(x_T)$はノイズオンリーのデータをガウス分布とするので、特に学習するもの($\theta$)に依存するものはない。よってこの項は無視。
**$L_0$の項**
```math
L_0 = -\log p_\theta(x_0|x_1)
```
これは定義通り([説明](#-説明)参照)。

**$L_{T-1}$の項**
```math
L_{T-1} = D_{KL}(q(x_{t-1}|x_t, x_0)\parallel p_\theta(x_{t-1}|x_t))
```
$q(x_{t-1}|x_t, x_0)$は、$x_t$と$x_0$がわかっているときの$x_{t-1}$の分布。これは、解析に解析的に計算可能→$\mathcal{N}(x_{t-1};\tilde{\mu}_t(x_t, x_0), \tilde{\beta}_t I)$。

$p_\theta(x_{t-1}|x_t)$は、$x_t$をデノイズした時の、$x_{t-1}$の分布。$p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_{t-1};\mu_\theta(x_t, t), \Sigma_\theta(x_t, t))$だが、$\Sigma_\theta(x_t, t)=\sigma_t^2I$と学習せずに計算で出してしまう。($\sigma_t^2=\beta_t$(ノイズを乗せる時の分散)か$\sigma_t^2=\tilde{\beta}_t$(解析的な真値))すると、下記になる。

```math
L_{T-1} = \mathbb{E_{q(x_0)}}[\frac{1}{2\sigma_t^2}||\tilde{\mu}_t(x_t, x_0)-\mu_\theta(x_t(x_0, \epsilon), t)||^2]+C
```
ここから、予測をデータ$\mu_\theta$ではなくノイズ$\epsilon_\theta$にして、係数を無視すると下記になる。
```math
\mathbb{E}_{x_0, \epsilon}[||\epsilon-\epsilon_\theta(x_t, t)||^2]
```
# コード中のサンプリングの補足
$x_0$を明示的に算出してから、サンプリングしているので要注意（後日追記します）



# Abstract
拡散モデルで高品質な画像が生成できた。

# Introduction
拡散モデルで高品質な画像生成が作れるという実証はなかった。さらに、拡散モデルのパラメーター化が、トレーニング中の複数のノイズレベルにわたるノイズ除去スコアマッチングと、サンプリング中のアニールされたランジュバンダイナミクスと同等であることを示す。

# Background
- データ分布
    - $q(x_0)$
- データ
    - $x_0\sim q(x_0)$
- ノイズ入りデータ
    - $x_1, ..., x_T$
- 生成モデルのデータ分布
    - $p_\theta(x_0):= \int p_\theta(x_{0:T})dx_{1:T}
$
- 逆拡散プロセスのスタート時のデータ
    - $p(x_T)=\mathcal{N}(x_T; 0, I)$
- 逆拡散プロセス
$x_T$から始めて、ノイズをとっていって、$x_0$を作る。その過程の同時分布は下記になる。
```math
p_\theta(x_{0:T}):=p(x_T)\prod_{t=1}^{T}p_\theta(x_{t-1}|x_t)
\\
p_\theta(x_{t-1}|x_t):=\mathcal{N}(x_{t-1};\mu_\theta(x_t, t), \Sigma_\theta(x_t, t))
```
- 分散のスケジュール
    - $\beta_1,...\beta_T$
    
拡散プロセス$q(x_{1:T}|x_0)$はマルコフ連鎖で作られる
```math
q(x_{1:T}|x_0):=\prod_{t=1}^Tq(x_t|x_{t-1})
\\
q(x_t|x_{t-1}):=\mathcal{N}(x_t|\sqrt{1-\beta_t}x_{t-1}, \beta_tI)
```
以下工事中

# その他
内容に問題がある場合も責任は持てません。
コメントをいただければ修正します。