Stable Diffusionを何も理解していなかったの会
一年前に読めという話なのだけれど、誰でもわかるStable Diffusionを読んで何も分かっていなかったということに気づいたので雑メモnomadoor.icon
俺たちは雰囲気で画像生成をしているwogikaze.icon
WebUI Stable DiffusionベースモデルのCLIPの重みを良いやつに変更するとか画像生成の高速化で色々いじっているのだけ知ってる感じがする
UNetの中身にTransformerがあることを今知りました()nomadoor.icon
Attention Is All You Needなのでどこにでもいる()wogikaze.icon
https://note.com/shima_7_7/n/n402178a82b5fTransformerのデコーダーモデル解説
https://hoshikat.hatenablog.com/entry/2023/03/15/221428その1:しくみ
https://gyazo.com/303b5cc777dc2b5a86b6f56a99d5a5b5
いつもの
https://gyazo.com/713b70238d234a302a9ccc29048eca2c
この図の赤い部分なんだろうと思ってたけど、"Denoising U-Net"を繰り返してるだけかnomadoor.icon
普段から適当に読みすぎてる
拡散モデル
U-Net
Latent Space
512 × 512の画像を表現するには、512 × 512 × 3(RGB) = 786432の値が必要だが、このまま学習すると膨大な計算コストがかかってしまうためVAEを使って64 x 64 x 3に圧縮する
実は64×64×4
学習
https://hoshikat.hatenablog.com/entry/2023/03/31/022605その4:U-Net
https://gyazo.com/46c1a1009b61f7c5b7faa5a48e2111b3
IN0 その他 畳み込み(convolution)
https://hoshikat.hatenablog.com/entry/2023/04/03/215537その5:U-Net(IN0ブロックと畳み込み)
なにも分からない…nomadoor.icon
Transformer
エンコーダー = Text Encoder => CLIP
デコーダー
U-NetにあるAttention Block = Transformerのデコーダー
https://hoshikat.hatenablog.com/entry/2023/04/18/002108その7:U-Net(テキストを画像に反映するAttentionブロック)
Attention Block
生成画像をテキストによる指示に従わせる
IN1、IN2、IN4、IN5、IN7、IN8、 MID、 OUT3、OUT4、OUT5、OUT6、OUT7、OUT8、OUT9、OUT10、OUT11
の16ブロックに存在する
Attention Blockの中身
https://hoshikat.hatenablog.com/entry/2023/04/20/011720その8:AttentionとTransformer
https://gyazo.com/601d5b39f259d1a109eb493578f9f4d6
Self-Attention
画像データを入力
データのフラット化
64x64x320の3次元データを4096x320の2次元データに再構成
マルチヘッド化
フラット化したデータを3つに複製し、それぞれを8つに分割する
Q、K、Vへの変換
複製されたデータはそれぞれ別のニューラルネットワークを通り、クエリ(Q)、キー(K)、バリュー(V)というデータに変換される
同じデータから具体的にどんなものに変換されているのか?nomadoor.icon
Q
K
V
QとKの比較
すべてのマス(4096個)同士で自分のQと相手のKを比較する。比較結果は4096x4096の比較マップとして出力される
Vの重み付けと加算
比較マップとVデータを掛け算し、Vデータ内の4096行すべてが足しこまれ、比較マップはVデータのそれぞれの行を「重み付け」する
マルチヘッドの再結合
Q、K、V処理後の結果をくっつけて、8つの4096x40のデータを1つの4096x320のデータに戻す
Cross-Attention
https://gyazo.com/c05f57d711fbdf1cdce6e194567dd33c
画像とテキストデータを入力
Self Attentionと違いKとVがテキストになる
データのフラット化
テキストデータは768×77に再構成される
つまりテキストは77トークン(75トークン + 開始記号 + 終端記号)で分割される
Stable Diffusionが75トークンしか理解できないみたいな話はこれか(今更)nomadoor.icon
75トークンで勝手に分割されるだけで、75トークン以上のテキストを入力すること自体はできる
ただし、75ぎりぎりに文章を書いてしまうと、例えば red hairが red と hairに強制的に分割されてしま
関係が切れてしまうため気を付ける必要がある
上でも書いた通り、このデータを作るのはStable Diffusionではありません。
テキストエンコーダーにCLIPをそのまま使っているのは分かったけれど、"このデータ"はどれのことだnomadoor.icon
マルチヘッド化
画像はSelf-Attentionと同じく8つに分割される 4096×40×8
テキストは96×77×8に分割される
Q、K、Vへ変換
テキストデータはK、Vへ変換された後ニューラルネットワークで40×77×8に縮小される
Q(画像データ)の40×4096×8に合わせるため
QとKの比較
4096マス(画像)×77マス(テキスト)の比較マップが出来る
Vの重みを加算
4096×77(比較マップ)と40×77(V)の行列の積は4096×40で、8つに分割したものを戻すと4096×320で入力データと同じサイズになる