common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Community

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

DDPM論文を読むための基礎知識

Yuichiro Minato

2024/08/29 02:38

DDPM論文を読むための基礎知識1

こんにちは!今回は、DDPM(Denoising Diffusion Probabilistic Models)の論文を理解するために必要な基礎知識を解説します。これらの概念を押さえておくと、論文の内容がより分かりやすくなります。

Denoising Diffusion Probabilistic Models
https://arxiv.org/pdf/2006.11239

DDPMの概要

**DDPM(Denoising Diffusion Probabilistic Models)**は、生成モデルの一種で、ノイズを段階的に追加する「拡散プロセス」と、その逆の「逆拡散プロセス」を学習して、高品質なデータを生成するモデルです。モデルはマルコフ連鎖を利用して、初期状態からノイズを徐々に除去しながら、データを生成していきます。DDPMはGANやVAEに代わる新しいアプローチとして、画像生成タスクで優れた性能を示しています。

ガウス分布(正規分布)とは?

ガウス分布は、データが平均値の周りに左右対称に分布する確率分布です。数式で表すと、次のようになります:

N(x; \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)

ここで、\mu は平均、\sigma^2 は分散です。DDPMでは、データにノイズを加えるためにこの分布が用いられます。

DDPMの文中の表記例について

p(x_T) = N(x_T; 0, I) は、確率分布を表しています。具体的には、これは正規分布(ガウス分布)を表すもので、x_T が平均0、共分散行列 I を持つ正規分布に従うことを意味します。

  • p(x_T) : x_T の確率分布。
  • N(x_T; 0, I): 平均0、共分散行列I を持つ正規分布。

つまり、x_T が「平均0、分散 I」の正規分布からサンプルされたデータであることを示しています。

平均は中心の位置、分散は広がり具合を表しているようです。

生成されたコードをローカル環境で実行することで、2次元ガウス分布 N(x_T; 0, I) のサンプルを表示できます。

import numpy as np
import matplotlib.pyplot as plt

# パラメータの設定
mean = 0
cov = np.eye(2)  # 共分散行列I

# サンプルの生成
x_T = np.random.multivariate_normal([mean, mean], cov, 5000)

# プロット
plt.figure(figsize=(8, 6))
plt.scatter(x_T[:, 0], x_T[:, 1], alpha=0.5)
plt.title(r"2D Gaussian Distribution $N(x_T; 0, I)$")
plt.xlabel("x1")
plt.ylabel("x2")
plt.grid(True)
plt.show()

image

このコードは、平均が0で共分散行列が単位行列の2次元ガウス分布から5000個のサンプルを生成し、散布図としてプロットします。結果として、2次元平面上に正規分布のサンプルが表示されます。

逆拡散過程

同時分布 ( p_\theta(x_{0:T}) ) は逆過程と呼ばれ、これは学習されたガウス遷移を持つマルコフ連鎖として定義されます。この過程は、( p(x_T) = N(x_T; 0, I) ) から始まります。

p_\theta(x_{0:T}) := p(x_T) \prod_{t=1}^{T} p_\theta(x_{t-1} | x_t), \quad p_\theta(x_{t-1} | x_t) := \mathcal{N}(x_{t-1}; \mu_\theta(x_t, t), \Sigma_\theta(x_t, t)) \tag{1}

式は論文そのままを引用しました。

拡散過程

「拡散モデルが他の潜在変数モデルと異なる点は、近似事後分布 q(x_{1:T} | x_0) が前向き過程または拡散過程と呼ばれ、マルコフ連鎖として固定されていることです。このマルコフ連鎖は、分散スケジュール \beta_1, \ldots, \beta_T に従ってデータにガウスノイズを徐々に追加していきます。具体的には、

q(x_{1:T} | x_0) := \prod_{t=1}^{T} q(x_t | x_{t-1}), \quad q(x_t | x_{t-1}) := N(x_t; \sqrt{1 - \beta_t} x_{t-1}, \beta_t I)

という形で表されます。」

