画像生成モデルのLatentってなに?
Midjourneyの仕組み調べてたら、出てきたよぃ
Latentとは
形的には 64×64×4ch みたいな高次元テンソル
ノイズ→完成画像までの各ステップにおけるその画像のスナップショットみたいなもの
画像の構造、色、テクスチャ、物体の関係、光、スタイル みたいな画像の情報全部持ってる
画像を作るときは、Latentは最初の時点ではただのランダムなノイズ
層を通過するごとに「猫っぽい」とか「宇宙っぽい」とか特定の方向にLatent自体が変化していく
もちろんテンソルのままだと画像にはならないから、画像とテンソルの変換にはVAEエンコーダー/デコーダーってものが使われる
学習時は 画像→VAEエンコーダー→Latent
画像生成時は Latent(ノイズ→具体)→VAEデコーダー→画像
Latent Spaceって?
このLatentの方向性を決めるのがLatent Space
Latent Spaceはモデル1個に対して1個、
Latentは生成する画像1枚にたいして1個存在する
Latent Spaceっていう宇宙の法則の中で画像がもつ特徴をベクトル化したのがLatent
MidjourneyのVaryについて
MidjourneyにはVaryっていう機能があって、気にいった画像のVaryボタンをぽちっと押すと、その画像と被写体もスタイルもだいたい同じだけどちょっぴり違う画像が出力できるよぃ
これがあーしは不思議で不思議で
ちなみにRe-Runっていうボタンもあるけど、それはプロンプトが同じだけの完全に違う画像みたいになる
Varyは何してるのか気になってGPTに聞いてみたら
🐹 うーん公開された情報からはわからんけど、
🐹 最初の画像の、最終Latentをちょっとずらしてもう一回ノイズ除去してると思う
最初の画像ができるまで:
初期ノイズ → UNet層1 → 層2 → … → 層N → 最終latent → VAEで画像化
VaryはここをのLatentをちょっとずらす
\ ここ! /
初期ノイズ → ... → 層N → [ 最終Latent ] → 少しノイズ加える → 再びUNetへ → VAEで画像化
😃 ほう
🙄 ん?でも「ずらす」って数字をちょこっと変えるってことだよね?
🙄 完成済みのLatentをちょこっとずつずらしたら画像ぐっちゃぐちゃにならん?
🐹 それが大丈夫なんだよねぇ
🐹 Latent Spaceって、「パステルカラーの横はちょっと違うパステルカラー」みたいに似たもの同士が連続的に繋がってる空間なの
🐹 さらにノイズ除去をするUnetって、破綻したものは修正するように訓練されてる
🐹 だから、ちょっとずらしても意味のある画像ができる
😃 でもさぁUnetってLLMみたいに層ごとに役割とか決まってないの?
😃 最初の層はノイズを想定してて、最後の方は形がはっきりしてないとだめみたいな
🐹 ううん、Unetは最初から最後まで同じネットワーク使うんだ
🐹 だから、ノイズを渡したら全体復元モードっぽく動くし、
🐹 完成間近の渡したら細部復元モードっぽく動く
😃 最初の層に完成済みのLatent渡したら勝手に細部復元モードになるってこと?
🐹 YES!!
😃 なるほど...
😃 めっちゃありそうな仮説やな...
😃 うーんでもノイズから生成してるようなアニメーション表示されるんだよな...ちょっとずつ人間の顔が浮かび上がって、背景ができて、みたいな
🐹 あれは演出!(迫真)
🐹 「ノイズから絵が浮かぶのかっけ〜💖」
🐹 っていうUXのために、演出として段階レンダリングしてる
🐹 そもそも途中latentをVAEでdecodeすると、終盤であってもぼんやりノイズっぽく見える
🐹 たとえUNetが「終盤だけ」をやってても、その途中のlatentをVAE decode するとノイズ+形の断片 みたいになるんだ
😃 なるほど、本当にノイズまでは戻さなくてもあの演出は可能ってことね
😃 ノイズまで戻してないっていう根拠は、ノイズまで戻したら普通に別世界になりすぎるってことだよね
🐹 そう!
🐹 もし Vary で 完成latent → ノイズTに戻す → 再生成 なんてやったら……
🐹 キャラ変わる
🐹 構図変わる
🐹 色変わる
🐹 物語変わる
🐹 もう同じ絵の「バリエーション」ですらない!!!
😃 なるほど...
😃 じゃぁやっぱ完成画像→もう一回Unetが有力なのかな
😃 画像生成もおもろいなぁ