LORA作成における学習回数の決め方~エポック・ステップ・バッチについて

 ふと2024年秋版のLORA作成TIPS書きはじめたんですが、学習回数の決め方の説明がめちゃくちゃ長くなったので、そこだけ別記事にすることにしました。

 学習回数ってSTEPだとかEPOCHだとか、パラメータが複数あって直感的に理解しにくく、ちゃんと説明しようとすると、長くなるんですよね(笑)

 なお本記事の前提ですが、自分はLORA学習の理屈を知っているわけではなく、自分でLORA作成するときの試行錯誤の結果としてうまく行った方法を説明しているだけです。
 実は「たまたま結果が合っているだけで、実は理屈は合ってない」とか「もっと良い方法がある」なんてことはいくらでもあると思います。
 なので、ここに書いてある記事はあくまで、経験則に基づく推察記事にすぎないことを御了承ください。
 それでも、なにか問題があったときに参考程度にはなると思います。

 ついでに書いておくと、生成AI関連のテクニカルな知識は、正直なところ「すぐに陳腐化する可能性がある」ので、適当に覚えておけばいいかなぁとも思っています。
 実際、SD1.5の頃の知見はSDXLになって無用になったものも少なくありません。
 SDの次期バージョンとかFluxが主流になればSDXLの知識が全部無駄になる可能性もあります。
 なので、とりあえず必要なものだけ覚えて、それ以外はざっくりやっていけばいいかなぁ…と思っています。

