拡散モデルの前日譚
この記事とは 拡散モデルの初歩的なモチベについてまとめてみた 特にScoreとは何か, 拡散モデルではDenoisingをすると言われるが, ScoreとDenoisingはどういう関係性にあるのかに注目して記述した この記事の執筆にあたってはこのAyan DasさんのICLR 2024 BlogpostsであるBuilding Diffusion Model’s theory from ground upを多いに参考させて頂きました. もし英語が読めるならこちらを読んでください… “Score"とは? 真の確率分布$p(x)$を考えたとき, そのScore $s(x)$は以下のように, $$\nabla_x \log p(x) := s(x), $$ 真の確率分布の対数を取ったもの(=対数尤度)の勾配として定義される. これは対数尤度の勾配, つまり対数尤度が増加する方向を指す. つまり言ってしまえば「データ空間上で今の点からどの方向に動けば良いデータが手に入るか」をScoreは教えてくれるのだ. 下記の画像は簡単な二次元正規分布とそのScore(矢印)を可視化したものである. Scoreは便利 確率分布とは簡単に言ってしまえば全空間で積分したら$1$になる非負の関数1である. 空間の部分で積分したらその部分の確率が現れる. さて突然だがなんかいい感じな確率分布を自作してみよう. $y=\exp(\tan(\sin(\cos(x))))$みたいにとても複雑な分布を素朴に作って遊んでみよう. 確率分布も関数なので好き勝手に複雑にして良い. 非負はまあ守れるだろう. 積分したら$1$という条件があるが, これも好き勝手に複雑にした後に全体を正規化(=用意した関数を全空間で積分したもので割る)すればどうにでもなる. なので, $$p_\text{ExtremeComplex}(x)=\frac{\text{NonNegativeExtremeComplexFunction(x)}}{\displaystyle \int_x \text{NonNegativeExtremeComplexFunction(x)} dx}, $$ というノリでいくらでも複雑な分布が用意できるのだ!!!…本当か? $\displaystyle \int_x \text{NonNegativeExtremeComplexFunction(x)} dx$は本当に計算できるのだろうか. いやそんなことはないだろう. 積分計算は難しく, 解析解が得られることはほとんどなく, 近似計算も非積分関数が複雑, もしくは積分空間が高次元になれば極めて難しくなる. そのため適当にデザインした複雑な確率分布では正規化係数(分配関数とも呼ばれる)が計算できず, 結果として各点の確率分布の値が計算できなくなる. Scoreはこの問題を解決してくれる. 例えば上の$p_\text{ExtremeComplex}(x)$のスコアを求めてみる. $$ \begin{aligned} s_{\text{ExtremeComplex}}(x)&=\nabla_x \log p_\text{ExtremeComplex}(x)\\ &= \nabla_x \text{NonNegativeExtremeComplexFunction(x)} \\ &\quad \quad - \underbrace{\nabla_x \int_x \text{NonNegativeExtremeComplexFunction(x)} dx}_{=0(\text{定数なので})} \\ &= \nabla_x \text{NonNegativeExtremeComplexFunction(x)} \end{aligned}$$ そう, 積分計算は定数なので微分されて消えるのだ. ...