Stable Diffusion のファインチューニング記事まとめ


# 目次
[1. はじめに](#1-はじめに)
[2. ファインチューニング手法概説](#2-ファインチューニング手法概説)
[3. 各種ファインチューニング記事](#3-各種ファインチューニング記事)
[4. おわりに](#4-おわりに)

# 1. はじめに

Stable Diffusionとは、ダウンサンプリングファクター8のオートエンコーダーとパラメーター数 860M の U-Net および CLIP ViT-L/14 テキストエンコーダを Diffusion Models に用いたアーキテクチャを指します。

Stable Diffusion は、オンライン上の研究コミュニティである CompVisとLAION、そしてロンドンをベースとする AI 企業の Stability AIの合作として開発されました。オープンソースとして 2022 年 8 月に Hugging Faceで公開されています。

テキストから画像を簡単に生成できると話題になりました。

<img width=400px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/a802d763-5dbd-a981-082d-dc8016d084c1.png">

本記事では、Stable Diffusionに新しいデータを追加するファインチューニングの各種手法について概説をまとめ、それぞれを実行するために参考となる記事を集めました。筆者もStable Diffusion web UIといらすとやの画像でファインチューニングを試してみました。

# 2. ファインチューニング手法概説

## Textual Inversion

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/f8512b58-ca59-0993-ef34-1bc0b63c2ccc.png)

Textual Inversion[^1]では、Text Encoder の埋め込み空間において、新しい「単語」を学習します。

図のテキストプロンプトの単語$S_\*$が新しい単語です。この単語はトークナイザーに該当する単語がないため、埋め込み表現$v_\*$もありません。

そこで、$v_\*$を学習します。Textual Inversionでは新しい単語（≒テキストプロンプト）とその単語に対応する画像（=Input Sample）を入力します。Input Sampleを入力し、ノイズをかけてNoised Sampleにします。$S_\*$を含むテキストプロンプトをText Transformerで特徴量$c_\theta(y)$に変換します。その際、$v_\*$は適切に初期化しておきます。Noised Sampleを特徴量$c_\theta(y)$で条件づけて、Generatorで画像を生成し、これがInput Sampleに一致するようにバックプロパゲーションして$v_\*$を学習します。



様々なプロンプトと画像のバリエーションで何度も（通常数千回）処理を行った後、学習された埋め込みは新しい概念の本質をとらえることができるはずです。

論文中では画像は5枚でうまくいくと記載されています。Textual Inversionの学習後に生成されるweightファイルサイズは100KB程度です。

[^1]: Rinon Gal, Yuval Alaluf, Yuval Atzmon, Or Patashnik, Amit H. Bermano, Gal Chechik, Daniel Cohen-Or, **"An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion"**, https://arxiv.org/abs/2208.01618


## Hypernetworks　

Hypernetworks[^2]はNovelAI[^3]がStable Diffusion[^4]の改造に使用した手法です。NovelAIの開発チームがブログ[^2]で解説しています。

ネットワークの改造部分に言及している箇所は以下です。

>After many iterations testing many different architectures, Aero was able to come up with one that is both performant and achieves high accuracy with varied dataset sizes. The hypernets are applied to the k and v vectors of CrossAttention layers in StableDiffusion, while not touching any other parts of the U-net. We found that the shallow attention layers overfit quickly with this approach, so we penalize those layers during training. This mostly mitigated the overfitting issue and results in better generalization at the end of training.
>
>引用元： NovelAI Improvements on Stable Diffusion

Stable Diffusion（=Latent Diffusion Models）のU-netにはCross Attentionが含まれています。このCross AttentionのkeyベクトルとvalueベクトルにHypernetworkModuleと呼ばれる層を追加しています（Stable Diffusion web UI[^5]の実装[^6]から確認しました）。

つまり、Hypernetworksでは、元のStable Diffusionのweightをそのままに、新しく追加した層を学習することでファインチューニングを行っています。

<img width=600px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/9049527b-be2f-b458-2351-6f73f3428b02.png">

Hypernetworksのレイヤー構造については[この記事](https://zenn.dev/discus0434/articles/14e1d7c9baf8b5 
)が参考になります。

学習にはプロンプトテキストと画像を使用します。プロンプトテキストは画像を表す単語やタグから作成します。画像は数十枚でうまくいく場合もあるようです。Hypernetworksの学習後に生成されるweightファイルサイズは80MB程度です。


[^2]: **"NovelAI Improvements on Stable Diffusion"**, https://blog.novelai.net/novelai-improvements-on-stable-diffusion-e10d38db82ac

[^3]: **"NovelAI - The AI Storyteller"**, https://novelai.net/

[^4]: **"CompVis/stable-diffusion · Hugging Face"**, https://huggingface.co/CompVis/stable-diffusion

[^5]: **"Stable Diffusion web UI"**, https://github.com/AUTOMATIC1111/stable-diffusion-webui

[^6]: https://github.com/AUTOMATIC1111/stable-diffusion-webui/blob/master/modules/hypernetworks/hypernetwork.py, `attention_CrossAttention_forward`

## Dreambooth

<img width=600px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/83bb5dfa-b2b1-c130-2614-bdd61b4a8904.png">


Dreambooth[^7]はGoogleが発表したStable Diffusionのファインチューニング手法です。

(a) 入力画像と、一意な識別子（例：A）と被写体が属するクラス名(例：dog)を含むテキストプロンプト（例：A [V] dog）のペアで低解像度text-to-imageモデルをファインチューニングします。
この時、Loss関数にクラス固有のPrior-Preservation Lossを追加することで、オーバーフィットとlanguage driftに対処します。事前にクラスのテキストプロンプト（例：A dog）を入力して生成された画像を用意し、新しいテキストプロンプト（例：A [V] dog）で新しい画像が、事前のクラスのテキストプロンプト（例：A dog）で事前に生成した画像がそれぞれ生成されるようなLossを構成します。

<img width=800px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/763d97dd-94cb-8cc2-bf71-deb84f02be09.png">

(b) 入力画像から低解像度画像と高解像度画像のペアを用意し、超解像コンポーネントをファインチューニングします。これにより被写体の細かいディテールに忠実な画像生成を可能にします。

[^7]: Nataniel Ruiz, Yuanzhen Li, Varun Jampani, Yael Pritch, Michael Rubinstein, Kfir Aberman, **"DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation"**, https://arxiv.org/abs/2208.12242


## 純粋なファインチューニング

Stabel DiffusionのネットワークのU-Netの部分のみファインチューニングします。
画像（数百枚以上）とキャプション（さらにはタグ）のペアを用意して学習を行います。


## その他

いっぱいあって追いつけません。

- [Inversion-Based Creativity Transfer with Diffusion Models](https://arxiv.org/abs/2211.13203)

- [LoRA: Low-Rank Adaptation of Large Language Models](https://arxiv.org/abs/2106.09685)

# 3. 各種ファインチューニング記事

## Stable Diffusion web UIを使用する方法

Textual inversion、Hypernetworks、DreamBoothはStable Diffusion web UIを使用して実行することができます。こちらのwikiが詳しいです。
- [としあきdiffusion Wiki](https://wikiwiki.jp/sd_toshiaki/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E6%96%B9%E3%81%AF%E3%81%93%E3%81%A1%E3%82%89)

上記の記事をgoogle colabで実行する際の注意点が記載されています。
- [【Novel AI】HyperNetworkをcolabの無料枠で行う方法【waifu diffusion】](https://onlinegamernikki.com/hyper-network-colab#toc3)

上記の記事で、学習済みの.ptファイルの配置について記載がないので下記で補足。
- [アーティストの画風やキャラの特徴を追加するhypernetworksを使う【Stable Diffusion web UI(AUTOMATIC1111版)】](https://bookyakuno.com/aiart-hypernetwork/)

Hypernetworksの設定チューニングの参考。
- [StableDiffusionのファインチューニング(Hypernetworks)のやり方を手取り足取り解説するよ](https://qiita.com/takada-at/items/89e08c7a252b7e714f2e)

今回は以上記事を参考に、いらすとやでファインチューニングを試しました。Stable Diffusionは[sd-v1-4.ckpt](https://huggingface.co/CompVis/stable-diffusion-v-1-4-original)を使用しました。いらすとやの画像は一人の人が写っている画像を25種類用意し、長辺が512pxになるようにリサイズ、短辺が512pxになるように白でパディングを実施しました。透過成分が不要なのでjpeg形式で保存しました。画像のタグはDanbooruタグを使用しています。環境はGoogle colab Proを使用しています。学習には両方とも7時間程度かかりました。

Textual inversionで生成した"Boy in space suit riding a horse"

<img width=400px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/ac7b4933-7e4c-c1f3-9818-95adc96b4943.png">

Hypernetworksで生成した"Boy in space suit riding a horse"

<img width=400px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/4d11e16a-ef78-48d6-dff0-1a9c4e45cb62.png">

Hypernetworksのほうが追加のネットワークがある分、良い感じです。


## スクリプトやnotebookで実行する方法

Textual inversionの本家実装を使用した記事。
- [Stable Diffusionでファインチューニング(Finetune)を試す](https://sheltie-garage.xyz/tech/2022/09/stable-diffusion%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%B3%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%82%92%E8%A9%A6%E3%81%99%E3%81%8C%E3%80%81%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE/)
- [Stable Diffusionをいらすとやでファインチューニングする](https://birdmanikioishota.blog.fc2.com/blog-entry-8.html)

DreamBoothをgoogle colabで行う記事。
- [[DreamBooth] Stable Diffusionを追加学習して独自のモデルを作成 [無料Colab]](https://www.12-technology.com/2022/10/dreambooth-stable-diffusion.html)

Diffusion Modelの純粋なファインチューニングをColabで実行できるプログラム。
- [Diffusion Model（拡散モデル）の追加学習をColabでやる方法_ver2](https://note.com/kizamimi/n/n6eb5dd528312)


以上記事は動作確認できていません。

# 4. おわりに
本記事ではStable Diffusion のファインチューニングの記事をまとめました。Stable Diffusion web UIを使用すれば非常に簡単にファインチューニング出来たので、みなさんも試してみてください。


# その他参考にした記事

Textual Inversionの解説
- [Textual Inversion · AUTOMATIC1111/stable-diffusion-webui Wiki · GitHub](https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Textual-Inversion)

Waifu Diffusionの訓練方法
- [Stable Diffusionにdanbooruデータセットを追加学習する](https://tadaoyamaoka.hatenablog.com/entry/2022/09/15/214131)

壮大なまとめ記事
- [Stable Diffusion WebUI 1111でのAI画像生成をちょっとまとめ【環境構築・Promptなど】](https://kirarico.net/memo/2174/)