スケジュールにベータのパラメータが入っているので、与えるガウス分布がパラメータに依存しているのが特徴のようです。

負の対数尤度関数

負の対数尤度関数(Negative Log-Likelihood, NLL)は、統計学や機械学習で頻繁に使用される目的関数で、観測データに対するモデルの適合度を評価するために用いられます。以下、負の対数尤度関数について詳しく説明します。

尤度とは?

まず、**尤度(Likelihood)**とは、観測データが特定のモデルやパラメータの下でどれくらいもっともらしいかを表す尺度です。尤度は通常、観測データ x が与えられたとき、モデルのパラメータ \theta の下での確率 p(x|\theta) で表されます。

尤度関数の定義

観測データ x_1, x_2, \dots, x_n の集合に対する尤度関数は次のように定義されます:

L(\theta) = p(x_1, x_2, \dots, x_n|\theta) = \prod_{i=1}^{n} p(x_i|\theta)

この関数は、パラメータ \theta が観測データにどれだけ適合しているかを示します。

対数尤度関数

尤度関数は掛け算によって値が計算されるため、計算が複雑になることがあります。そのため、通常は対数を取った**対数尤度関数(Log-Likelihood)**を使用します:

\log L(\theta) = \sum_{i=1}^{n} \log p(x_i|\theta)

対数を取ることで、尤度の積が和に変換され、計算が簡単になります。

手順を手元で確認できるように、以下のコードを用意しました。これを実行することで、途中過程を確認できます。

import numpy as np

# サンプルデータ: 各データポイントの尤度
likelihoods = np.array([0.1, 0.5, 0.2, 0.4])

# 尤度の積を計算
product_of_likelihoods = np.prod(likelihoods)
print("尤度の積:", product_of_likelihoods)

# 各尤度の対数を計算
log_likelihoods = np.log(likelihoods)

# 各対数の値を表示
print("各尤度の対数:")
for i, log_likelihood in enumerate(log_likelihoods):
    print(f"log_likelihood[{i}] = {log_likelihood}")

# 対数を取った後に、それぞれの和を計算
log_sum_individual = log_likelihoods[0] + log_likelihoods[1] + log_likelihoods[2] + log_likelihoods[3]
print("対数の和:", log_sum_individual)

# 対数を取った後の和に指数を取る
exp_log_sum_individual = np.exp(log_sum_individual)
print("対数を取った後の和の指数:", exp_log_sum_individual)

結果の解説

  1. 尤度の積:

    product_of_likelihoods = np.prod(likelihoods)
    

    これにより、尤度の積が計算されます。

  2. 各尤度の対数:

    log_likelihoods = np.log(likelihoods)
    

    各尤度に対して対数を取った値が計算されます。

  3. 対数の和:

    log_sum_individual = log_likelihoods[0] + log_likelihoods[1] + log_likelihoods[2] + log_likelihoods[3]
    

    各対数値を足し合わせていくことで、合計が計算されます。

  4. 和の指数を取る:

    exp_log_sum_individual = np.exp(log_sum_individual)
    

    最後に、対数の和に指数を取ることで、元の尤度の積と同じ値が得られることを確認できます。

尤度の積: 0.004000000000000001
各尤度の対数:
log_likelihood[0] = -2.3025850929940455
log_likelihood[1] = -0.6931471805599453
log_likelihood[2] = -1.6094379124341003
log_likelihood[3] = -0.916290731874155
対数の和: -5.521460917862246
対数を取った後の和の指数: 0.004000000000000002

これらの手順を通じて、尤度の積を直接計算する代わりに、対数を取ってから足し合わせることで計算が容易になることが確認できます。

負の対数尤度関数

機械学習では、モデルをトレーニングする際に、この対数尤度を最大化するのではなく、**負の対数尤度(Negative Log-Likelihood, NLL)**を最小化する形で学習を行います。負の対数尤度関数は次のように定義されます:

-\log L(\theta) = -\sum_{i=1}^{n} \log p(x_i|\theta)

なぜ負の対数尤度を使うのか?

