見出し画像

モデルにバイアスをかけて追加学習する

はじめに

flux.1が公開されてしばらく経ちましたが皆様いかがお過ごしでしょうか。
ボクは学習をチラッと試したりしましたが、生成自体が重すぎンゴwwwとかうめきながらSDXLに帰ってきました。
そういえば、SD3もさることながらstable cascadeってどうなったんですかね…。とか言ってたらSD3.5が来ましたね。

今回は改めて日頃使っているLoRAの作成手法について整理したいと思います。
スライダーも3Dモデルからキャラクターを学習させるのも、生成モデルの出力を制限してから学習するという点では同じなので、このあたりの話です。
なお、いつも通り技術的な内容は無いようです。


スライダーLoRAは何をしているのか

学習の話をする前に自作のおっぱいスライダー(BreastsSize_XL)がどういう原理でおっぱいのみを大きく/小さくしているのかを説明しておきたい。

おっぱいスライダーはweightを+/-すると胸のサイズだけが変化する

意図しない変化も多少はあるが、概ね胸のサイズだけが変化している。
これを非常に大雑把に図示すると下図のようになる。

胸のサイズか、それ以外か。

このLoRAは胸のサイズというベクトルだけを学習しており、Promptに対して本来生成モデルが生成する結果を捻じ曲げている。
胸のサイズというベクトルってなんだ?

次にこの胸のサイズだけに影響を与える(Y軸に並行)LoRAをどうやれば作れるのかを考えてみる。
各データの特徴量の平均と考えると、多様性に溢れた胸のデカいデータを大量に用意すれば平均した結果「胸がデカい」というベクトルが生まれる。

この世の全てのlarge breastsを背負っている

danbooruには[large breasts]のタグが付いたデータセットが150万枚あるので、それらを満遍なく学習させれば十分な多様性があり、胸がデカいという特徴量だけが取り出されることでしょう……本当に?

便利なツールで調べたところ、[large breasts]のタグが付いているデータセットの内、55%は[cleavage(胸の谷間)]というタグが付いている。これは服の多様性を考えた時に明らかに偏ったデータである(厚着でもなお主張してくるlarge breastsが好きな人が困る)

あててんのよ

つまり、「多様性に溢れた胸デカデータ群」などというデータセットは幻想であり、[large breasts]のタグが付いた150万枚のデータセットで学習させたとしても、胸のサイズだけを変えるつもりが谷間を強調してきたり、やたらポロリしてきたりするようなLoRAが生まれるということである。

また、[large breasts]のように150万枚ものデータセットが得られる方が稀であり、マイナー性癖独特の嗜好の場合、より偏ったデータセットしか得られない。

実際に、特定のPromptを入力すると生成結果が偏るという経験をしている人も多いだろう。大規模Fine Tuningですら起こり得ることなので、小さなデータセットで作成したLoRAで「平均した結果として特定のベクトルを取り出す」のは現実的ではない

そこで逆に考える。
偏ったデータセットしか用意できないなら、生成モデル側を偏った出力しかできないように捻じ曲げれば良いのでは?

モデルにバイアスをかける

問①
ごく標準的な日本の高校の教室を想像してください。
あなたは教室の入口にいて、そのクラスに在籍しているAさんを呼び出して欲しいとします。Aさんは派手な金髪で、標準的な身長、バストサイズはCカップです。Aさんの特徴を一つだけ伝えるとしたら、なんと伝えますか?

問②
在籍している生徒の全員が派手な金髪でAさん以外はバストサイズがAカップの教室を想像してください。それ以外は問①と同様の設問です。

恐らく、問①では「派手な金髪」、問②では「胸が大きい」と答えたのではないでしょうか(実際に「胸が大きい人を呼んでくれ」などと言ったらひんしゅくを買うでしょうが)

よく訓練された生成モデルは多様な出力が可能だが、もし派手な金髪でAカップのgirlしか出ないモデルがあれば、派手な金髪のCカップのgirlとの差分は胸のサイズだけである(実際は髪色以外の要素も多量にあるが、簡略化のために無視する)

髪の色って明らかに直線では表現できないよね

このようにモデルの出力を偏らせる(あるいは完全に固定する)ことで、少数の(偏った)データセットでも「特定の概念(ベクトル)」を学習させることが可能になる。
このモデルの出力を偏らせる工程をモデルにバイアスをかけると呼ぶことにする、LLMと4,000トークン話し合ってできた呼称なので多分適切なんじゃないですかね。

例①:完全固定(いわゆるコピー機)

モデルにバイアスをかける例として、欲しい要素以外を完全に固定する、いわゆるコピー機学習をまず挙げたい。コピー機学習の詳細については下記の記事、あるいは下記の記事内にリンクを設けている記事を参照されたい。

コピー機学習におけるバイアスは全特徴を固定する広範囲で強力なもので、要するに生成モデルがある特定の1種のデータしか出せない状態にすることが基本である(まったく同じデータしか出ないからコピー機)

特定の1種のデータしか出ないので学習対象も1種で済む

生成モデルが1種のデータ(Aとする)しか出力できないので、Aのデータの一部(胸のサイズ)のみを変更したデータ(A')を用意すれば、AとA'の差である胸のサイズというベクトルだけを取り出すことが可能になる。

例②:不要な影響の排除

次に、3Dモデルを使ったキャラクターの学習を例に、不要な影響の排除について説明する。

3Dモデルを使用すると、一度モデルさえ作ってしまえば角度・ポーズ・表情などを一貫性を保ったままで簡単に変更できるのでデータセット作成にとても適しているのだが、無策で学習すると3Dモデル特有の質感まで学習されてしまう。また、背景については多様性を保持することも可能なものの、キャラクターが背景に埋もれてしまったり、単純に作業として面倒といった側面がある。

キャラクター学習用データセットが持つ特徴の分解

そこで、事前に3Dモデルの画風と背景を固定したバイアスをかけることで、品質の向上とデータセットの用意を楽にしようというのが狙いである。

具体的な方法については過去に複数の記事を書いているのでそちらも参照されたい。

おわりに

生成モデルの進化によって「いかに生成モデルのポテンシャルを殺さずに欲しい要素を付け加えるか」というアプローチはより重要になったと感じています。
illustriousはデータセットの選別とキャプションの整理によって一歩進んだ自由度(Prompt追従性)を手にしたと思いますが、こと小規模な追加学習においてはデータセットの偏りが避けられず、意図しない要素も学習されてしまうことに頭を悩まされます。
そんな時、こういうアプローチもあるよということを頭の隅に置いておくと、なんかいい具合に解決されるかもしれないし、されないかもしれない。

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