SD2.0では、512×512の画像で普通に学習した後、768×786の画像を下記の論文による手法で学習したそうです。ざっくりと説明すると、samplerのステップ数を半分にしても生成できるようにする方法です。それにもかかわらず、Stability AIがステップ数を減らしてもうまく生成できるようになったと謳っていないのがよく分からないです。
追記:たぶんv_predictionを使っただけで蒸留は使ってないんだろうね
英語はよくわからないので、数式とにらめっこします。
左が普通のノイズ推定で、右がこの論文の方法ですね。左から読む。texなんて久しぶりに使うなあ。めんどくさいので太字とかローマン体とかなし。細かいところ違うかもしれないけど全体的な流れはあってるはず。。。
通常のdiffusion model
が、モデルの推論結果を表します。中に入れてるのがノイズ込みの画像(latent diffusionの場合潜在変数)ですね。学習ループを見ていきます。
が学習用画像で、が時間(何ステップ目か)でがノイズですね。画像にノイズを加えたものが、です。やはハイパーパラメータです。Stable diffusion 2.0では、を0.00085から0.0120まで線形に増やして、としているはずです。targetは、そのものです、次の二行は理解していない本質的じゃなさそうなのでカット。が実際のノイズと推定したノイズの二乗誤差であり、これの勾配を降りればいい感じですね。
漸進的蒸留
右について、緑で塗られているところがが普通と違うところです。まず教師モデルとかいうのが出てきてます。蒸留なので、当たり前ですが先生が必要です。SD2.0では512×512の画像を学習させたものを先生にしています。教師がいるので、生徒もいます。生徒が学習対象のモデルです。教師モデルのパラメータを、生徒モデルのパラメータをで表します。とりあえずwhileループを見ていきます。生徒モデルが教師モデルでの2ステップ分のノイズ除去を1ステップでできるようにすることを目的にしています。は左と同じです。はなんか難しく書いてあるけど同じようなもんでしょ。左の画像では、targetはそのものでしたが、今回は教師モデル2回分のノイズ除去をしたものがtargetになります。# 2stepなんたらからの説明。
が0.5ステップ前、が1ステップ前です。教師モデル的にはそれぞれ1ステップ前、2ステップ前になります。(0.5ステップ前、1ステップ前で統一します。)
教師モデルによる0.5ステップ前の推定画像はです。
よって0.5ステップ前のノイズ になります。
そのため、教師モデルによる0.5ステップ前でのノイズ付き画像が、
同様の計算で、教師モデルによる1ステップ前でのノイズ付き画像が求まります。
一方生徒モデルによる1ステップ前でのノイズ付き画像は、教師モデルとちがってと1ステップで推論するので、
となります。
教師モデルの2ステップと生徒モデルの1ステップを一致させるには、となればよいので、生徒モデルの出力に求めるtarget は、
変形すれば上の画像の通りのtargetになります。
あとは普通のやつと同じですね。
whileループが収束したら、出来上がった生徒が次世代の教師になり、ステップ数を半分にして同じことをやる・・・ということを繰り返してどんどん蒸留していきます。Stable diffusion 2.0ではこのwhileループを何回やったのか書いてないのでよくわからない・・・。
ファインチューニングの実装
こんな話しをした理由は、下記記事のSD2.0版DreamBoothでやっていることを理解したかったからです。普通のDreamBoothなので蒸留ではありません。
見たまま編集モードだとコードの色付けできなくてわろたー。
targetの計算が、target = (alpha_prod_t ** 0.5) * noise - (beta_prod_t ** 0.5) * latents
というふうになってます。
noiseからlatentを引いたのがtarget?なんだこりゃ。これってようするに、
をtargetにしてるということですよね。うーんなんでかわかりません。そもそもノイズと潜在変数をごちゃまぜしたものを返してどうやって潜在変数だけとりだすんや?
またnnablaの動画で復習だなこりゃ
つづくかもしれない・・・
追記:
とすると、となり、
をtargetとするのがv_predictionのようですね。
ごちゃごちゃやると
になるようです。
何でこうした方がいいのかよく分かりません