見出し画像

DeepFloyd IF : 自然言語モデルの知識を利用した画像生成モデル (Imagen)

 こんにちはこんばんは、teftef です。2023 年 4 月 29 日に Stability AI に所属する開発チーム : DeepFloyd から Stable Diffusion とは異なる手法を使用した DeepFloyd IF が公開されました。このモデルは文字を破綻せずに生成できたり、高品質な画像を生成できるモデルとして注目を集めています。今回はこの DeepFloyd IF のベースとなっている Imagen について書いていきたいと思います。
 私もまだ初学者であり、説明が間違っていたり勘違いがある可能性が 0 ではないということをご了承ください。ぜひコメントなどをいただけたら幸いです。また、この記事を作成するにあたり、GPT-4 による校正、修正が含まれています。

論文

今回参考にさせていただいた論文はこちら


用語などの事前知識

 自然言語をベースに画像を生成するモデルには DALL-E のような VAE を用いたモデルや LAFITE , Stable Diffusionのように CLIP の知識を条件付けとして用いる モデルがあります。これらは 画像-text のペアをデータセットとして学習した、 VLMs (Vision Language Models)の一種であり、自然言語の知識と画像の知識を相互に変換できるような学習がされています。

Stable Diffusion 

 その中でも Stable Diffusion はDiffusion Model の一種である LDMs (Latent Diffusion Models ) をベースに設計されたアーキテクチャであり、 主に VAE , Unet , Text Encoder の3つのアーキテクチャで構成されています。 VAEエンコーダー によって低次元の潜在表現に圧縮し、順方向の拡散過程を通じてノイズが(連続的に、マルコフ連鎖的に) 付与されます。続いて Unet を通じて、ノイズを除去することで、潜在表現を得る(デノイズ過程という)。最後にノイズを除去したことで得られた潜在表現を VAEデコーダー に渡すことによって、最終的な画像を生成しています。
 このデノイズ過程では文字列や画像などのモダリティによって条件付け(Cross attention によって Unet に与えられる) が可能であり条件に沿った潜在表現にデノイズできるように学習されています。今回は文字列に特化して話します。文字列は Text Encoder によって Embedding 空間にマッピングされ、これを Unet に条件として入力する (正確には Cross attention  によって与えられる) ことで条件付け (Condition) としてデノイズ過程に使用されます。 Text Encoder としては CLIP などを用いることがあります。

Cascade Model

 Imagen や DeepFloyd IF では Stable Diffusion で使用される LDMs とは異なり、Cascade Model と呼ばれるアーキテクチャを採用しています。Cascade Model は潜在的な構造を持つデータを直接扱わず、複数の段階で構成される機械学習モデルです。各段階で、前の段階の出力を次の段階の入力として使用し、段階的に問題を解決します。画像生成では、低解像度な画像から複数段階に分けて解像度を上げていくことが一般的な使用例となっています。今回発表された DeepFloyd IF もこの Cascade Model  を使用したアーキテクチャであり、Imagen をベースとしたモデルになっています。

以下は少し本題の Imagen の説明とは少しそれるので、もし Imagen のみの情報を見たい方は Imagen の章まで飛んでください。

Classifier guidance と Classifier free guidance

 私たちが画像生成をするときに使用する CFG スケールについて大雑把に書いておきます。

Classifier guidance

 Classifier guidanceは、Stable Diffusion のような条件付けを用いた Diffusion Model (conditional diffusion models)にサンプリング時に別途分類モデル(classifier)を用意し、そのラベル通りの画像を生成するように誘導するアプローチです。モデルは入力データとラベルの関係を学習し、未知のデータに対して適切なラベルを推定するようになります。つまり事前に学習されたモデルのラベル付けに大きく依存し、特定のラベルに対応する画像を生成することになります。Imagen では Classifier guidance は用いていません。

Classifier free guidance

 対して Classifier free guidance では逆に事前学習モデルによるクラスラベル付けを回避する代替手法です。(classifier guidanceのclassifierとして他のモデルを使う) 学習中に c をランダムに落とす(例えば、10%の確率で)ことによって、事前に学習されたモデルのラベル付けに大きく依存することを回避できます。これによって生成される画像をよりtext の情報に寄せるように調整し、生成された画像は多様性 (diversity) は下がるかわりに、質 (quality, fidelity) の高い画像を得ることができます。

 以下のように Classifier free guidance を使用することで、多様性(diversity)は下がるかわりに、質(quality)の高い画像になっていることがわかります。しかし適度に画像の変質をよくするためには Classifier free guidance の重みを大きくする必要があります。Imagen では Classifier free guidance を用いています。