STEP数とバッチの話

 素材の数×繰り返し数×エポック数×(STEP数×バッチ数)=総学習回数
 算数苦手で式に自信がないのですが(笑)、うちのSD scriptのコンソール表示ではこれであってるはずです。

 学習回数を決めるパラメータは以下の物があります。

  1. 画像の枚数

  2. 画像の繰り返し数:(フォルダの前の数字。「01_neko」なら繰り返し数は1,「10_neko」なら繰り返し10。

  3. エポック:用意した画像をすべて学習すると1エポック。繰り返し数が10だと「画像セットを10回学習する」のが1エポック。

  4. バッチ数:一度(STEP)に何枚の画像を学習するか。1なら1枚、2なら2枚、4なら4枚。

  5. STEP数:学習する回数。画像数×繰り返し数×エポック数で決まる。これにバッチ数を掛けたものが「総学習回数」。

繰り返し数
 基本的に「1」でいいです。
 この数字が用意されたのは「正則画像と学習用画像の比率をそろえるため」で、最近のLORA学習では正則画像を使うことはほぼないので基本的に不要です。
 画像を読み込む回数はエポックで指定すればいいです。
 ただし、画像数が極端に少ない場合は、繰り返し数を増やして1エポックあたりの画像を適度に増やす(※1)という手も考えられなくはありません。

(※1) cosine_with_restartなど、エポック単位で働くタイプのスケジューラーは、1エポックの画像が1枚とか2枚しかないと、想定通りの学習をしてくれない可能性があります。
 その回避策として、繰り返し数を大きくして1エポックあたりの画像数を増やすという手があります。
 ただし、実際にどの程度の効果があるか、そもそも意味があるかは知りません。理屈から考えるとそういう手もあるかも…という話です。

 また、自動学習系のオプティマイザーを使う場合、エポックごとに学習率を調整する…という話をどこかで見た記憶があります(ソースを探しましたが見つかりませんでした…)。
 この説が正しいなら、総STEP数が同じでもエポック数が違うと学習結果が変わる可能性があります。
 ただし、実際にどの程度の影響が出るかはよくわかりませんし、仮に多少違いが出たとしても誤差の範囲かもしれません。

バッチ数
 考えるのが面倒であれば「1」でいいです。
 拘りはじめるとバッチ数は1がいいとか2がいい…みたいな話も出てきますが、基本的にはディテールの部分なので、とりあえず「1」にしておけば問題ないです。

 SD-Scriptのドキュメントによると「バッチ数を増やすと、まとめて計算するので相対的に早くなり精度も上がる。ただし学習量は減る」とあります。
 なので、理想は「できるだけ大きめのバッチ数にして、減った学習量を補うためにSTEP数か学習率をやや上げる」と思われます。

 また「まとめて計算する」ということは、2枚の画像を同時に処理するので、2枚の画像内容の違いが分かりにくくなるはずです。
 そのため、「キャラの服装が複数あって別々に覚えさせたい」とか「2キャラ同時に学習したい」といった、個別の違いをガッツリ覚えさせたい場合は、バッチ1の方がよいと言われています。

 逆に画風LORAなどでは、ディテールをガッツリ覚えられて「それしか出なくなる」のは困るケースもあります。

 このあたりは各自の学習スタイルや経験則、LORAで学習したい内容などでで変化してくると思うので、いろいろ試しながら自分なりの正解を探るのがいいかと思います。
 自分の場合、バッチを2にしてクオリティが落ちた経験がほぼ無いので(スペック的に4が厳しく、3は奇数が気持ち悪いので、実質1か2の2択)、バッチは基本2にしています。
 ただし、学習がうまくいかないときとか、キャラやアイテムなどでディテールに拘りたいときに「1」で試すことはあります。
 結局はケースバイケースですねw

バッチ数と学習時間・メモリ
 バッチ数を増やす=一度に学習する枚数(=1STEP毎の学習枚数)を増やすと、一度あたりの学習時間が延び、メモリの消費量も増えます。
 1STEPに要する学習時間が増えるため「一度に学習する量を増やしたから、学習にかかる時間が減る」とはなりません。
 「バッチ数を2倍にしたときに増加する時間が2倍以下」であれば、時間短縮できますが、2倍以上になるとかえって遅くなります。
 十分なスペックがあればバッチを増やした方が学習時間は短くなりますが、VRAMが足りないと低速の通常メモリを使い始めて大幅なスピードダウン=少ないバッチの方が速くなったりします。

学習の回数とパラメータ
 学習量は先に書いたように「画像枚数×繰り返し数×エポック数×バッチ」で求められる「総学習回数」で決まります。
 たまに「10エポックぐらいで学習すればOK」「2000STEPでOK」みたいな説明を見ますが、STEPが1000の10エポックとSTEPが2000の10エポックでは、同じエポック数でも学習量が倍違いますし、1バッチ2000STEPと2バッチ2000STEPも学習回数は違います(過去の自分の記事でそういう書き方をしていたら説明不足です。ごめんなさい)。

 例えば10エポックの2000STEPでバッチ数2と、20エポックの2000STEPでバッチ1は、学習回数は4000で同じです。

 適切な学習回数は、使用するオプティマイザーの影響が大きく、さらに学習素材の質や学習したい内容など、さまざまな要素が関係してきます。
 なので一概に「これが最適」という数値を決められません。

 自分の場合は「Prodigyで2000~4000回程度学習し、ある程度の回数ごとに出力しておき良い感じのを使用する。
 良いのがなかった場合(すべてが学習不足だったり過学習だったりした場合)はパラメータを弄って学習しなおす」というやり方にしています。
 なので、最初は総学習回数が4000回ぐらいになるようにパラメータを調整しています。

パラメータの決め方

 総学習回数を用意した画像枚数で割って、バッチ数を上げる場合はその分も割ります。
 出てきた数字を「エポック数」として指定します。
 例えば画像数が20枚で、バッチ数を2にして、4000回学習したい場合は下記のようになります。

 4000 / 20(画像枚数)=200
 200 /2(バッチ数)=100
 100エポック。

 これで学習回数4000回です。バッチ数が2のため、1STEPあたりの学習が2回になり、結果として総ステップ数は学習回数の半分である2000STEPになります。
 なお繰り返し数を10にすると 4000/(20x10)=20、20/2=10 となって、エポック数は10です。

 注意点としては、学習画像の解像度がバラバラなときに、SD-Scriptの「Aspect Ratio Bucketing」を使用して(通常はonになっていることが多いです)バッチ数を2以上にすると、バッチ処理できないケース(1枚づつしか学習できない)が発生して学習回数が増加することがあります(というか大抵の場合は増えます)。
 学習枚数自体は変わっていないはずなのであまり気にしなくてよいはずですが、ズレが大きくて気になる場合はバッチ数を1にするとよいかと思います。

学習方法と適切な学習回数

 以下は、理屈ではなく経験をもととした話です。

adamW
 学習率を小さくとって学習回数を大きくした方が良い結果がでることが多いようです。
 個人的な印象だと5000回~1万回ぐらいがよさげ。

Prodigy
 学習率自動調整型であるProdigyは2000~3000回ぐらいがボリュームゾーンな印象です。
 それ以上学習しても画像がガビガビになったりはしませんが、人体構図が崩壊しやすくなる気がします。

LORA-PLUSとDORA
 1000~2000回程度の学習で完成している感じ。それ以上まわすと構図崩壊がおきやすくなったり、ガビガビの画像が出てくる露骨な過学習状態になりがちです。

それ以外
 ほとんど試してないから分からない。
 ADAFACTORはSD1.5と同じであれば、5000回以上回した方が良い結果がでそう。
 DAdapt系は自動調整型で学習が速い傾向があるけど、Prodigyよりは緩やかなので2000~5000回程度…かも?

LORAとLOHA(Lycoris)
 LORAとLOHAだとlohaの方が学習のピークが速い印象。
 ただ、違いはそれほど大きくないようで、だいたいの場合は同じ程度の数値で問題ない。
 なお、DORAはLohaだとバグりやすいので個人的にはLORA推薦。

いいなと思ったら応援しよう!