勾配降下党青年局

万国のグラーディエントよ、降下せよ!

Stable diffusion関連のメモ

 勢いで開設したものの、現段階で書くことがとくにないので、Stable diffusion関連で自分自身が把握しているものとか、気になってることいろいろまとめよー。

理解している自信があるものほど字を濃くしていく。

 

ネットワーク関連

Text Encoder

 画像と文章を関連付けてくれるCLIPがあーだこーだ。Stable diffusionではプロンプトをベクトルに変えてくれる。どうやらプロンプト中の前にある単語が後ろにある単語に影響を及ぼすが、後ろの単語が前の単語に影響を及ぼすことはないらしい。モデルの中身はいつか勉強したい。いつかね。最終層のスキップとかよくわかってないし。

VAE

 変分オートエンコーダ―とかいうやつ。エンコーダ部分で圧縮して、デコータ部分で元に戻す。次元圧縮だけを目的とする普通のオートエンコーダと違って、分布を仮定しているので、その分布でサンプリングすれば生成もできる。Stable diffusionではエンコーダ部分で画像を8分の1に圧縮する。ただし4チャンネルになるので、圧縮率は48分の1。圧縮した画像(潜在変数とよぶ)を扱うことで、この後のUNetの計算量を削減する。

data-analytics.fun

UNet

 ノイズから画像を生成する、diffusion modelの肝。生成時はこのネットワークを50周くらいする(sampling step)。Uの字型のネットワーク(といっても人間が勝手に描いたイメージがそうなだけ)で、チャンネル数を増やしながらダウンサンプリングしていき、その後は元の形に戻していく。ネットワークはResnetとVisionTransformerが交互に入っていて、Resnetにはsampling step数をモデルに教えてあげる埋め込みベクトル、Transformerにはプロンプトの埋め込みベクトルが各層に入力される。

hypernetwork

 NovelAIのリークによって世に広まったもの。UNetの特定の層のattention層で、kとvをこのネットワークに入れる。元のモデルの形や重みを変えないので、一つのモデルで様々なスタイルを生成できるようになる。NovelAIは単純に次元を2倍にした後もとにもどす2層の全結合層でやってたみたいだが、最近この方法を頑張っている人は、層を増やしたり活性化関数を入れたり頑張ってるみたいだね。

学習関連

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

 Stable diffusionがやった学習通りにやります。今はこれを中心にやってます。

Textual inversion

 2か月前くらいにやってた方法。全然知らないけど特定の単語を学習元画像に近づくように埋め込む方法?モデル自体が変わるわけではないので、元々生成できない画像が生成できるようになったりしない。

Dreambooth

 なぞ。正則化画像ってなんだよ^^

学習設定関連

 これらを使わないとStability AIみたいにAmazonNVIDIAに大金を払うことになる。

AMP

 精度にあまり影響しないものを16bitにすることで、学習時間やVRAM使用量を削減する。モデルの重みそのものはもちろん、バッチ正則化部分とかは32bitのままにするみたい。

AdamW8bit

 Adamでつかう勾配の平均を8bitにしてVRAM使用量を下げる。

Gradient checkpointing

 逆伝播に必要な順伝播の履歴を全てではなく、途中途中だけ残すことで、VRAM使用量を下げる。再計算が必要になる分学習速度は落ちる。

Gradient accumulation

 勾配を何ステップか蓄積して、平均をとってから更新する。batch sizeをあげないと精度がよくないのに、VRAM使用量が足らないよ~ってときにつかう。NovelAIは解像度を上げた分VRAMが足らなくなったので、これを使ったそうだが、効果があったのかどうかはよくわからない。

latent cache

 初出はDreamboothなのかな?学習用画像をVAEのエンコーダーで潜在変数にする部分をあらかじめやっておくことで、学習時間を削減できる。これをしないとエポックごとにほとんど同じ計算をなんどもやる。ほとんどというのはエンコーダーには分布を確率的にサンプリングする部分があり、結果が一定ではないからです。ただし一回のサンプリングでも特に精度に問題はなさそう。

RandomHorizontalFlip

 torchvisionの便利関数で、学習画像をランダムで左右反転してくれる・・のだが、NovelAIもWaifu diffusionもこれをやってるせいで、左右非対称のキャラクターがうまく生成できない。何でオフにしないのか正直理解できない。

EMA

 重みの指数移動平均のこと。学習中の重みは振動しまくって安定しないので、画像生成には移動平均を使う。VRAM使用量が増えるし、ステップ数が少ないうちは学習が進まなくなるので、個人的にはファインチューニングでは使わないことにしてる。学習の最後の数エポックだけやればいい結果になるんじゃねとずっと思ってるけどやってない。

学習用データセット関連

wd1.4 tagger

 画像をdanbooruタグ風にタグ付けしてくれる。かなりすごい。

aesthetic

 画像を採点する。あまりすごくない。

GitHub - waifu-diffusion/aesthetic: Aesthetic classifier training & inference tools

 

あとなんかあったっけ・・・