← Classifier free guidance 不使用 (w =1 , Classifier guidanceでもない)
Classifier free guidance 使用 (w =3)→

画像はhttps://arxiv.org/abs/2207.12598より

Classifier free guidance の重みを上げる

 Classifier free guidance Scale (CFG Scale) では以下の式のように w によって決められ、 w を上げることによって (皆さん7.5くらいにしますよね?) condition (つまり Promot) を強くすることができます。 

 しかし、最近の研究結果によって Classifier free guidance のウェイトを大きくしすぎると画像と Text の位置関係 (Alignment) が改善されるが、画像の画質 (Fedelity、品質とは違う) が損なわれ、飽和して不自然な画像になることをがわかりました。そのためこの問題を解決するために、Static thresholdingDynamic thresholding という手法を使います。(今回これらの数式ベースの説明は割愛します。)

Static thresholding と Dynamic thresholding

 Upscaling の時に guidance によって ピクセル値が -1~1 (正規化してる) に収まらないことがあり、白飛び黒とびの原因になります。しかし、これらの手法によって、Static thresholding はピクセル値が -1~1 に入らなかったらクリップします。対して Dynamic thresholding はピクセル値が指定した -s~s (s>1)の間に入らなかったらクリップします。(ハイパーパラメータ p によって閾値 s が動的に決まります(percentile (p) によって))
 Static thresholding は、Classifier free guidance のウェイトを大きいサンプリングに不可欠であり、真っ黒の画像の生成を防ぎますが、ガイダンスの重みがさらに増加すると、過飽和で詳細が欠けた画像が生成されることがわかりました。
 対して、Dynamic thresholding は、飽和したピクセルを内側に押し込むことで、各ステップでのピクセルの飽和を積極的に防止し、フォトリアリズムと画像とtext の一貫性が得られることがわかりました。

Classifier free guidanceの強度
下に行くにつれて CFG スケールを大きくしている

Imagen 

 いよいよ、本題です。

Text Encoder の選択

 Text to image のモデルにおいて、Text Encoder は通常、画像-text のペアで学習され、特に Text to image生成タスクに関連する視覚的に意味ある表現をエンコードすることを目的とします。

 Stable Diffusion の Text Encoder に用いられる CLIP は画像とテキストを同時に扱うマルチモーダルなモデルで、生成、分類、検索などのタスクを自然言語指示や画像入力に基づいて実行します。(詳しくはこちらでも書いています。)
 対して、今回はテキストのみのコーパス (データセット) で事前学習された一般的な大規模言語モデル(T5など)を Text Encoderとしてて使用ます。言語モデルである T5 モデルは画像-text のペアデータより膨大な量の Text のみのコーパスで学習されるため、非常に豊かで幅広い分布が存在していると考えられます。また、これら言語モデルは一般に、現在の画像テキストモデルである CLIP よりもはるかに大きいパラメーターを持ちます。

 今回は事前学習済みの Text Encoder として BERT、T5、CLIP を用いてImagen を構築し、性能を比較します。

Imagen のアーキテクチャ

 Imagen はこのようなアーキテクチャになっています。簡単に説明すると 64×64 の低解像度の画像が生成され、それを 64×64→256×256→1024×1024 のようにアップスケールしていきます。

Upscaling

 まずは普通の Diffusion モデルのように (Stable Diffusion と異なる) 64 × 64 の低解像度の画像を作成します。続いてEfficient U-Net を用いて64×64→256×256→1024×1024 と Upscaling します。Efficient U-Net はStable Diffusion とは異なり、ダウンサンプルしてから Attention をかける工夫をしています。これによってメモリ効率、推論時間、収束速度を向上ができました。
 最初に 64 × 64 の低解像度画像を生成するモデルを用いることで省時間、省メモリになりますし、また最初に生成する画像の意味的 (セマンティック)  な内容を決めることができるため、画像が大きく崩れることを防止することができます。

Efficient U-Net Block

実験

評価指標

評価には FID や CLIP-Score などを用いています。
 しかし、以前にも書いたように FID や CLIP Score による評価はとても時代遅れであり、画像の品質を評価することに最適ではないという論文がありました。

DrawBench

 そのため DrawBench と呼ばれる人間による評価を用いた評価指標を作成しました。簡単に書くと Prompt(長くて複雑なテキストの説明、珍しい言葉、綴りの間違いのある) があり、それを 2 つのモデルに入力し、出力された画像を人間が相対評価を用いて

・モデルAを好む
・どちらでもない
・モデルBを好む

の3つの指標で測ります。

従来のモデルとの比較

FID

 それではまずは従来のモデルとの比較をします。よく使われている COCO データセットを用いて学習された GAN たちと 、" COCO データセット以外を用いて学習された DALL-E " たちと比較します。(つまり DALL-E とImagen に関しては Zero-shot)。 まずは FID .

