この記事ではニューラルネットワークにおける損失関数について説明します。
ニューラルネットワークの全体像に照らし合わせると、損失関数はこのへんの話です。(誤差関数と損失関数は同じ意味です)

データから学習するために
さて、これまで機械学習について色々と学んで来ましたが、ここでもう一度「データから学習する」とはどういうことなのか考えてみましょう。
特徴量さえ分かればいいのか?
そもそも、「データから学習する」というのは、山のようなデータの中から「特徴量」というものを見つけ出すということでした。
しかし、特徴量が分かれば本当にそれでいいのでしょうか。
ある食品の美味しさを予測する
例えば、「ある食品の美味しさ」を予測するモデルを考えたいとします。(「美味しさ」は数値化でき、かつ絶対的な正解があると仮定します。)
このとき、「美味しさ」の特徴量として次のようなものが考えられます。
- 味
- 見た目
- 匂い
- 雰囲気
- etc…
このような特徴量を列挙することは簡単です。しかし、本当に知りたいのは、「どの特徴量がどれくらい美味しさに関係するか」という点です。
言いかえれば、「ある特徴をこれくらい重視したら、これくらい精度が上がる」といったことを知りたいわけです。
逆に言えば、このような基準が無ければ正しい値を予測することは不可能です。
損失関数とは
そこで損失関数の登場です。
ニューラルネットワークにおける損失関数とは、あるモデルのパラメータ(重みやバイアスのセット)の性能がどれほど良いのか決定する関数です。
具体的には、「2乗和誤差」と「交差エントロピー誤差」というものが使われています。
2乗和誤差
2乗和誤差とは、次のような数式で表される関数です。
$$ E= {\frac{1}{2}}\sum_{k=0}(y_k-t_k)^2 $$
yはニューラルネットワークの出力、tは教師データ、kはデータの次元を表します。
この数式は、ネットワークの予測値と正解との誤差を全部足した値です。
つまり、「誤差」の大きさを評価する関数ということです。ですので、この値は小さいほど「良い」とされています。
シグマの意味は?
シグマが出てくると「うわ。。。」と思うかも知れませんが、意味としては簡単です。これは全てのデータの「和」を取っているに過ぎません。シグマを使うのは、それぞれの出力(1個目、2個目、3個目…)と正解の「全てを含めた値」を使わないと「モデル全体」の良さを測ることはできないためです。
なんで2乗するの?
「モデルの良さ」を測りたいため符号が出てくると困るからです。
じゃあ絶対値でもいいのでは?
絶対値を用いて求めることもできますが、絶対値は数学的に扱いが難しいから避けたいです。
そもそもなんで2乗和誤差をつかうの?
実は、2乗和誤差は誤差が正規分布に従っていると考えたときの最尤推定値になっています。
誤差が正規分布に従うというのは、経済や実験などデータサイエンスを扱う分野では一般的な仮定です。
交差エントロピー誤差
交差エントロピー誤差は次の数式で表される関数です。
$$ E=-\sum_{k=0}t_k log y_k$$
logxは対数関数といい、底がe(省略されることが多い)の場合を特に「自然対数」といいます。
つまりこの関数は教師データの値とニューラルネットワークの出力の対数をとったものをかけ合わせ、その総和を取ってマイナスの符号を付けたものです。
なんでマイナスがかかってるの?
モデルの出力に使用されるソフトマックス関数の返り値は、確率として解釈できることを前回学びました。
Logの性質として、真数のk乗を前にかけることができるというものがあります。
$$log {\frac{1}{2}}=log2^{-1}=-1×log2$$
このように、分数を真数に入れると必ずマイナスが前に出ます。
このマイナスをキャンセルするためにマイナスを先頭に掛けています。
なんで交差エントロピー誤差を使うの?
交差エントロピーを使うことで、「正解の分布」と「出力の分布」の「近さ」を計算することができるためです。分類問題のとき、出力は必ず複数個の確率の分布なので、この方法が使えます。
ミニバッチ学習
誤差関数の変形
さて、ここまで各誤差関数について詳しく見てきました。
ディープラーニングは、訓練データをモデルに入力し、損失関数から誤差を求め、この値を最小化するようにパラメータ(重みやバイアス)を調整するという手順で行うものでした。
ですので、例えば訓練データが1000個あれば、1000回損失関数を求め、その全てを足した値を誤差として計上する必要があるということになります。
これまでは1つのデータに関する誤差であったため、これを全データに適用するように式を組み替えると、

このような式になります。
ミニバッチ学習
このように全データの誤差を計算できればいいですが、実際にはデータ数が多すぎてかなりの計算量を要します。
しかし、全データの中から無作為に選んだいくつかのデータで学習を行えば、全データを使って学習した際の良い近似になります。
このように、全体のデータをいくつかのセグメントに分割して学習を行うことをミニバッチ学習といいます。
なぜ損失関数が必要なのか
これまで損失関数が必要になるのが当たりまえのように扱ってきました。しかし、そもそも損失関数はどうして必要なのでしょうか。
「どれくらい正解しているか」という指標
損失関数の代わりに「正解率」という指標を用いることを考えてみます。
ここで、正解率が低かったため、パラメータの一つの値を変えてみたとしましょう。正解率はどう変わるでしょうか。
このようなパラメータの変え方をすると、正解率は離散的な変化をします。ある値を変えたら急激に正解率を上がったり、下がったりすることがあるということです。
このような減少が起きるのは、各パラメータの値の変化と正解率が有機的に結びついていないからです。
例えばソフトマックス関数では出力を確率として表現しましたが、正解率だけをみたのでは、その確率値は捨象されてしまいます。従って、パラメータの変化は不確定で離散的な正解率の変化にしかならないということです。
これは即ち、関数が不連続であり、微分不可能ということです。
損失関数の意義
損失関数は正解ラベルと出力の変化を有機的に結びつけるものです。つまり、パラメータの微細な変化が出力の変化となって現れ、そのまま誤差関数の値の変化に繋がるということです。
こうすることで、パラメータの値を変化と出力の変化の関係の結びつきがはっきりします。
これは関数が連続であり、微分可能ということです。
参考文献
「ニューラルネットワーク・DeepLearningなどの画像素材」
「最小二乗法はなぜ残差2乗和を計算するのか」
「交差エントロピーの例と微分の計算」
https://mathwords.net/kousaentropy