AI画像生成における学習 (その4)
AIの学習における問題点の理解と対策
はじめに
以前の回 で、生まれた問題は以下の3 つでした。
課題1)勾配爆発
課題2)背景が描写されない
課題3)セイルくんは固定表示の為、わざわざ画像生成する必要がない(セイルくんにバリエーションがない)
そのうち、課題1 については、前回 スケジューラを変えることで対策しました。
今回は 課題2 の背景が描写されない問題の解決を目指します。
1. 背景が描写されない問題
以前の回 で作成した v01 、 v02 の LoRA は 背景が単色となったり、あまり詳細に描写されなかったり背景が上手く描写されませんでした。
これではまだ 画像編集ソフトで 透過画像を貼り付けたほうが良いので、画像生成AIの意味がありません。今回はこれを解消しようと思います。
2. セイルくんが過学習?
今まではセイルくんをうまく表示できれば良かったので、セイルくん一枚をとにかく頑張って学習せよ、ということで背景なしのセイルくん画像を学習させていました。しかし、あまりにも背景がないセイルくんの絵ばかり学習させるので、「学習する前は背景も書いてたんだけど、とにかくセイルくんだけそっくりに掛けばよいのね」と、判断されてしまい、背景の要素はどんどん埋もれていってしまいました。このような特定の学習のみを繰り返し行い過ぎた結果、同じような絵しか出なくなってしまう状況を「過学習」といいます。
3. 過学習(overtraining, 過剰適合または過適合 overfitting)とは?
機械学習を行う際に、必ず登場する用語で、モデルが最適以上の学習を行った場合に「必要以上に」「学習データに」寄ってしまい、「実際に利用とされるシーンでの利用がうまくいかなくなる」事象の事をいいます。モデルが過学習状態になると、学習データの入力時には期待する出力を行う確率が増ええますが、学習していない試験データを入力した際には期待する出力を行なわなくなる率が増えてしまいます。
今回の場合は、「背景も出してほしいんだけど、セイルくんしか出ない」という過学習状態になっています。
4. 過学習対策
過学習に対する対策はいくつかあります。
- 1. 学習を早期に打ち切る
- 2. 正則化により過学習を抑える
- 3. アンサンブル学習を行う
どれも行えば良いというわけではなく、モデルや行いたい学習の方向性などでも変わってきますので、自分の目的にあった対策を行う必要があります。
4.1. 過学習対策 – 学習の早期打ち切り
学習の早期打ち切り、とは、その名前の通り過学習になる前に学習を打ち切って終了することにより、過学習を防ぎます。
一般的に同じ訓練データを利用して学習を続ける場合、直接の学習対象となっている訓練データを利用することに対するエラー率はどんどん低くなっていきます。しかし、それ以外のデータとして用意されている試験データによる試験では、ある一定以上は学習を進めても試験データに対するエラー率は下がるどころか逆に上がっていってしまいます。この上がっていってしまった状態を「過学習」と呼んでいます。
この図で言うと、★のあたりが試験データのエラー率が最低になっているポイントですので、このあたりで学習を打ち切ることで過学習を防ぎます。
セイルくん学習の例でいうと、セイルくんはだんだんうまく出力できる状況になってくるけど、背景画像が出力できなくなる前に学習を止める、ということになります。
ただ、今回の場合、セイルくんがきっちり出力できるようになるまで学習した場合、どうしても過学習、つまり★よりも右の位置まで学習する必要があるため、残念ながらこの方法は使えません。
4.2. 過学習対策 – アンサンブル学習を行う
アンサンブル学習、とは、別々に学習をおこなったモデルを結合たり、平均をとったりして、モデルの多数決のような形をとることで全体的に良い学習にしよう、という方式です。1つ1つの学習結果はあまり期待通りではなくても、多数決により良さを引き出すイメージでしょうか。セイルくん学習の場合、なにか別のセイルくん学習結果をつくることができればそれを結合したり平均値をとったりできるとおもうのですが、現状は1データしかないのでなかなか難しいところです。
4.3. 過学習対策 – 正則化により過学習を抑える
正則化という用語を調べてみると、難しいシグマを使った計算式のようなものが出てきてしまいます。これらを画像生成AIをちょこっと利用するだけの初学者が完全に理解するのは難しいです。その為、ここでは考え方だけを利用することにします。
正則化には L1正則化と、L2正則化があり、L1正則化というのは、一言で言えば「余計なパラメータを排除する」ということになります。画像生成AIの機械学習についていえば、1枚の画像から1つの単語に対してしか紐づけないようにすることになります。前回の学習ではセイルくんのタグ sail_kun のほかに white_background というタグを付けていますが、これ以上削るとなるとなかなか厳しそうです。
L2正則化は逆に「飛び抜けて大きくなってしまったパラメータを弱くする」ので、セイルくんだけを学習させずに、出したい別のものも同時に学習することによってセイルくんだけが飛び抜けて学習されてしまい、セイルくんしか出力できないという状況を回避します。
前回の学習では sail_kun, white_background というタグの画像のみで学習したため、「sail_kun というのは、white_backgound といつもセットなのね」という学習をしてしまった可能性があります。そこで、今回は L2正則化の考え方を利用して sail_kun, <他の背景> という学習データをつくって学習させることで、sail_kun と white_background の関係の切り崩しを狙います。
5. セイルくんと他の背景の組み合わせの学習用データの作成
sail_kun, white_background だけの画像ではだめなんだろう、ということで、セイルくんがいろいろなところを背景に歩いている絵を合成しました。
元絵となる背景は、SDXL標準のモデルから生成したものを使用して、フォトレタッチソフトでひたすら背景として合成して出力しました。その数なんと100枚!(疲れた…)
これに、第1回 で行ったようにキャプションとしてタグを付けるのですが、流石に100枚ともなるとタグ付けも大変です。ですので、ツールを使ってタグ付けを行いました。Stable Diffusion WebUI のタグ付けの機能を利用して行いました。Stable Diffusion WebUI は Stable Diffusion のことなら何でもできる素晴らしいツールです。生成はもちろん、学習に関する機能まであります。
Stable Diffusion WebUI
https://github.com/AUTOMATIC1111/stable-diffusion-webui
例えば上の画像には、
sail kun, car, motor vehicle, ground vehicle, outdoors, tree, sky, cloud, building, road, house, street
というタグがつけられました。余計な概念を覚えて貰う必要はないのですが、今回は逆に sail_kun と white_background という2 つのタグに学習が集中することを回避することが目的なので、よほどおかしなタグ以外はそのままにしておきました。
6. 学習開始
初回では、セイルくんの画像が1枚しかなかったため、フォルダ内1枚の画像を繰り返し学習するように指示するため、 160_sail_kun のようにフォルダ名の先頭を 160 として 160回繰り返し学習するようにしていました。しかし、今回は100枚の画像を入れたので、ここを繰り返し学習するよう指示すると学習がなかなか終わらなくなってしまいますので、ここは 1_sail_kun_with_background のようにします。
Kohya_lora_trainer.exe を起動して、第1回のときと同様にパラメータを設定してゆきます。
1 枚の 画像を 160 回繰り返し学習 した結果を 1 epoch としていたのですが、今回は 100 枚の 画像を 1 回繰り返しが 1 epoch となるので、総ステップ数が同じ 800 となるように 80 epoch に設定を変更しました。
これで学習を開始します。
7. 結果評価
出来上がった lora をいつものように 背景を指定して 出力します。
beach が 2 枚あるのは、なぜか最初はうまく出力されない場合があったので、 beach が 2枚になっていますのでそこは気にしないようにしてあげてください。
forest のセイルくんがちょっと高さが低かったり、desert のセイルくんがちょっと白っぽかったりしますが、問題点だった背景が真っ白だったり、単調だったりする点はバッチリ解消されています。
なかなかいいんじゃないですかね!(まさに自画自賛)
まとめ
今回は課題2)背景が描写されない の対応について検討しました。
過学習となってしまった問題を元絵のバリエーションを付けることで防止しました。
次回は、課題3)セイルくんは固定表示の為、わざわざ画像生成する必要がない(セイルくんにバリエーションがない)に取り組んでいこうと思います。
それでは今回はこれまで。
参照元
利用したツールです。感謝!
kohya-ss / sd-scripts
https://github.com/kohya-ss/sd-scripts
RedRayz / Kohya_lora_param_gui
https://github.com/RedRayz/Kohya_lora_param_gui
Stable Diffusion WebUI