負の対数尤度を最小化することは、対数尤度を最大化することと同じ意味です。最大化問題を最小化問題として扱うことが多い機械学習の文脈では、負の対数尤度を最小化する方が一般的です。これにより、モデルが観測データにより適合するようにパラメータが調整されます。

変分下限(Variational Bound)

変分下限は、負の対数尤度を直接計算するのが困難な場合に、その代替として用いられるものです。具体的には、観測データに対する真の尤度を直接最大化するのではなく、近似的に最大化可能な下限値(つまり、変分下限)を設定し、その下限を最大化することでモデルの学習を行います。

この変分下限は、観測データと潜在変数の結合分布を考慮に入れたもので、通常は次のように定義されます:

\log p(x) \geq \mathbb{E}_q\left[\log p(x, z) - \log q(z|x)\right]

ここで:

  • p(x, z) は観測データ x と潜在変数 z の同時分布。
  • q(z|x)z の近似事後分布。

負の対数尤度に対する変分下限の最適化

負の対数尤度に対する変分下限を最適化するというのは、この下限を最大化することで、モデルが観測データに対してより適合するようにパラメータを調整するプロセスです。変分下限が高くなるということは、モデルが観測データをよりよく説明できることを意味します。

拡散モデルのトレーニング(学習)における目的関数

トレーニングの目的

トレーニングは、負の対数尤度に対する通常の変分下限(variational bound)を最適化することで行われます。変分下限は、モデルが観測データをどれだけうまく説明しているかを示す指標です。

式の解釈

論文中の式は次のように表されます:

E [-\log p_\theta(x_0)] \leq E_q \left[ - \log \frac{p_\theta(x_{0:T})}{q(x_{1:T} | x_0)} \right] = E_q \left[ - \log p(x_T) - \sum_{t \geq 1} \log \frac{p_\theta(x_{t-1} | x_t)}{q(x_t | x_{t-1})} \right] =: L

1.期待値 E[-\log p_\theta(x_0)] の意味

この部分は、モデル p_\theta が観測データ x_0 をどれだけうまく説明できるかを示す指標であり、これを最小化することがトレーニングの目標となります。

2. 変分下限の導入

この式では、上記の期待値が変分下限によって評価されます。変分下限は、観測データ x_0 に対する事後分布 q(x_{1:T} | x_0) を使って、モデルのパフォーマンスを近似する手法です。

3. ロス関数 L の導出

最後に、これを分解していくと、ロス関数 L が得られます。このロス関数は、以下の2つの項から構成されます:

  • -\log p(x_T): 終端状態 x_T の尤度。
  • \sum_{t \geq 1} \log \frac{p_\theta(x_{t-1} | x_t)}{q(x_t | x_{t-1})}: 各ステップでの再構成誤差。

このロス関数 L を最小化することで、モデルが観測データをよりうまく生成できるように学習されます。

次に確率的生成モデルにおける前向き過程(forward process)と逆向き過程(reverse process)の説明です。

1. 前向き過程と逆向き過程の関係

まず、前向き過程のパラメータ \beta_t は学習可能なパラメータとして扱うことができます(これは再パラメータ化により学習可能になる)か、もしくはハイパーパラメータとして固定することができます。文中で述べられているように、逆向き過程の表現力(expressiveness)は、特に p_{\theta}(x_{t-1} | x_t) におけるガウス条件付き分布の選択によって担保されます。前向きと逆向きの過程が似た形状を持つのは、 \beta_t が小さい場合です。

2. 前向き過程の性質

前向き過程の重要な特性の1つは、任意のタイムステップ tx_t を閉形式(closed form)でサンプリングできることです。具体的には、次の記法を使って説明されています。

\alpha_t := 1 - \beta_t \quad \text{および} \quad \bar{\alpha}_t := \prod_{s=1}^{t} \alpha_s

この記法を用いると、 x_0 から x_t までのマルチステップ過程の分布 q(x_t | x_0) は次のようにガウス分布として表現できます。

q(x_t | x_0) = N \left( x_t; \sqrt{\bar{\alpha}_t} x_0, (1 - \bar{\alpha}_t) I \right)

