見出し画像

週刊AI神絵師 2022/10/16-10/22 - NovelAIによる技術改善の詳細

自分の書籍の発売開始が目前ですが、出版してしまうとブログの記事には追いつけなくなるので日本語ブログの記事中心に面白かったものをメモっておきます。

技術面

キャラのポーズ・位置・視点の呪文の一覧【Waifu Diffusion・NovelAI】2022年10月18日https://gamedev65535.com/entry/prompot_position/

Waifu DiffusionやNovelAIのプロンプトで使える単語の中から、キャラの位置・向き、ポーズを調整できるタグ

社会面:企業ブログによる記事が現れ始める

企業のテック系ブログで扱われ始めます

Stable Diffusion呪文-美少女アニメ画改善版ISIDテックブログ 2022-10-19

電通国際情報サービス、オープンイノベーションラボの比嘉康雄さんによる Stable Diffusionの呪文シリーズ。

CGへの扉 Vol.43:AI絵師は3DCGの領域へ | モリカトロンAIラボ 2022-10-17

超高精度なイラストを生成できると話題の「NovelAI」は本家Stable Diffusionにどんな改善を加えたのか? - GIGAZINE2022年10月11日 20時17分ソフトウェア

Stable Diffusionよりもはるかに高い精度でイラストを生成できる画像生成AIサービス「NovelAI」のAIモデルについて、NovelAIの開発チームが自身のブログで解説しています。
NovelAI Improvements on Stable Diffusion | by NovelAI | Oct, 2022 | Medium(NovelAIによるStable Diffusionのための改善)2022年10月11日https://blog.novelai.net/novelai-improvements-on-stable-diffusion-e10d38db82ac

Gigazineによる独自解説も面白いのですが、NovelAIによる技術解説ブログが面白かったので、参考訳を載せておきます。翻訳品質はあまり高くはありません (following part is a reference translation of original article by Novel AI. My translation quality is not very high but very interesting)。

国際面:Stable Diffusionにおける NovelAI の改善(参考訳)

NovelAI Diffusion 画像生成モデルの開発プロセスの一環として、Stable Diffusion のモデル アーキテクチャとそのトレーニング プロセスを変更しました。これらの変更により、生成とユーザー エクスペリエンスの全体的な品質が向上し、画像生成を通じてストーリーテリングを強化するというユース ケースにより適したものになりました。このブログ投稿では、私たちが行ったいくつかの変更と追加の技術的な概要を説明したいと思います。

CLIP の最後から 2 番目のレイヤーの隠し状態を使用する

(Using Hidden States of CLIP’s Penultimate Layer)
Stable Diffusion は、CLIP のトランスフォーマー ベースのテキスト エンコーダーの最終的な隠れ状態を使用して、分類子を使用しないガイダンスを使用して世代をガイドします。Imagen (Saharia et al., 2022)では、最終層の隠れ状態の代わりに、最後から 2 番目の層の隠れ状態がガイダンスに使用されます。EleutherAI Discordに関する議論では、最後から 2 番目のレイヤーがガイダンスとして優れた結果をもたらす可能性があることも示されました。これは、隠れ状態の値が最後のレイヤーで急激に変化し、通常は CLIP ベースの類似検索に使用されるより小さいベクトルに圧縮される準備を整えるためです。実験中に、CLIP のテキスト トランスフォーマーの最終レイヤー ノルムが適用されている限り、Stable Diffusion は最後から 2 番目のレイヤーから隠れた状態を解釈し、プロンプトに一致する画像を生成できることがわかりましたが、精度はわずかに低下します。さらなるテストにより、モデルがタグベースのプロンプトで密集した情報をより有効に活用できることがわかり、モデルが特定の概念を解きほぐす方法をより迅速に学習できることがわかったため、最終レイヤーではなく最後から 2 番目のレイヤーの非表示状態でトレーニングを実行するようになりました。
たとえば、最終レイヤーを使用する場合、モデルは異なる概念のもつれを解きほぐし、たとえば色を正しく割り当てるのがより困難でした。


