Employee Blog
社員ブログ

AI画像生成における学習 (その2)

AIの学習における問題点の把握

はじめに

前回、ちょうど学習が開始するところまで終了しました。

今回はその学習結果をみながら、AIの学習における問題点と学習結果の評価について見ていきたいと思います。

学習モデルにおいて、評価は重要です。その評価を元に希望の結果に近づけるにはどうすればいいのかという指針をえることで、次の学習につなげていくことができます。AIの学習をしているのですが、実は同時に自分も学習していかなければならないのです。(AIに学習させようとしたら自分が学習する羽目になるとは皮肉が効いてますね!)

AIに学習をさせることを「機械学習(Machine Learning)」といいます。

1. TensorBoardによる学習状況の観測

機械学習では、結果を学習済みモデルとして出力するので、そのモデルを使って希望の結果に近づいているのかどうかを確認することでそのモデルが希望に近いのかまだまだなのか、はたまた遠のいているのか評価ができます。しかし、機械学習には膨大な時間がかかり、結果が出るまで待っていては結果の評価を得るまでに時間がかかってしまいます。また、機械学習特有の問題として、学習できていない、学習が進まない、過学習発散(勾配爆発)などの問題点があります。これらを学習がまだ完了する前に把握して中止することで、無駄なリソースの消費(無駄学習時間=無駄電力=お金の浪費、PC自体を別のことに使用出来る可能性の損失)を抑え、次の学習に素早く取り掛かることが出来たり、次の学習の際のパラメータの設定に活かすことが出来ます。

機械学習の際の学習状況の把握に非常に有用なツールが TensorBoard というツールです
TensorBoard
https://www.tensorflow.org/tensorboard?hl=ja

Pythonで動くツールで、ブラウザに学習状況を表示してグラフ化してくれます。

TensorBoardグラフ 表示イメージ

この TensorBoard のグラフを元に、学習の状態がどうなっているのかを判断することができます。

基本的に機械学習では、学習を進めてゆくと、細かい波の上下を繰り返しながら、少しずつ loss 値が小さくなっていく動きをします。

学習が上手く行っている例

学習が進んでいくと loss 値の値が 0.01 -> 0.001 -> 0.0001 と指数関数的に減ってゆくので変化量、変化の傾向がわかりにくくなった場合にはグラフを対数グラフに変更するとわかりやすくなります。

学習を開始しても

  • そもそもグラフに何も表示されない
  • loss のグラフがずっと横ばいで全く変化しない

のような場合には、学習のパラメータ設定が誤っている可能性があるため、パラメータの見直しを行ってください。

2. 勾配爆発(発散)問題

さて、前回の学習設定の例では 学習率(Learning Rate LR) を高め(0.001) に固定(constant)としていました。この設定では、最初の方は上手く学習が進んでいるのですが(図中(1))、終盤あたりはほとんどloss値に変化が無く学習が進まない状態(図中(2))になり、最後は急激に loss 値が悪化して勾配爆発(発散)という状態(図中(3))という状態に陥ります。

学習曲線 順調ー学習が進まないー発散

(3)の状態を勾配爆発、または発散と呼んでおり、この状態になった以降は学習結果はおかしくなってしまいまったく機能しないモデルになってしまいます。その為、この状態になったら学習を中止して、パラメータの見直しを行うことをおすすめします。

3. 生成したLoRAの評価

下の図は 学習結果を epoch 毎に実際に生成させて見たものになります。

学習 epoch 比較 上から LoRAなし, 14epoch, 22epoch, 34epoch, 45epoch で、すべて同じプロンプト「sail_kun, beach, masterpiece」ネガティブプロンプトなしで出力しました。beach を入れているのは背景に砂浜が出るかどうかで過学習度合いを見るために使用します。(もちろん beach でなくてもOK)

学習 epoch 比較 上から LoRAなし, 14epoch, 22epoch, 34epoch, 45epoch

まずは最下段から見ていきます。

  • 最下段は 45 epoch の結果なのですが、(3)の勾配爆発(発散)が起こってしまった為にセイルくんはもとより意味のあるものはなにも描画されず、真っ黒画像が描画されました。このように発散してしまった学習結果は意味のないものになってしまいますので学習を中止します。
  • 一番上に戻って最上段は LoRA なしです。元モデルにセイルくんは入っていないのでセイルくんは生成されません。
  • 次の14 epoch では ちょっと顔が歪んでいますがセイルくんぽいのが Seed ~804 では 砂浜と海のつもりなのか、背景に線が入っています。
  • 22 epoch でも同じようにSeed ~804 で背景に砂浜が描かれていますが、セイルくんも侵食されて(?)船の下側と手足先が茶色になっています。
  • 34 epoch では学習もかなり進んだ状態な為かバランスもなかなか良いセイルくんが描画されています。しかし背景は単色のバックになってしまっていて beach 成分はほとんどありません。

今回の学習から採用するとしたら 34 epoch のものなのですが、背景も変えられない、表情も変えられないでは単に元画像を切り取って貼りつけるのと何も変わりが無いため、画像生成モデルとしては役に立ちません。

4. まとめ

今回はLoRA作成時の学習結果の評価をしてみましたが、課題が新たに生まれました。

課題1)勾配爆発

課題2)背景が描写されない

課題3)セイルくんは固定表示の為、わざわざ画像生成する必要がない(セイルくんにバリエーションがない)

次回以降この課題の解決に取り組んでいきたいと思います。

それでは今回はこれまで。