お勉強ドットねっと

最適化と損失関数

scikit-learnでmodel.fit(...)が呼ばれたときに、モデルの内部では何が起きているのでしょうか?

この記事では、そんな疑問に答えます。

    目次
  1. モデルは何を目指して学習しているのか
  2. モデルによって最適化の方法が違う
  3. 損失関数で学習の度合いを測る
  4. 最後に

モデルは何を目指して学習しているのか

訓練中のモデルはどうやって学習しているのでしょうか?

具体的なイメージがわくように、LinearRegression(線形回帰)のモデルを取り上げます。

話が簡単になるように2次元のケースを扱いましょう。

こんなデータがあるとします。

yxの関係が直線で近似できそうですね。

scikit-learnLinearRegressionのモデルを使えば良さそうです。

トレーニングセットのデータ(x, y)でモデルを訓練します。

model.fit(x, y)を呼び出すと、モデルは傾きと切片を調節します。

イメージとしてはこんな感じです。

線形回帰モデルは「直線でより多くのサンプル点を説明できるように」を目指しています。

より一般的な言い方をすると、「モデルはより多くのサンプルを説明できる」ことを目指しています。

そのために、モデル内部のパラメータを調節します。

モデルによって最適化の方法が違う

パラメータを調節して、トレーニングセットのデータをうまく説明できるようになると、モデルがデータに適合している状態になります。

この過程を「モデルがデータから学習する」と表現するのですが、モデル内部のパラメータの調節を行っているだけです。

この調節のプロセスを「最適化」と呼びます。

「学習」とか「訓練」といったコトバは、人間的なニュアンスがありますが、機械学習では「学習」も「訓練」も「最適化」という数学の用語で定義されます。

また、モデルによって最適化の方法が異なります。

線形回帰における「最適化」は「直線でより多くのサンプル点を説明する」ことでした。

決定木やSVMなどを使うと「最適化」の方法や使われるパラメータが変わってきます。

モデル独自の論理でデータを説明するためです。

この「最適化」がどの程度うまくいっているのかは、図を見て判断するだけだとちょっと曖昧です。

「最適化」の度合いを明確に定めるには数式を使う必要があります。

損失関数で学習の度合いを測る

線形回帰による学習がどの程度うまくいっているのかを測る一つの指標として「平均2乗誤差」と呼ばれる値を計算します。

誤差とは、実際の値yと予測の値pの差のことです。

誤差を2乗して平均を計算すると「平均2乗誤差」になります。

英語では「Mean Squared Error」で、よく「MSE」と略されます。

数式は、こうなります。

$\text{MSE}(y_i, p_i) = \frac{1}{N} \sum_{i=1}^{N} (y_i – p_i)^2$

MSEが小さいほど直線がより多くの点に適合(フィット)しており、最適化がうまくいっていると判断できます。

このような数式を損失関数(Loss Function)と呼び、モデルの学習がどのくらい上手くいっているのかをチェックするのに使います。

合わせて、図を描いて目でも確認しておくとより安心です。

言うまでもないですが、モデルによって損失関数も異なります。

最後に

以上まとめると、

  • 機械学習とは最適化のこと
  • 選んだモデルによって最適化の方法が異なる
  • 学習の度合いは損失関数で判断する
  • 図を使うとより安心

お疲れ様でした。

次はディープラーニングを取り上げます。

人工知能と機械学習とディープラーニングの違いとは?

初心者向けのディープラーニングのライブラリはどれ?