初音ミク、赤いドレス

実験フェーズでは、「初音ミク、赤いドレス」などのさまざまなプロンプトでさまざまなパラメーターを使用してトレーニングの実行を評価しました。これは、トレーニングのある時点まで、ドレスの赤がミクの髪と目の色に漏れる傾向がありました。

最終層の隠れた状態。また、他のより複雑なプロンプトを使用して、さまざまなトレーニング実行がタグ付けされた概念を正確に組み合わせる能力を評価しました。


Generation with NovelAI Diffusion (Curated), our anime model for “Tags: purple eyes, 1girl, short hair, smile, open mouth, ruffled blouse, red blouse, pleated skirt, blonde hair, green scarf, waving at viewer”

タグ: 紫色の目, 1girl, 短い髪, 笑顔, 開いた口, ラッフル ブラウス, 赤いブラウス, プリーツ スカート, ブロンドの髪, 緑のスカーフ, 見る人に手を振る

Generation with NovelAI Diffusion (Curated), our anime model for “Tags: purple eyes, 1girl, short hair, smile, open mouth, ruffled blouse, red blouse, pleated skirt, blonde hair, green scarf, waving at viewer”

アスペクト比バケツリレー化

(Aspect Ratio Bucketing)
既存の画像生成モデルに共通する問題の 1 つは、不自然なクロップで画像を生成する傾向があることです。これは、これらのモデルが正方形の画像を生成するようにトレーニングされているためです。ただし、ほとんどの写真やアートワークは正方形ではありません。ただし、モデルは同時に同じサイズの画像でしか機能せず、トレーニング中は、使用される GPU の効率を最適化するために一度に複数のトレーニング サンプルを操作するのが一般的です。妥協案として、正方形の画像が選択され、トレーニング中に各画像の中心のみが切り取られ、トレーニング例として画像生成モデルに表示されます。


Knight wearing a crown with darkened regions removed by the center crop

たとえば、人間は足や頭がなくても生成されることが多く、剣は柄とフレームの外側を指す刃だけで構成されています。ストーリーテリングの経験に付随する画像生成モデルを作成しているため、モデルが適切でトリミングされていないキャラクターを生成できることが重要であり、生成された騎士は無限に伸びる金属のように見える直線を保持してはなりません。トリミングされた画像のトレーニングに関するもう 1 つの問題は、テキストと画像の不一致につながる可能性があることです。たとえば、「王冠」タグの付いた画像には、中央のトリミングが適用されて王冠が切断された後、王冠が含まれていないことがよくあります。センタークロップの代わりにランダムクロップを使用しても、これらの問題がわずかに改善されるだけであることがわかりました。可変画像サイズで Stable Diffusion を使用することは可能ですが、512x512 のネイティブ解像度を超えすぎると画像要素が繰り返される傾向があり、非常に低い解像度では識別できない画像が生成されることに注意してください。それでも、これは、可変サイズの画像でモデルをトレーニングできるはずであることを示しています。単一の可変サイズのサンプルでのトレーニングは些細なことですが、ミニバッチの使用によって提供される正則化の欠如により、非常に遅くなり、トレーニングが不安定になりやすくなります。

カスタムバッチ生成(Custom Batch Generation)

この問題に対する既存の解​​決策がないように思われるため、データセットにカスタム バッチ生成コードを実装しました。これにより、バッチ内のすべてのアイテムが同じサイズで、バッチの画像サイズが異なる可能性があるバッチを作成できます。これは、アスペクト比バケットと呼ばれる方法で行います。別のアプローチは、固定画像サイズを使用し、各画像をこの固定サイズ内に収まるようにスケーリングし、トレーニング中にマスクされたパディングを適用することです。これはトレーニング中に不要な計算につながるため、この代替アプローチに従うことを選択していません。以下では、アスペクト比バケットのカスタム バッチ生成スキームの背後にある元のアイデアについて説明します。まず、データセットの画像を並べ替えるバケットを定義する必要があります。この目的のために、最大寸法サイズ 1024 で最大画像サイズ 512x768 を定義します。最大画像サイズは 512x768 で、512x512 よりも大きく、より多くの VRAM を必要とするため、GPU ごとのバッチ サイズを小さくする必要があります。勾配の蓄積によって補償されます。次のアルゴリズムを適用してバケットを生成します。

