8『ニューラルネットワーク二項分類BCE』
分類問題ですが二項分類と多項分類があります。二項を多項のひとつと解釈してもコードできますすが、二項の場合は片方を決めるともう片方が決まるという関係性から、より効率的(らしい)誤差関数があります。BCE(バイナリクロスエントロピー)誤差です。二項とは、ラベル1または0であるとコードします。NNの出力は、0~1の小数点です。これはラベル1をとる確率と考えます。
・とあるサンプルの答え(t)がラベル1、NNの出力がy=1.0であれば、理想的(誤差ゼロ)となるようにします。
Loss = - log(y) = - log 1 = 0、つまりyが1だと誤差0、反対に yが0だと誤差+∞
・別のサンプルの答え(t)がラベル0, NNの出力がy=1.0であれば、完全な間違い(誤差最大)となるようにします。
Loss = -log (1-y) = +∞、つまりyが1だと+∞、反対にyが0だと誤差0
→ 一般化して、Loss = -t × log(y) -(1-t) × log(1-y) と書けます(t=1の時は前部分、t=0の時は後部分だけが残ります)。
これがBCE Lossです。0~1の出力値を確率ととらえて、Lossが0~+∞となるようにうまいこと変換しているのですね。したがって、NNの出力yは最後にsigmoid関数をかませた0~1の小数点となるように設計します。また正解ラベルtも、1か0を整数ではなく、1.0か0.0の小数点(floatといいます)にして、yとtの変数型やshapeがそろうように設計します。そして、BCE(y,t)でLossを出して、Loss.backward()で逆伝播させるわけです。これらはもちろん微分できる関数です(sigmoid関数の微分はすごくシンプルなきれいな形になると書かれています)。このあたりのコードの書き方は、pytorch, tensorflow, kerasなど使うパッケージによって流儀がことなります(これに悩まされる…)。あとはSGD法でパラメータを更新して、次のイテレーション、次のエポックと進むのはいままでと同じです。二項分類は、あり/なし、yes/no、左/右、達成する/しない、などいろんな判定に使用できます。やっていることは回帰問題と同じです。Loss関数が異なる、出力にsigmoidかます、ラベリングは1.0か0.0、位が違う点でしょうか?モデルの出力の解釈はラベル1をとる確率とされ、≧0.5ならラベル1、<0.5ならラベル0と判定といった感じです。