はじめに
こんにちは、たこらいすです。画像生成AIを利用して同人活動を行っています。
今回は「NovelAIは何がすごかったのか?」と題し、技術的な観点から解説を行います。
NovelAIは画像生成AIのStableDiffusionをファインチューニングし、アニメ風のイラスト作成に特化したものです。
2022年11月に公開され、現在までに250万人が利用しています。最近ではNovelAI Diffusion Anime V3が公開され、その高い品質が話題となりました。
NovelAIの技術的な改善点については”NovelAI Improvements on Stable Diffusion”という記事が、公式にMediumに投稿されています。
(参照:https://blog.novelai.net/novelai-improvements-on-stable-diffusion-e10d38db82ac)
本記事はこれを参考に解説したものです。
解説
CLIPの最後から二番目の層の隠れ状態の使用
CLIPはテキストと画像を扱うことができるマルチモーダルで、多くの画像生成AIに活用されています。
Stable DiffusionではCLIPの最後の隠れ層を用いて画像生成を行っていました。
しかし、Imagenでは最終層ではなく、その一つ前の層、つまり最後から二番目の隠れ層を使用しています。この手法が良い結果をもたらすという意見が他にもあったため、NovelAIもこのアプローチを取り入れてトレーニングを行うことにしました。
結果としてよりプロンプトを解釈する能力が高まり、制御性が向上しました。
実際に、NovelAIはStableDiffusionやWaifuDiffusionなどのモデルと比較して、より直感的なプロンプト制御が可能になった印象があります。
Custom Batch Generation
StableDiffusionなどのモデルは正方形の画像を生成するようにトレーニングされているため、不自然な切り取りが多く発生します、例えば以下のように人間は頭部や、脚が欠けた状態で生成されてしまいます。また、本来のサイズである512×512のサイズと大幅に異なるサイズの画像を生成するとパターンの繰り返しが生じたり、小さいサイズの画像では識別不能な画像が生成されたりします。
この問題を解決するためNovelAIではCustom Batch Generationという手法を用いて、様々なサイズの画像の学習を行いました。
custom Batch Generationはaspect ratio bucketing(アスペクト比バケッティング)という手法を用いている。aspect ratio bucketingは、画像を固定サイズにスケールして余白を追加する従来の方法ではなく、異なるサイズの画像をバッチ化して処理する手法です。
1. バケットの作成
幅を256から1024ピクセルまで64ピクセルずつ増やしながら、それに合った最大の高さを見つけてバケットを作成します。このとき、幅と高さの積が512x768ピクセルを超えないようにします。
2. 画像のバケットへの割り当て
各バケットの解像度をNumPy配列に保存し、各解像度のアスペクト比(縦横比)を計算します。
データセットの各画像についてもアスペクト比を計算し、最も近いバケットを選びます。
3. データセットの分割
複数のGPUで効率よく訓練するために、データセットを均等なサイズの部分集合に分割します。
4. 画像の処理
選ばれたバケットから画像を取り出し、バケットの解像度に合うように画像を調整します。このとき、画像のアスペクト比を保ちつつ、バケットの解像度に合わせてサイズを変更します。完全に合わない場合はランダムに切り取りを行います
5.バッチの要求
バッチが要求されると、重み付けされた分布からバケットをランダムに選び、その中から画像を取り出します。この重み付けにより、小さいバケットが早く空になりすぎるのを防ぎます。
トークン数の拡張
StableDiffusionnoのトークン数は75個のCLIPトークンに最初と最後のトークンを加えた77個でした。これはCLIPによる制限が原因です。
NovelAIではトークン数を3倍に拡張しました。
1. プロンプトのバッチ内で最も長いプロンプトを見つけ、その長さを75の倍数に切り上げます。
2. バッチ内の他の短いプロンプトは、最長のプロンプトと同じ長さになるようにCLIPの文章終了トークンで埋められます。
3. バッチの合計長さが225トークンを超える場合、225トークンの長さに切り詰められます。
4. その後、バッチは75トークンごとの個別のチャンクに分割されます。
5. 各チャンクは個別にCLIPのテキストエンコーダを通過し、その結果は結合されます。
ハイパーネットワーク
ハイパーネットワークは、モデルの重み(パラメータ)を変更または生成することで動作します。NovelAIのハイパーネットワークでは、大きなネットワーク内の複数のポイントに小さなニューラルネットワーク(線形層または多層パーセプトロン)を適用し、隠れた状態を修正するというものです。
ハイパーネットワークによって、NovelAIはより複雑で詳細な「プロンプト」に基づいてテキストを生成できるようになっています。