背景
StableDiffusionは2022年に発表された、主に(他のタスクもできますが)、text から画像を生成することができる生成モデルです。
Fine-tuneする手法がいくつかあるのですが、まだ新しい技術だからか、わかりやすく違いがまとまっているものが見つからなかったので、視覚的に違いがわかるようにここに共有します。
学習の流れ
各手法の共有の前に、まず前提知識として必要なモデルのそもそものざっくりの学習の流れをまとめます。
プロンプトは、エンコーダーを通してEmbeddingに変換。
画像は、ランダムでノイズを付与。
「Embedding」と「ノイズが付与された画像」の二つを拡散モデル(UNet)に入力し、文章の情報も踏まえた上で「入力画像の中に含まれているノイズ」を予測します。
このノイズが、実際に付与したノイズとどれだけ違うのかをみて、モデル(ENCODER+UNet)の改善を行います。
ポイントとしては、
プロンプトには"UniqueIdentifier"と言って、存在しない言葉を用いて新しく教えたい概念を入れる必要があります。
(下の絵だと、DOGで存在してしまっていますが、、)
例えば、自分の顔を学習させたい場合は、"FUKUMOTO"っていう事前学習時には存在していないであろう言葉をプロンプトに入れる。
StableDiffusionが推論をするときは、下記の流れとなります。
- 上記の流れで、「ノイズ」を予測
- その「ノイズ」を入力画像から除去
- ノイズが除去された画像を再度拡散モデル(UNet)に入力
を何度も繰り返して画像を生成していきます。
手法①:DreamBooth
StableDiffusionをFineTuneしていると言ったら大体がこれに該当します。
特徴としては、新しいデータで更新する箇所は「Encoder」と「 拡散モデル」の二つです。(ピンクで塗られているところです。)片方のみの時もあります。
クオリティが高いと言われている一方、事前学習しているところを学び直しているため、新しいことを学ぶと昔のことを忘れてしまうというリスクが少しある。
手法②:Text-Inversion
DreamBoothの次によく使われている印象です。
この手法では、
UniqueIdentifierのEmbedding情報のみを更新していく手法となります。
つまり、それっぽい画像ができるまで、UniqueIdentifierを埋め込み直して調整するようなイメージです。
DreamBoothと違って、事前学習で学んでいる「Encoder」と「拡散モデル」には一切手を加えないので、過去学んだことを忘れることは起こりません。
また、学習を終えたら、UniqueIdentifierのEmbedding情報だけあれば他の人が利用できるようになるので、保存サイズが小さいです。
クオリティもDreamBoothに匹敵すると話している人もいるくらい高いみたいです。
手法③:LoRA(Low Rank Adaptation)
この手法は、新たな層を既存の「Encoder」と「拡散モデル」に挿入して、その追加した層のみを学習するアプローチとなります。
DreamBoothほど精度は高くないですが、学ぶパラメータの数が少ないため、学習速度が速いです。また、事前学習で学んでいる「Encoder」と「拡散モデル」には直接手を出しているわけではないので、過去学んだことを忘れるのは比較的少ないです。
手法④:Hyper-Networks
この手法は、LoRAのような層を予測するモデルを別途学習するアプローチとなります。LoRAが直接的に挿入した層を学んでいるのたいして、この手法は間接的に学んでいるような感じです。
LoRAの下位互換って言っている人もいるので、優先順位はかなり低め?です。
Writted by F.K(20代/入社3年目)