データフィッティングとは
非線形モデルをデータに適合させることは通常、最小化問題としてモデル化されます。ここで目的関数は、パラメータに依存するモデルのデータへの適合度の尺度として機能します。一般的なモデルでは、データポイントに対して総和を取ります:
\[ \min_{x \in \mathbb{R}^{n_{var}}} f(x) = \sum_{i=1}^{n_{res}} \chi(r_i(x)) \]
ここで、\(x\)はモデルパラメータを保持するベクトルで、\(n_{var}\)個のパラメータがあります。\(n_{res}\)個のデータポイントがあり、\(r_i(x) = y_i - \phi(t_i, x)\), \(i = 1, ..., n_{res}\) は\(i\)番目の残差で、時刻\(t_i\)における観測値\(y_i\)と予測値\(\phi(t_i, x)\)の差です。
損失関数\(\chi\)は、下から有界であることや\(|r_i(x)|\)とともに増加することなど、望ましい特性を持ちます。すべてのデータポイントにわたって総和を取ると、モデルが全データセットによく適合している場合に目的関数が小さくなります。これが我々の望むところです。
関数\(\chi\)には多くの選択肢があり、重要な考慮事項の一つが頑健性です。頑健な損失関数とは、データ内の外れ値に影響されにくいものを指します。
nAGの一般化非線形データフィッティングソルバー(nAGライブラリのe04gn)を使用すると、\(l_1\)ノルム、\(l_2\)ノルム、アークタンジェントなど、いくつかの損失関数から簡単に選択できます。我々はこのソルバーを使用し、これらのオプションを用いて、様々な頑健性を持つ損失関数によって生成される結果を示しました。
単一外れ値の例
頑健性の側面を調査するため、まず\(\sin(t)\)から生成された21点のおもちゃのデータセットを使用します。ただし、\(t = 1.5\)に\(5 \sin(t)\)から生成された外れ値があります。
これを以下のモデルでフィッティングします:
\[ \phi(t, x) = x_1 \sin(x_2t) \]
まず\(l_2\)損失関数を使用し、次に\(l_1\)損失関数を使用します。各解法の開始点は\(x = (2.1, 1.4)\)です。
L2ノルム損失関数
\(l_2\)ノルムは最も一般的な損失関数の一つです。これにより問題は最小二乗回帰として形成されます:
\[ \min_{x \in \mathbb{R}^2} f(x) = \sum_{i=1}^{21} r_i(x)^2 \]
L1ノルム損失関数
\(l_1\)ノルム損失を使用すると、以下の問題になります:
\[ \min_{x \in \mathbb{R}^2} f(x) = \sum_{i=1}^{21} |r_i(x)| \]
これは外れ値に対してより頑健です。つまり、データの大部分がある解\(x^*\)によってよく適合される場合、\(x^*\)に非常に近い局所最小値が存在し、それは\(x^*\)の解に外れているその他のデータによってあまり影響を受けません。
比較
図1の結果は、\(l_1\)損失関数でフィッティングされたモデルが、外れ値が目的関数と探索方向に大きく寄与する\(l_2\)損失関数でフィッティングされたモデルよりも明らかに優れていることを示しています。
損失関数のトレードオフ
非常に頑健な損失関数を選択することには危険があります。反復的な最適化プロセスにおいて、外れ値に対して頑健な損失関数は通常、現在のモデルに近いデータを好みます。これは、アルゴリズムが目的関数の局所最小値を見つける場合、モデルがデータのある部分集合に対してはよく適合するが、残りのデータに対しては非常に悪く適合する局所最小値に陥る可能性があることを意味します。
これを説明するために、\(5 \sin(t)\)から生成された新しいデータセットに同じモデルをフィッティングします。ただし、両端の3つのデータポイントは\(\sin(t)\)から生成されています。\(l_1\)、\(l_2\)、およびアークタンジェント損失関数を使用します(図2)。
等高線プロット
以下の等高線プロットでは、黒丸はデータ生成に使用されたパラメータを表し、シアン色の丸はソルバーの開始点を表し、シアン色のくさびはソルバーによって見つかった最適化された解を表します。
(a)の\(l_2\)ノルムでは、\(\sin(t)\)によって生成された外れ値が最適解を\(x = (5, 1)\)から引き離しています。\(l_2\)ノルム損失の等高線プロットは、表示された領域内に大域的最良解以外の局所最小値がないため、開始点についてあまり心配する必要がないことを示しています。
アークタンジェント損失のような非常に頑健な損失関数を使用する場合、ソルバーの挙動は大きく異なります。アークタンジェント損失は以下のようになります:
\[ \min_{x \in \mathbb{R}^2} f(x) = \sum_{i=1}^{21} \arctan(r_i(x)^2) \]
アークタンジェントの等高線プロット(b)には8つの局所最小値があり、そのうち7つは大域的最小値よりもかなり悪い解であり、我々はそのうちの1つに収束しています。この場合、初期推定値によって、データの小さな部分だけを非常によく適合するモデルになりました。
\(l_1\)ノルムの等高線プロット(c)では、最適解に対応しない局所最小値がまだいくつかありますが、\(x = (2.1, 1.4)\)の開始点は依然として大域的最小値に収束しています。この大域的最小値は\(x = (5, 1)\)にあり、\(\sin(t)\)から生成されたデータセットの一部が事実上無視されていることを意味します。損失関数のプロットから、\(l_1\)ノルム損失は\(l_2\)ノルム損失よりも頑健ですが、アークタンジェント損失ほどではないことがわかります。
結論
損失関数の選択は、モデルの外れ値に対する感度に影響を与え、探索空間により多くの局所最小値を生み出し、開始点に対する感度を高める可能性があります。e04gnソルバーを使用すると、データフィッティング問題をセットアップする際に異なる損失関数を簡単に試すことができ、正しい最適解を求めるために時間を費やすことができます。
関連ページ:コード例を交えたデータフィッティングにおける損失関数と堅牢性の説明
ソースコード付きのより多くの例は以下をご参照ください:https://www.nag-j.co.jp/naglib/cl/python/jupyter-examples/
なお、この記事のオリジナル版英語ポスターは こちらからご参照いただけます。