●横幅を256に設定する。
●横幅を1024以下とする。

  • 高さが1024以下で、幅に高さをかけたものが512×768以下となるような最大の高さを求めます。

  • 高さと幅で与えられる解像度をバケットとして加算する。

  • 幅を64倍にする。

同じことを幅と高さを入れ替えて繰り返す。重複するバケットはリストから削除され、512x512サイズのバケットが追加される。

次に、画像を対応するバケツに割り当てる。この目的のために、まずバケットの解像度をNumPyの配列に格納し、各解像度のアスペクト比を計算する。次に、データセット内の各画像について、その解像度を取得し、アスペクト比を計算します。画像のアスペクト比はバケツのアスペクト比の配列から差し引かれ、アスペクト比の差の絶対値に従って最も近いバケツを効率的に選択することができる。

`image_bucket = argmin(abs(bucket_aspects - image_aspect))`.

画像のバケット番号は、データセットのアイテムIDと関連付けて保存される。画像のアスペクト比が非常に極端で、最適なバケットとさえも異なる場合、その画像はデータセットから切り捨てられます。

複数の GPU で学習するため、各エポックの前にデータセットをシャードし、各 GPU が同じサイズの個別のサブセットで作業することを確実にします。これを行うには、まずデータセット内のアイテムIDのリストをコピーし、それらをシャッフルします。このコピーされたリストがGPUの数とバッチサイズを掛けた数で割り切れない場合は、リストを切り詰め、最後のアイテムを削除して割り切れるようにします。

次に、現在のプロセスのグローバルランクに従って、`1/world_size*bsz`個のアイテムIDの明確なサブセットを選択します。残りのカスタムバッチ生成は、これらのプロセスのいずれか1つから見て、データセットのアイテムIDのサブセットに対して操作するように記述される。

現在のシャードについて、シャッフルされたデータセットアイテムIDのリストを繰り返し、画像に割り当てられたバケットに対応するリストにIDを割り当てることで、各バケットのリストが作成されます。

すべての画像の処理が終了したら、各バケツのリストを繰り返し処理する。もしリストの長さがバッチサイズで割り切れない場合は、割り切れるようにリストの最後の要素を削除し、別のキャッチオールバケットに追加する。シャード全体のサイズはバッチサイズで割り切れる数の要素を含むことが保証されているので、バッチサイズで割り切れる長さのキャッチオールバケットを生成することも保証されている。

バッチが要求されると、重み付けされた分布からランダムにバケットを引き当てる。バケットの重みは、バケットの大きさを残りのすべてのバケットの大きさで割ったものに設定される。これにより、サイズが大きく異なるバケットであっても、学習時に画像サイズに応じて画像が表示される場合、カスタムバッチ生成により強い偏りが生じないようにしている。重み付けをせずにバケットを選択した場合、学習中に小さなバケットが早期に空になり、学習が終わる頃には大きなバケットだけが残ることになります。バケツに大きさによる重み付けをすることで、これを回避することができる。

最後に、選択されたバケツからアイテムのバッチが取り出される。取り出されたアイテムはバケツから取り除かれる。バケツが空になったら、そのバケツはエポックの間、削除される。選択されたアイテムIDと選択されたバケツの解像度は、画像読み込み関数に渡される。各アイテムIDの画像が読み込まれ、バケツの解像度に収まるように処理される。画像のフィッティングには、2つのアプローチが考えられる。