この式では、 N(\mu, \Sigma) が平均 \mu と分散 \Sigma を持つガウス分布を表します。\alpha_t\bar{\alpha}_t が組み合わさることで、 x_0 に対する条件付き分布が導出されています。

3. 効率的な訓練

このモデルでは、効率的な訓練が可能です。なぜなら、L(損失関数)のランダムな項を最適化するために確率的勾配降下法(stochastic gradient descent, SGD)を用いることができるからです。

その上で、損失関数 L は次のように変形することで、さらに改善されます。

L = \mathbb{E}_q \left[ D_{\text{KL}}(q(x_T | x_0) \parallel p(x_T)) \right] + \sum_{t>1} \mathbb{E}_q \left[ D_{\text{KL}}(q(x_{t-1} | x_t, x_0) \parallel p_{\theta}(x_{t-1} | x_t)) \right] - \log p_{\theta}(x_0 | x_1)

この式の各項について説明します:

  • 第1項 (L_T) :q(x_T | x_0)p(x_T) との間のKLダイバージェンスを表します。これは、最終状態 x_T がどれだけターゲット分布に近いかを測定するものです。

  • 第2項 (L_{t-1}) :各ステップにおける q(x_{t-1} | x_t, x_0)p_{\theta}(x_{t-1} | x_t) との間のKLダイバージェンスです。これは逆向き過程のモデル p_{\theta} の学習を促進します。

  • 第3項 (L_0) :p_{\theta}(x_0 | x_1) の対数尤度を最大化する項です。この項は、最初のデータ(生成されたサンプル)が正しいかどうかの最終的な確認に相当します。

このように、L はトレーニングプロセスの各ステップで異なる種類の損失を組み合わせてモデルを最適化していくため、トレーニング全体が効率的になります。

1. KLダイバージェンスを使った比較

まず、KLダイバージェンスがどのように使われているかというと、逆向きの条件付き確率分布 p_{\theta}(x_{t-1} | x_t) と、前向き過程の事後分布(forward process posterior) q(x_{t-1} | x_t, x_0) を直接比較します。q(x_{t-1} | x_t, x_0)x_0 に条件付けされているため、この分布は「扱いやすい」(tractable)形をしています。

具体的に、q(x_{t-1} | x_t, x_0) は次のようにガウス分布として表現されます:

q(x_{t-1} | x_t, x_0) = N(x_{t-1}; \tilde{\mu}_t(x_t, x_0), \tilde{\beta}_t I)

ここで、平均 \tilde{\mu}_t(x_t, x_0) と分散 \tilde{\beta}_t は以下のように定義されます:

\tilde{\mu}_t(x_t, x_0) := \frac{\sqrt{\bar{\alpha}_{t-1}}\beta_t}{1 - \bar{\alpha}_t} x_0 + \frac{\sqrt{\alpha_t}(1 - \bar{\alpha}_{t-1})}{1 - \bar{\alpha}_t} x_t
\tilde{\beta}_t := \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t} \beta_t

この式では、\tilde{\mu}_tx_tx_0 の線形結合で表現されています。\tilde{\mu}_t\tilde{\beta}_t は、前向き過程のパラメータ \alpha_t\beta_t に依存しており、これにより前向き過程の事後分布が定義されています。

2. KLダイバージェンスの計算

KLダイバージェンスは、2つのガウス分布間の比較を行うので、両者がガウス分布であることから、KLダイバージェンスの計算は非常に簡単になります。具体的には、2つのガウス分布間のKLダイバージェンスは、閉形式で計算可能です。これにより、計算の不確実性やばらつきが減り、モンテカルロ法を使わずに計算ができます。

この計算方法は、Rao-Blackwell化された手法として知られています。Rao-Blackwell化は、確率的推定の分散を減らすために使われるテクニックで、ここではKLダイバージェンスを効率的に計算するために活用されています。

これらの基礎知識を理解することで、DDPMの論文の内容がよりクリアに理解できるようになります。

© 2024, blueqat Inc. All rights reserved