3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

こんにちは、たこらいすです。画像生成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はより複雑で詳細な「プロンプト」に基づいてテキストを生成できるようになっています。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?