まず、画像を単純にリスケーリングする。この場合、画像に若干の歪みが生じる。そこで、2つ目の方法を採用しました。

アスペクト比を保ったまま、以下のように画像を拡大・縮小します。

アスペクト比がバケツの解像度と一致する場合、バケツの解像度にぴったりと合わせる。
アスペクト比が一致すればバケット解像度にぴったり合うか、一方の次元はバケット解像度を超えても他方の次元はぴったり合うかのどちらかです。

後者の場合,ランダムクロップが適用される。

画像あたりの平均アスペクト比の誤差はわずか0.033であることから、これらのランダムクロップは実際の画像のごく一部、通常は32ピクセル未満を削除するだけであることがわかります。

読み込まれ、処理された画像は、最終的にバッチの画像部分として返されます。

Stable Diffusion Tokenの上限を3倍に拡張

(Extending the Stable Diffusion Token Limit by 3x)
オリジナルのStable Diffusionモデルでは、プロンプトの長さは最大75CLIPトークン、それに開始と終了のトークン(合計77)である。これは、CLIP自体にこの制限があり、分類器不要のガイダンスで使用されるベクトルを提供するために使用されるためです。

情報量の多いタグを扱うため、この制限を超えることは容易です。私たちは、このモデルの最大プロンプト長を3倍に拡張することに成功しました。

これにより、1つのプロンプトに多くの情報を詰め込むことができ、生成される画像をきめ細かく制御することができるようになりました。
また、AIストーリーテラーで生成された冒険のテキストを使用するのにも最適です。

このため、プロンプトのバッチ内の最大長のプロンプトを決定し、その長さを75の最も近い倍数に切り上げます。バッチ内の短いプロンプトは、CLIPの文末トークンを使って、最長プロンプトと同じ長さになるようにパディングされます。全体の長さが225トークンという私たちが決めたカットオフポイントを超えている場合、バッチはシーケンス次元に沿って225の長さに切り捨てられる。その後、バッチはシーケンス次元に沿って75トークンの個々のチャンクに分割されます。各チャンクは、CLIPのテキストエンコーダーに個別に渡されます。その結果、エンコードされたチャンクが連結される。

無条件条件付け(UC)とプロンプト条件付けは、分類器不要のガイダンスのために `uc + (uc - prompt) * scale` という形で一緒に追加されるので、モデルに対して推論を行う際にはUCをプロンプトと同じ長さにパッドするようさらに注意を払う必要がある。

初期の実験では、ベースのStable Diffusionモデルが、このフォーマットで与えられるプロンプトの追加情報をある程度利用することができることに注目しました。最高のパフォーマンスを保証するために、学習中にプロンプトの長さを75トークン以下から225トークンまでの間で変化させ、モデルが理想的な方法で異なるサイズのプロンプトに適応できるようにしました。

Hypernetworks

2021年、クルムズ(Kurumuz)はモデル世代の新しい制御方法として、ハイパーネットワークスの開発に着手しました。
その目的は、現在プロンプトチューニングをベースにしているNovelAIに、より優れたテキスト生成モジュールを提供することであった。

