[ 機械学習 ] 損失関数の実装 (二乗和誤差, 交差エントロピー誤差)

[ 機械学習 ] 損失関数の実装 (二乗和誤差, 交差エントロピー誤差)

本記事では、損失関数についてまとめていきたいと思います。

損失関数とは

損失関数とは何か

損失関数とは、2つの数値にどれだけの誤差(損失)があるかを計測する関数です。

例えば機械学習モデルを作成するにあたり、訓練用のデータ(x)とそれに対応する正解データ(t)があったとします。
ニューラルネットワークを作成し、そこにデータ x を渡すと、y が出力されますね。
そこで出力された y と、正解データである t にどれだけの誤差(損失)があるかを計測するのが、損失関数です。

なんのために損失関数を用いるのか

前の記事で、「学習」(自動で重みとバイアスを獲得すること)の重要性をまとめました。
その学習を行うために、損失関数は用いられます。

そもそもの機械学習の目的とは、最適な機械学習モデルを作成するということです。
では、最適な機械学習モデルとはどのようなものなのでしょうか。

モデルは一般的に、訓練用データを用いて作成されます。
このデータを x とした時、モデルに x を渡したときの出力を y とします。
優れたモデルとは、この時の出力 y が正解データ t と高い確率で一致するような計算を行うことができるモデルということができます。

しかし、初めから y と t が適合するモデルは作ることができません。したがって、当面の間は y と t が近付くように(パラメータを調整することによって)モデルを調整しなければいけません。

では、 y と t がどれだけ異なっているかということをどのようにして計測すれば良いでしょうか。

そこで登場するのが、損失関数です。
損失関数は2つの引数をとり、その2値がどれだけ差分を孕んでいるか、ということを計算してくれます。

ですので、モデルを調整するたびに、新モデルの出力 y と 正解 t を損失関数に計算させて、その損失が 0 に近づけば近付くほど、モデルが優れたモデルになりつつある、と判断することができます。

 

以上の理由、モデルの出力を最適化する(学習させる)、という目的の下、損失関数が用いられます。

 

二乗和誤差

損失関数・二乗和誤差とは

では具体的な損失関数について説明を行なっていきます。

紹介する一つ目の損失関数は「二乗和誤差」と呼ばれるものです。
名称から処理を推測すること人もいるかもしれません。この損失関数は、モデルの出力 y と正解データ t をそれぞれ二乗し、その差分を誤差(損失)として返却するような関数になります。

数式

二乗和誤差は、次のような数式で表されます。

$$E= \frac{1}{2}\sum_{k}{(y_k-t_k)^2}$$

簡単な数式らしいのですが、筆者は数学にとても弱いので、部分的に意味を確認していきますね。

  1. E
    出力される損失値です。
  2. Σ
    総和、を意味する記号です。カッコ内の計算結果を全て足し上げます。対象データが k 個存在することを示しています。
  3. y
    モデルから出力された値です。k 個のデータそれぞれを対象とすることを示しています。
  4. t
    モデルから出力された値に対応する正解データの値です。k 個のデータそれぞれを対象とすることを示しています。

二乗和、という言葉から連想されるように、モデルの出力値 y と正解データ t のそれぞれの値を突合させ、その二乗をとる、という内部処理を持った構成です。

イメージ

図にすると、下記のようなイメージになります。

上の図は、モデルが最適されておらず、モデルからの出力が正解データと異なっている場合です。
モデル出力と正解との乖離がそのまま損失値に結びついてくるので、この場合における損失は 0.43 と大きくなっています。

この場合、この損失が小さくなるようにパラメータを更新する必要があります。

上の図は、モデルが最適化されており、モデルからの出力と正解が一致している場合です。
モデル出力と正解との乖離が小さいので、損失値は 0.03 ととても小さくなっています。

学習で目指すのは、このように損失が小さくなるようなパラメータを発見し、モデルに設定することとなります。

実装

では二乗和誤差の実装を行います。

 

交差エントロピー誤差

損失関数・交差エントロピー誤差とは

機械学習における損失関数として、二乗和誤差と同様によく用いられるのが交差エントロピー誤差という関数です。
考え方は二乗和誤差と大きな違いはなく、モデルの出力と正解データとの乖離を測る関数です。

二乗和誤差は モデル出力値 から 正解データ値 を減算した値を二乗したものの総和を計算しましたが、交差エントロピー誤差では、 自然対数eを底とするモデル出力値のlog値と正解データ値を乗算したものの総和を、損失とします。

数式

$$E= -\sum_{k}{t_k}{\log y_k}$$

イメージ

自然対数 y=logx のイメージ

なぜ、モデル出力 y のlog値と正解データ t を乗算することが損失を求めることになるのでしょう。

それは、このネイピア数 e が底になっている自然対数 log に秘密があります。
自然対数logx は、次のようなグラフで表されます。

自然対数logは、logに渡される x の値が 0 に近い時には絶対数の大きな出力を返し、 x の値が 1 に近いほど、絶対数が 0 に近い出力を返します。

すなわち、正解データ t が 1 の時、それに対応するモデル出力 y が 1 に近い数値を出力できていれば、 t と x の乗算結果は小さくなり、 x が 0 に近い誤った数値を出力していれば、 t と x の乗算結果は大きくなる、という論理です。

 

交差エントロピー誤差のイメージ

交差エントロピー誤差では、実質、t = 1 の場合にしか計算は行われません(t = 0 の時には、乗算結果は常に 0 に収束するから)。今回 t = 1 なのは2番目のデータなので、2番目で計算が行われます。
モデル出力 y の2番目は 0.3 (正解を判断できていない)で、その log をとると -0.49 となり、この正負をひっくり返した 0.49 という値が損失として出力されます。

対して、こちらは正解を判定できている場合です。上と同じように、モデル出力 y の2番目の値を見てみると 0.8 となっており(正解を判定できている)、その log値は -0.09 です。先ほどと同じように損失を求めると、こちらの損失は 0.09 と出力されました。

このように、二乗和誤差の時と同様に、正解を正しく判定できている場合に、損失が小さくなる、ことを確認できます。

実装

では最後に、交差エントロピー誤差の実装を行います。

 

次の問題

さて、このように損失関数を用いることで、現在のモデルが最適化されているかどうかを判定することができました。

損失が小さいほど優れたモデル(パラメータ)であると判断することができるので、モデルを構築するときは、この損失がなるべく小さくするようにパラメータを設定すれば良いのでした。

では、損失が大きかったとき、どのようにパラメータを変更すれば良いのでしょうか?

 

その問題を解決するためには、「入力 x に関する損失関数の微分」 を求め、「微分値に従い、損失が小さくなる方向へパラメータを更新する」という手順を踏む必要があります。

ということで次回は、損失関数の微分や、パラメータの更新という点についてまとめていきたいと思います。

 

まとめ

  1. 機械学習モデルのパラメータを最適化するために、学習を行う。
  2. 学習を行うために、損失関数を用いる。
  3. 損失関数は、特定のパラメータが設定されたモデルの出力と正解データを比較し、その損失を数値として算出することができる。
  4. 損失が少ないほど、優れたパラメータを設定できたモデルである、と判定することができる。

 

 

以上。

MachineLearningカテゴリの最新記事