Stable Diffusionを何も理解していなかったの会
俺たちは雰囲気で画像生成をしているwogikaze.icon
UNetの中身にTransformerがあることを今知りました()nomadoor.icon
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://gyazo.com/46c1a1009b61f7c5b7faa5a48e2111b3
なにも分からない…nomadoor.icon
Transformer
エンコーダー = Text Encoder => CLIP
デコーダー
U-NetにあるAttention Block = Transformerのデコーダー
Attention Block
生成画像をテキストによる指示に従わせる
IN1、IN2、IN4、IN5、IN7、IN8、 MID、 OUT3、OUT4、OUT5、OUT6、OUT7、OUT8、OUT9、OUT10、OUT11
の16ブロックに存在する
Attention Blockの中身
https://gyazo.com/601d5b39f259d1a109eb493578f9f4d6
画像データを入力
データのフラット化
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のデータに戻す
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で入力データと同じサイズになる