FID (小さいと高性能)

 これを見ると Zero-shot にもかかわらず、(COCO データセットで学習された GAN と比べても) 最も良い性能を出しています。


COCO データセット内の画像との比較 


←画像の品質
Prompt への忠実度→

 生成結果と 元のデータセットである COCO の画像を比べた結果、忠実度に関してはほぼ差がない結果となっています。

DrawBench を用いた評価

続いて DrawBench を用いた評価です。

DrawBench を用いた評価

このように Imagen (水色の棒グラフ)の 圧勝となっています。

定性評価

← Imagen
DALLE-2 →

 下の画像を見ると 「A black apple and green backpack」 ではしっかりとリンゴが黒く、バックパックが緑色になっています。


← Imagen
DALLE-2 →

文字もちゃんと出ます。(DALLE-2もすごい)

Text Encoder の評価

CLIP Score による評価

Imagen ではText Encoder として BERT、T5、CLIP を用いた比較をしています。

CLIP Score による定性評価では
T5 XXL > CLIP >T5XL >T5 > BERT ≒ T5 Large > T5 Small 
の順の精度となっています。

この表を見ると定量的には T5 XXL 、 CLIP 大きな違いがありませんが。

DrawBench を用いた評価

対して、DrawBench を用いた評価はこのようになりました。

このように T5 XXL (水色の棒グラフ)のほうが良い結果となっています。

属性編集への応用

 Upscaling の途中で Prompt を変更することで、画像の Style を変換できます。 この例では “A photo of ... .”を用いて生成された 64×64 の画像を Upscaling の時に “An oil painting of ... .” と Prompt を変更しています。このようにすることで、最終的な 1024×1024 の画像が油絵風の画像になっています。

結論

 Diffusion Model の品質向上のために Unet のサイズを上げるという手法がありますが、これは多くのメモリを消費するため、限界があります。これに対して Imagen は Text encoder として大規模言語モデルをの知識を用いて、 64 × 64 の画像を生成し upscaling することで省メモリにつながります。実際に実装でも 

T5 Text encoder をロード

GPU メモリを解放

64 × 64 画像を生成する Diffusion Model を ロード

GPU メモリを解放

Upscaler を ロード

GPU メモリを解放

のように書かれています。どちらにせよ Imagen は逐次処理なのでこの実装をすれば最も大きなモデル(おそらく T5) が乗るだけの VRAM を用意すればよいので省メモリとなります。

 また Static thresholding と Dynamic thresholding を導入したことによってClassifier free guidance の重みを大きくすることができ、質を維持しつつ、 Alignment も維持されるいいとこどりを行うことができました。

実装

DeepFloyd を Google Colab で試したいときは以下の Colab で。 

簡単に試したいときは以下

考察

 Imagen は Classifier free guidance の良さを極限までに引き出したモデルであることがわかりました。 Static thresholdingDynamic thresholding  を使用することで CFG Scale を大きくしても画像が崩れないということが大きな特徴です。
 しかし主は、Imagen の評価に対して疑問があります。確かに Imagen によって生成された画像はDALL-Eに比べて高品質ではありますが、これは 「Imagen は DALL-E の上位互換である」と一言で言ってしまっていいのでしょうか?そもそも DALL-E は VLMs である CLIP の知識を使用したモデルであり、それに対して今回は大規模自然言語モデルの T5 の知識を使用したモデルです。今回の評価では下図のように DALL-E は「A black apple and green backpack」を再現できていないと書いてありますが、DALL-E がこれを再現できないのは、単純に CLIP の中にそのような表現がないからであると考えられます。
 そのため T5 モデルが学習しておらず、 VLMs である CLIP が学習している知識が DALL-E に存在していて、Imagen では出力できない画像がある可能性もあります。そのため、比較条件が異なるので比べようがないと考えられます。それぞれのモデルの強みを生かして、それぞれの用途で使用すると効果が発揮することができると考えられます。


← Imagen
DALLE-2 →

実際に使ってみた

実際に使ってみるとこんな感じ。

文字もしっかりと出てます。

参考文献

↑ こちらの動画がとても分かりやすいです。

最後に

 最後まで読んでいただきありがとうございました。最後に少し宣伝です。主のteftefが運営を行っているdiscordサーバーを載せます。このサーバーではMidjourneyやStble Diffusionのプロンプトを共有したり、研究したりしています。ぜひ参加して、お絵描きAIを探ってみてはいかがでしょう。(7500字、teftef)

 ↓↓もしよろしければこの記事と開発の支援お願いいたします!

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?