loss

Last-modified: 2023-10-07 (土) 15:55:58

画像生成分野での学習における「loss」

概要

  • lossとは、簡単に言うと、学習中に発生する、教師画像と学習中の計算結果の差異のこと。
  • 機械学習を行うということは、weightと呼ばれる変数を解く行為に相当する。
    説明上の都合、すごく簡単に表現した学習モデル
    f(weight)=(教師画像)
    ここでfはモデル(事前学習モデルや既知のU-Net層などの関数)を含めた関数。
    lossが小さいほど、画像全体で総合的に見て、教師画像と学習進捗がほぼ等しくなるということなので、学習用プログラムはloss削減するようにウェイト算出をします。

lossは小さいほど良い?

半分正解だが、どちらかと言えば答えはNo.です。
あくまで1つの指標と捉えるのがベター、という意見がweb上では大半です。

 

正確なソースは探せていないので、感覚的な表現で解説すると下記の通りです。

lossの大きさが重要でない理由(文字主体の説明)

  • 「Yes」である理由
    • 学習を完了させるために、徐々にloss削減に努めていくという面では小さい方が良いです。
    • 例えば、教師画像の品質(タグ含む)がバラバラで、かつ学習プログラムがその変化に追従できない場合、特定のstepで大きなloss(目安として20%超)を発生する場合があります。
      それはある教師画像の特徴を十分キャッチアップできていない状態を表します。多少特異な教師画像であっても、ユーザーにしてみれば特徴を捉えて欲しいですから、lossは小さいに越したことはないはずです。(lossが大きくなるような粗末な教師画像は真似しなくて良い、って意見もあるでしょうが。)
    • 非few shot系の学習方法(HypeNetwork等)で学習したことがある人は、上記の経験があるのではないでしょうか。

  • 「No」である理由
    • lossが0だとしても、画像生成結果と教師画像等しくないからです。
      loss=0は、学習結果画像全体で見た時の平均的な計算結果が、教師画像と同等になったという意味でしかありません。
    • 一例として、LoRA学習において、シンプルな教師画像と適切が学習設定を組み合わせると、わずか数stepでのloss=0.01(1%)程度に抑える事が容易です。これは皆さんが体感していることだと思います。
    • ですが、数step時点での学習結果としては、教師画像の影響をほとんど受けず、ほとんど事前学習モデルによるものです。
      全体的に画風が変化する程度、画像全体でloss=総和0にできたからであって、ピクセル単位で学習結果が一致したわけではないからです。
      一方、step数を増やしすぎると過学習、すわなち特定の層のウェイトが過大or過小になってしまうのも、loss=0だけが大切ではないという証拠です。
    • 解きたい変数weightは行列(正しくはテンソル)なので、たとえloss=0であっても、weightの答えは一義的に決まらないということです。
    • また、学習の際中でのweightが理想状態(教師画像と完全に一致)だとしても、その学習データを画像生成アプリで用いた際に、少しseed値やノイズ値が違っただけで予想外の結果になることもあります。陰部等が顕著ですね。事前学習モデルの特徴で補間されるか、教師画像の断片的な情報を組み合わせて奇形になるか(過学習)。
      私達が追求しているのは、それではないはずです。よって、目標とする学習はloss=0することよりも、さらにその先に答えがあります。

  • 結論:小さい方が良いが、小さいだけでは不十分。