DDPM論文を読むための基礎知識1
こんにちは!今回は、DDPM(Denoising Diffusion Probabilistic Models)の論文を理解するために必要な基礎知識を解説します。これらの概念を押さえておくと、論文の内容がより分かりやすくなります。
Denoising Diffusion Probabilistic Models
DDPMの概要
**DDPM(Denoising Diffusion Probabilistic Models)**は、生成モデルの一種で、ノイズを段階的に追加する「拡散プロセス」と、その逆の「逆拡散プロセス」を学習して、高品質なデータを生成するモデルです。モデルはマルコフ連鎖を利用して、初期状態からノイズを徐々に除去しながら、データを生成していきます。DDPMはGANやVAEに代わる新しいアプローチとして、画像生成タスクで優れた性能を示しています。
ガウス分布(正規分布)とは?
ガウス分布は、データが平均値の周りに左右対称に分布する確率分布です。数式で表すと、次のようになります:
ここで、
DDPMの文中の表記例について
式
の確率分布。p(x_T) : x_T : 平均0、共分散行列N(x_T; 0, I) を持つ正規分布。I
つまり、
平均は中心の位置、分散は広がり具合を表しているようです。
生成されたコードをローカル環境で実行することで、2次元ガウス分布
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()
このコードは、平均が0で共分散行列が単位行列の2次元ガウス分布から5000個のサンプルを生成し、散布図としてプロットします。結果として、2次元平面上に正規分布のサンプルが表示されます。
逆拡散過程
同時分布 ( p_\theta(x_{0:T}) ) は逆過程と呼ばれ、これは学習されたガウス遷移を持つマルコフ連鎖として定義されます。この過程は、( p(x_T) = N(x_T; 0, I) ) から始まります。
式は論文そのままを引用しました。
拡散過程
「拡散モデルが他の潜在変数モデルと異なる点は、近似事後分布
という形で表されます。」
スケジュールにベータのパラメータが入っているので、与えるガウス分布がパラメータに依存しているのが特徴のようです。
負の対数尤度関数
負の対数尤度関数(Negative Log-Likelihood, NLL)は、統計学や機械学習で頻繁に使用される目的関数で、観測データに対するモデルの適合度を評価するために用いられます。以下、負の対数尤度関数について詳しく説明します。
尤度とは?
まず、**尤度(Likelihood)**とは、観測データが特定のモデルやパラメータの下でどれくらいもっともらしいかを表す尺度です。尤度は通常、観測データ
尤度関数の定義
観測データ
この関数は、パラメータ
対数尤度関数
尤度関数は掛け算によって値が計算されるため、計算が複雑になることがあります。そのため、通常は対数を取った**対数尤度関数(Log-Likelihood)**を使用します:
対数を取ることで、尤度の積が和に変換され、計算が簡単になります。
手順を手元で確認できるように、以下のコードを用意しました。これを実行することで、途中過程を確認できます。
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)
結果の解説
-
尤度の積:
product_of_likelihoods = np.prod(likelihoods)
これにより、尤度の積が計算されます。
-
各尤度の対数:
log_likelihoods = np.log(likelihoods)
各尤度に対して対数を取った値が計算されます。
-
対数の和:
log_sum_individual = log_likelihoods[0] + log_likelihoods[1] + log_likelihoods[2] + log_likelihoods[3]
各対数値を足し合わせていくことで、合計が計算されます。
-
和の指数を取る:
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)**を最小化する形で学習を行います。負の対数尤度関数は次のように定義されます:
なぜ負の対数尤度を使うのか?
負の対数尤度を最小化することは、対数尤度を最大化することと同じ意味です。最大化問題を最小化問題として扱うことが多い機械学習の文脈では、負の対数尤度を最小化する方が一般的です。これにより、モデルが観測データにより適合するようにパラメータが調整されます。
変分下限(Variational Bound)
変分下限は、負の対数尤度を直接計算するのが困難な場合に、その代替として用いられるものです。具体的には、観測データに対する真の尤度を直接最大化するのではなく、近似的に最大化可能な下限値(つまり、変分下限)を設定し、その下限を最大化することでモデルの学習を行います。
この変分下限は、観測データと潜在変数の結合分布を考慮に入れたもので、通常は次のように定義されます:
ここで:
は観測データp(x, z) と潜在変数x の同時分布。z はq(z|x) の近似事後分布。z
負の対数尤度に対する変分下限の最適化
負の対数尤度に対する変分下限を最適化するというのは、この下限を最大化することで、モデルが観測データに対してより適合するようにパラメータを調整するプロセスです。変分下限が高くなるということは、モデルが観測データをよりよく説明できることを意味します。
拡散モデルのトレーニング(学習)における目的関数
トレーニングの目的
トレーニングは、負の対数尤度に対する通常の変分下限(variational bound)を最適化することで行われます。変分下限は、モデルが観測データをどれだけうまく説明しているかを示す指標です。
式の解釈
論文中の式は次のように表されます:
E[-\log p_\theta(x_0)] の意味
1.期待値 この部分は、モデル
2. 変分下限の導入
この式では、上記の期待値が変分下限によって評価されます。変分下限は、観測データ
L の導出
3. ロス関数 最後に、これを分解していくと、ロス関数
: 終端状態-\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})}
このロス関数
次に確率的生成モデルにおける前向き過程(forward process)と逆向き過程(reverse process)の説明です。
1. 前向き過程と逆向き過程の関係
まず、前向き過程のパラメータ
2. 前向き過程の性質
前向き過程の重要な特性の1つは、任意のタイムステップ
この記法を用いると、
この式では、
3. 効率的な訓練
このモデルでは、効率的な訓練が可能です。なぜなら、
その上で、損失関数
この式の各項について説明します:
-
第1項 (
) :L_T とq(x_T | x_0) との間のKLダイバージェンスを表します。これは、最終状態p(x_T) がどれだけターゲット分布に近いかを測定するものです。x_T -
第2項 (
) :各ステップにおけるL_{t-1} とq(x_{t-1} | x_t, x_0) との間のKLダイバージェンスです。これは逆向き過程のモデルp_{\theta}(x_{t-1} | x_t) の学習を促進します。p_{\theta} -
第3項 (
) :L_0 の対数尤度を最大化する項です。この項は、最初のデータ(生成されたサンプル)が正しいかどうかの最終的な確認に相当します。p_{\theta}(x_0 | x_1)
このように、
1. KLダイバージェンスを使った比較
まず、KLダイバージェンスがどのように使われているかというと、逆向きの条件付き確率分布
具体的に、
ここで、平均
この式では、
2. KLダイバージェンスの計算
KLダイバージェンスは、2つのガウス分布間の比較を行うので、両者がガウス分布であることから、KLダイバージェンスの計算は非常に簡単になります。具体的には、2つのガウス分布間のKLダイバージェンスは、閉形式で計算可能です。これにより、計算の不確実性やばらつきが減り、モンテカルロ法を使わずに計算ができます。
この計算方法は、Rao-Blackwell化された手法として知られています。Rao-Blackwell化は、確率的推定の分散を減らすために使われるテクニックで、ここではKLダイバージェンスを効率的に計算するために活用されています。
これらの基礎知識を理解することで、DDPMの論文の内容がよりクリアに理解できるようになります。