NovelAI Diffusion V3 の改善点
v-Prediction Parameterization
SDXL では ε Prediction が使われている。これはノイズ画像からノイズ部分を予測させる方法だ。この方法は SNR=0(純粋なノイズ画像)の状況では機能しない。
v-Prediction はノイズとデノイズ後の画像との差分(つまり速度)を予測させる。式にすると v = sqrt(αt)ϵ − sqrt(1 − αt)x。ただし ε はノイズ。この方法では SNR に依存せずに正しく予測が機能する。
v-Prediction は数値の安定性の改善、高解像度でのカラーシフトの除去、サンプルの収束速度の改善という利点もある。
Zero Terminal SNR
SDXL は欠陥のあるノイズスケジューラーで訓練されており、常に中間的な明るさのサンプルを生成するようになっている。
通常、拡散モデルはノイズのない画像から徐々にノイズを付与して訓練する。しかし SDXL のノイズスケジューラーは純粋なノイズになるまで学習するようになっていない。これはモデルに、"ノイズの中に常に何らかのシグナルが残っている" という誤った情報を学習させてしまう。
「completely black」 というプロンプトで生成した画像。純粋なノイズになるまで学習させたもの(ZTSNR)は正しく画像が生成されている。素の SDXL は、中間的な明るさの純粋なノイズをヒントに画像を生成するため、生成画像の明るさも中間的なものになり、プロンプトも無視される
出典:Improvements to SDXL in NovelAI Diffusion V3. Juan Ossa et al. Figure 2
素の SDXL(no ZTSNR)では画像の平均明るさを調整するために、プロンプトを無視して背景や髪、服を明るくしたり暗くしたりする
出典:Improvements to SDXL in NovelAI Diffusion V3. Juan Ossa et al. Figure 3
高ノイズのタイムステップからサンプリングを始めることで高解像度での生成品質を改善
SDXL は高解像度で σmax が小さすぎる問題がある。σmax は画像生成時の初期ノイズの量と学習時のノイズ量との最大値を制御する。解像度を増やし、かつ SNR を維持するには、より多くのノイズが必要になる。
分かりやすい例は高解像度での人物の分裂だ。SD 1.x や SDXL では解像度を増やすと顔や体のパーツが増殖していた。これは σmax が小さすぎることが原因の一つだ。
経験則では、ピクセル数を4倍(縦横2倍)にして、SNR を維持するには、σmax を2倍にする(ピクセル数2倍なら σmax は 1.414 倍)。これは上限値なので σmax を2倍以上にしても生成画像の品質は改善しない。