Skip to main content

Classifier Guidance

Classifier Guidance は、別途 training された classifier の gradient を使って、Diffusion Model の sampling を condition に合う方向へ誘導する方法です。

基本 idea

Class label yy に条件づけて sample を生成したい場合、classifier pϕ(yxt)p_\phi(y \mid x_t) を使って、現在の noisy sample xtx_t が class yy らしくなる方向を求めます。

xtlogpϕ(yxt)\nabla_{x_t} \log p_\phi(y \mid x_t)

この gradient を reverse diffusion の update に加えることで、sample は condition yy に合う方向へ誘導されます。

Guidance strength

Classifier Guidance では、guidance の強さを調整できます。Guidance を強くすると condition への忠実度は上がりやすくなりますが、sample diversity が下がったり、artifact が増えたりする可能性があります。

欠点

Classifier Guidance には、noisy image xtx_t に対して class を予測できる classifier が必要です。つまり、通常の clean image classifier ではなく、diffusion の各 noise level に対応した classifier を training する必要があります。

この手間を避ける方法として、Classifier-Free Guidance が広く使われます。

数式で見る classifier guidance

Classifier guidance は、diffusion の score に classifier の勾配を足す方法です。Class yy に条件づけたいとき、条件付き score は次のように分解できます。

xlogp(xty)=xlogp(xt)+xlogp(yxt)\nabla_x\log p(x_t\mid y) =\nabla_x\log p(x_t)+\nabla_x\log p(y\mid x_t)

この式の気持ちは、「自然な画像分布へ戻す denoising 方向に加えて、classifier が class yy らしいと判断する方向へ画像を動かす」というものです。

Guidance scale ss を入れると、sampling で使う score は次のようになります。

s~(xt,t,y)=sθ(xt,t)+sxtlogpϕ(yxt)\tilde{s}(x_t,t,y)=s_\theta(x_t,t)+s\nabla_{x_t}\log p_\phi(y\mid x_t)

ss を大きくすると class への忠実度は上がりますが、classifier の弱点や adversarial direction も強く反映されるため、画像品質が落ちる場合があります。

関連ページ