拡散モデルを調整する手法のひとつ、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 でよく使われているやり方ですね。
個別:ハイブリッド
インスタンス・ベースとキャプション・ベースを混合したやり方です。
たとえば、キャプション・ベースに正則化画像を加え、学習の影響範囲を限定する、など……さまざまな考え方があります。