Stable Diffusionで極端な明暗を表現できない理由とその解決
https://gyazo.com/57fc58e3c880d610211314b3b687eb05https://gyazo.com/a01801d1930c80c124494c7427425556
左 : (プロンプトの0が完全な黒、1は白)
?基素.icon
(with an entirely black image being 0, and an entirely white image being 1).
SDは0.5にしようとする
画像下のはプロンプトだと思っていたけど違うなnomadoor.icon
https://gyazo.com/d4ba518859ab44b483b11fbd06bf2e31
なんの数値なんだ?
右 : 真っ黒な画像でDreamBoothしても、真っ黒な画像を生成できない(プロンプト : "A solid black image" )
なぜか?
https://www.youtube.com/watch?v=3C6yEYXDijM
モデルの学習では、画像をノイズに変換していく
しかし、完全な分布には戻せない
最後までノイズに変換されない場所は、ノイズから画像にする処理では最も弱く変化してしまう
拡散プロセスは、そのような長波長の特徴をどのように変化させればよいのかわからないのです。
https://gyazo.com/83600016afbe79e3b449a2c6f251a06a
この問題は次元が高くなるほど悪化する
SD v1.5は12288次元
長い波長は短い波長よりも約100倍遅く変化するため、デフォルトでは50程度(高度なサンプラーでは20程度)であるところを、それを捉えるためには数百から数千のプロセスのステップを考慮する必要がある
ステップ数を増やす以外の方法はないか?
現在、モデルのトレーニングには下のようなノイズを使っている
$ noise = torch.randn_like(latents)
代わりにこうする
$ noise = torch.randn_like(latents) + 0.1 * torch.randn(latents.shape0, latents.shape1, 1, 1) グラフにしてみる(合ってるかは分からない)nomadoor.icon
https://gyazo.com/f1d04e453f7ef7d01c4019aafaca2ec1
$ noise1 = torch.randn_like(latents)
$ noise2 = 0.1 * torch.randn(latents.shape0, latents.shape1, 1, 1) $ noise = noise1 + noise2
分散が小さくなっている?基素.icon
https://gyazo.com/0fc46557d685e48d54f11cde8d5ae4d8
明るい(暗い)画像が生成できるようになっている
このノイズを使ってトレーニングされた大規模モデルの登場が待たれる
他の対策案
形が少し変わってしまう
上の記事を元に作成されたLoRA