AUTOMATIC1111版のStable Diffusion web UIを用いてHypernetworkを学習する際に得られた知見などの備忘録です。
※機械学習モデルの訓練はあまり自分でやったことが無かったので、全然妄言を吐いている可能性があります。
基本
そもそもHypernetworkの学習をしたことがない人は以下の文献を見ればよし。
この2つの情報でだいたいなんとかなる。
一部情報が古かったりするので、以下でざっくり手順を解説します。
Hypernetworkの訓練
画像データを集める
絵柄などを学習する元となる画像データをインターネット上などから収集してきます。
データの数としては、16枚くらいあればいい感じがします。それより少ない枚数では試してないので分かりません。
ただし、上の参考文献でも強く言われていますが、量より質のほうが大事です。何も考えずにデータを増やすより、「学習しやすそう」なデータを厳選する方が良い結果が得られる確率が高くなります。
訓練の際に調整するパラメータもたくさんありますが、そもそもデータの質が悪いと意味がありません。
画像データを調整する
Hypernetworkの学習に用いる画像データは、512x512であることが推奨されています。
集めてきたほとんどの画像は512x512のサイズにはなっていないと思うので、この条件に合うように切り取ったり拡大縮小したりします。
512x512のサイズにデータを調整できたら、適当なディレクトリを作成してその中に保存しておきます。
web UIの設定を変更する
Hypernetworkの訓練に入る前に、一部設定を調整します。
まず自動で画像にラベル付けをする際にDeepDanbooruを使うので、web UIを起動する際に引数として--deepdanbooru
を渡します。これにより、web UI内でDeepDanbooruの機能が使えるようになります。
web UIを起動したらSettingsタブに移動し、以下のカテゴリの設定を確認します。
ほとんどは初期設定のままですが、Interrogate: deepbooru sort alphabetically
はオフ、Move VAE and CLIP to RAM when training
はオンにします。
あと、HypernetworkはNone(使用しない)にしてStop At last layers of CLIP model
は1にしておくといいらしい(?)です。(確証なし)
Hypernetworkの作成
Trainタブに移動して、Create hypernetworkタブを開きます。
Nameは、models\hypernetworks
ディレクトリ内に既に存在するhypernetworkと名前が被らなければなんでもいいです。素直にアーティスト名とかにしておくと分かりやすくていいと思います。
Modulesとlayer structureは基本いじらなくていいです。
活性化関数は基本linearで、マシンパワーにゆとりがある場合にはswishにしておくと良さげです。
自分の場合ですが、linearからswishに変えたら損失関数の値が小さめになったように見えたのでswishを推奨します。
余談ですがswishはReLUの亜種っぽい形状の関数です。詳しい解説はより機械学習に詳しいサイトなどを参照してもらえればと。
また重みの初期化についてですが、KaimingNormalは試してみたのですが損失関数の値がNormalのときと比べて2倍近くになって下がらなかったので、Normalを使ってます。
LayerNormは要らないらしいです。Dropout層を入れるかどうかはお好みで。
設定が済んだらCreate hypernetworkボタンを押すとhypernetworkが作成されます。
画像データの前処理
hypernetworkの訓練のために、先ほど用意した画像データにラベル付けをします。
Preprocess imagesタブに移動します。
Source directory
には先ほど用意した画像データを入れたディレクトリ、Destination directory
は画像データのコピーとラベル情報を持ったテキストファイルが保存されるディレクトリを指定します。
幅と高さは訓練に用いる画像データのサイズに合わせます。今回の場合、512x512です。
Create flipped copiesにチェックを入れることで、自動で左右反転された画像データも訓練用のデータに追加してくれます(画像の枚数を2倍にする)。
Use deepbooru for captionにチェックを入れてPreprocessを押すことで自動でラベル付けが行われます。
付けられたタグの調整
DeepDanbooruによるタグ付けは非常に精度が高くて良いのですが、それでも完璧ではないです。誤ってつけられたタグを消したり、逆に足りてないタグを手動で追加したりするとより良い結果が得られる確率が高まります。
また、固有のキャラクターが学習データに含まれている場合キャラ名のタグは消しておいた方がいいらしいです。(ここらへんまだよく分かってません)
ただ正直この工程はちょっと手間がかかるので、最低限キャラ名タグだけ消しておけばいいと思います。
Hypernetworkを訓練する
Trainタブに移動して、作成したhypernetworkを訓練します。
learning rateの設定などもかなり各々の思想があると思いますので、あくまで一例です。
この設定値は先ほど紹介した文献からそのままコピーしてきたものですが、結構上手く学習できています。訓練中に損失が0.3を超えているようだったら、learning rateをもっと下げたほうがいいです。
20000stepsを最後まで訓練しなくても大抵の場合十分な気がします。
自分は12500から15000stepsあたりのhypernetworkを使ってることが多いです。