MkItYs

MkItYs > AI・交渉・物語の自動生成 > 

images

拡散モデルの調整パターン:DreamBooth/LoRA

images

- 2023.01.21

拡散モデルを調整する手法のひとつ、DreamBooth/LoRA のかんたんな解説です。

関連


系列データの処理とマルチモーダル:Transformer, CLIP
拡散モデルのチューナ/マージャ:Dreambooth Extension for Stable-Diffusion-WebUI, sd-scripts, Additional Networks for generating images …… それぞれのツールでの具体的な利用のしかた

概要


DreamBooth/LoRA は、対象のモデルに、そのモデルが知らない新しいコンセプト(概念)を覚えさせる手法です:[※1]

学習結果をどのように適用したいかで、大きく3つのパターンに分かれます:

個別:インスタンス・ベース……モノや様式の変化を、プロンプトのクラス〜インスタンスの組みで指定します
個別:キャプション・ベース……モノや様式の変化を、プロンプトのはたらきをできるだけ変えずに適用します
個別:ハイブリッド……上記2つのやり方の混合です

※1
DreamBoothが対象モデル全体(U-Net )の重みを変えるのに対し、LoRAは、それを変えるための小さなニューラルネットを作りますーーLoRAが生成するリソースはとても小さいので、(DreamBoothによる学習が難しい)性能の低いマシンでも、学習が可能になります。

個別:インスタンス・ベース


コンセプトをクラス〜インスタンスの組みで覚えさせる、当初からのやり方です:

クラス……分類(たとえば「女性キャラ」「男性キャラ」など、分類の単位になるものがクラスです)
インスタンス……実体(たとえば「女性キャラ」の実体は、具体的な「キャラA」「キャラB」になります)

学習:クラストークン/インスタンストークン

クラス〜インスタンスをプロンプトで示せるよう、それぞれをトークン(テキスト学習の単位になる文字列)に対応させます:

クラストークン……クラスを示すトークン(対象のモデルが認識している、既存のトークンであることが条件です。たとえば「女性キャラ」なら「girl」など)[※1]
インスタンストークン/アイデンティファイア……インスタンスを示すトークン(対象モデルが認識していない(既存のトークンにない)、新しいトークンを使います。たとえば「sks 」「shs 」など)[※2][※3]

学習:正則化画像/教師用画像

それぞれのトークンに対するイメージを、対象のモデルに覚えさせるために、学習のための画像群を与えます:

正則化画像……クラスを学習させるための画像群(基本的に、対象のモデルにプロンプト/ネガティブプロンプトを与え、相応の数だけ生成しておきます)
教師用画像……インスタンスを学習させるための画像群

利用

学習させたモデルに対し、次のプロンプトを与えることで、それぞれのインスタンスを描画させることができます:

INSTANS_TOKEN CLASS_TOKEN

たとえば、女性キャラのキャラA・キャラBを学習させたモデルでは、次のようにプロンプトを与えます:[※4]

girl # そのモデルの既存の女性キャラが描画される
sks girl # キャラAが描画される
shs girl # キャラBが描画される

※1
モデルによっては、クラストークンを「1girl 」にする方が有効にはたらきます。
※2
インスタンストークンは、できるだけ短く・既存の言葉にない文字列にします(たとえばアルファベットと数字の組み合わせなどは(sks001, etc.)、学習時に数字の部分が別トークンに分離されるため、いい効果は得られません)。
※3
なお「sks 」は、最初の論文で使われた<ありそうもない>文字列でしたが、じっさいはライフルの一機種であることが分かっています(なので学習が不十分なまま「sks 」をプロンプトに使うと、ライフルをもった(あるいは持ちそうな)キャラが描画されたりします)。
※4
この場合、2人のキャラを同時に出力できるのか、という疑問が湧きますけど……やってみたら、いちおうできますね(「2girl, sks 1girl, shs 1girl 」のプロンプトで出るようですーー「2girl 」で2人の人物を出す際に、「sks 」と「shs 」のどちらにも強く偏向しているので、生成過程で2キャラを出す、というところに落ちるからでしょうかーーそうなら「sks 」と「shs 」のどちらかによりフィットしていたら、1キャラしか出ない、ということもありそうです。さらにキャラ数が増えたら、全キャラの偏向を均すのは難しいでしょうし、すべてのキャラを出す前に収束しそうですが)。いずれにせよ再現性があるかは……

個別:キャプション・ベース


モデル全体の重みを教師用画像の学習で調整することで、コンセプトを表現します。[※1]


学習:教師用画像/キャプション

教師用画像群とそのキャプション群で学習させます(インスタンス〜クラスのトークンは使わず、正則化画像も通常は使いません)。


利用

プロンプトの使い方は変えずに、学習させたモノや様式を描画することができます。


※1
おもに4chan でよく使われているやり方ですね。

個別:ハイブリッド


インスタンス・ベースとキャプション・ベースを混合したやり方です。

たとえば、キャプション・ベースに正則化画像を加え、学習の影響範囲を限定する、など……さまざまな考え方があります。