なお、このコンセプトは、2016年にHaらが紹介したHyperNetworks (https://arxiv.org/abs/1609.09106) とは全く異なり、モデルの重みを修正または生成することで動作しますが、我々のHypernetworksは、大きなネットワーク内の複数のポイントで単一の小さなニューラルネットワーク(線形層または多層パーセプトロン)を適用し、隠れた状態を修正します。

開発の過程で、私たちはハイパーネットワークの様々な構成について実験を行いました。初期段階での実験の多くは、テキスト生成のための大規模なトランスフォーマーモデルで行われました。

これらの実験の結果は、将来のAIモジュールV2に反映される予定です。

より小規模なスケールでの初期テストでは、非常に有望な結果が得られ、以前のプロンプトチューンよりもモデルの動作に強い影響を与えるモジュールを作成できるようになりました。このため、新しいハイパーネットワークアーキテクチャによって可能となる様々な追加モジュール用のデータセットを作成し、最適化しています。

この技術で重要なのは、パフォーマンスです。より複雑なアーキテクチャでは、学習後に高い精度を達成できるものもありますが、本番環境では推論の速度低下が大きな問題となり、品質向上が無意味になってしまうほどです。より大規模なハイパーネットフリーモデルは、その時点でそれを凌駕し、かつより良い結果を出すことができるのです。

Stable Diffusionの開発初期、発売前のことですが、私たちは研究目的でモデルにアクセスすることを許可されました。その間、当社の研究者は、どうすればこのモデルを改善できるか、さまざまな角度から掘り下げました。その中で、私たちのサービスにフィットするのはモジュールでしょう。ユーザーはすでにテキスト生成サービスでその概念を知っていますし、モデルの出力をこれまでにない形でコントロールすることができます。当初は、テキスト生成モジュールと同じような埋め込み学習を試してみました。(この手法は、テキスト反転でも同様に適用されています)。

しかし、学習した埋め込みではモデルが十分に汎化できず、その埋め込みに制限されて全体の学習容量が非常に小さいことがわかりました。そこで私たちは、ハイパーネットの技術をStableDiffusionに応用することを考えました。それがうまくいけば、より多くの学習能力を持ちながら、実稼働環境でも十分通用する性能を維持できるはずです。

多くの異なるアーキテクチャを繰り返しテストした後、Aeroは、パフォーマンスと、様々なデータセットサイズで高い精度を達成できるアーキテクチャを考え出すことができました。ハイパーネットは、StableDiffusionのCrossAttention層のkとvのベクトルに適用され、U-netの他の部分には触れないようにしています。このアプローチでは浅い注意層がすぐにオーバーフィットすることが分かったので、学習中にそれらの層にペナルティを課します。これにより、オーバーフィッティングの問題はほぼ緩和され、トレーニングの最後にはより良い汎化が得られるようになりました。

我々は、このアーキテクチャが、いくつかのケースで微調整と同等かそれ以上の性能を発揮することを見出した。

このアプローチは、対象概念に関するデータが限られている場合、特に微調整より優れた性能を発揮する。これは、元のモデルが保持され、ハイパーネットがデータにマッチする潜在空間の疎な領域を見つけることができるためであると考えられる。一方、似たような小さなデータセットで微調整を行うと、少ない学習例に合わせようとするため、モデルの汎化品質が低下してしまうのです。

さて、これでおしまいです。
この3ヶ月で発見された深い開発内容を楽しく学んでいただき、NovelAI Diffusionを使った生成を楽しんでいただければ幸いです。

「AI神絵師本」いよいよ10月28日 配信開始です

「AIとコラボして神絵師になる 論文から読み解くStable Diffusion」白井暁彦 (著)

本書は、今話題沸騰中のAIによる画像生成の仕組みや使い方について、中学生でも理解できることを目指し、わかりやすい説明で紹介した解説書です。難しい数式を全く使用せずにAI画像生成技術の最先端を科学コミュニケーターである著者がやさしい口調で解説しています。またより深く知識を得たい読者のために、Pythonでのサンプルコード、プロンプトの基礎や出力例、AI画像生成の法的な側面、実際の仕事で使ったユースケースも掲載。表紙イラストもAIで生成しており、担当イラストレーター・852話氏と著者の対談も掲載しています。先端技術を使いこなして、AI神絵師になるための「冒険の書」です!

(出版社の書誌情報より)

難しい数学やプログラミングをAI画像生成技術を通して理解できちゃう「中学生でも読める本」を目指しました。AIに興味がある人も、AIに憎しみがある人もぜひ読んでほしい出版社のポータルhttps://nextpublishing.jp/book/15689.html

印刷版予約URL https://ivtv.page.link/ap
Kindle版予約URL https://ivtv.page.link/ak

よろしくお願いいたします!


いいなと思ったら応援しよう!