ディープラーニング

CrossEntropyとBinaryCrossEntropyについて理解する

Cross Entropy Lossとは?

多クラス分類では損失関数としてCross Entropy Lossがよく用いられています。一般的過ぎてどのフレームワークでも引数を指定するだけで計算できるので便利ですが、どういう計算をしているか確認を行いました。

まず、wikipediaから数式を参照すると下記の通りとなります。

pが真値の確率変数でqが予測した確率変数となるので、例えばp=[1, 0, 0]というラベルに対する予測値がq=[0.7, 0.2, 0.1]という場合、Cross Entropy Lossは下記のように計算できます。

上記から、真値が0の場合に予測値が誤って大きな値を予測したとしても損失が変化しないことが特徴としてありそうです。これは例えばq=[0.51, 0.48, 0.01]とq=[0.51, 0.25, 0.24]という場合、同列に扱われるということになります(直感的には後者の方が、より明確に分類できているので優れているように思える)

続いて、Pytorchの実装を確認しています。公式より、参照するとCross Entropy Lossは下記の式で表されています。

exp(x[class])がクラスに対する予測の確率変数となります。xにはlogitを与える必要があるので、p = exp(logit)からlogit = log(p)に変換して計算すると

pytorchの実装でも同じ結果が計算できました。ラベルが2個の場合も下記のように計算できます。

デフォルトではreduction=meanとなっており、各サンプルにおける平均値を損失関数として計算することができます。

Binary Cross Entropy Lossとの違い

それぞれのクラスかどうかを二値分類で考えてBinary Cross Entropy Lossを使用することができます。Binary Cross Entropy Lossはwikipediaによると下記の式で表されます。

先程の例で同様にp=[1, 0, 0]に対してq=[0.7, 0.2, 0.1]という予測が与えられた場合、Binary Cross Entropyは下記の通り計算できます。

こちらは、Cross Entropy Lossの時と違い、真値が0の時にも正しく分類できているのかが損失に計上されています。従って先ほどの例でq=[0.51, 0.48, 0.01]とq=[0.51, 0.25, 0.24]という場合、同じ損失にはなりません。

誤差なので小さいほうが良いと考えると、Binary Cross Entropyでは後者の方が良いと判断できます(差は微妙ですが…)

念のためこちらもpytorchの実装と計算が合うか確認します。pytochの公式によれば、下記の式で表されます。

真値p=[1, 0, 0]に対して予測値q=[0.7, 0.2, 0.1]の損失を計算してみると…

ということで、無事最初の計算と一致しました。

まとめ

Cross EntropyとBinary Cross Entropyの二つに関して計算を確認しました。

真値が正の時からしか損失が形状されないCross Entropyより、正・負例両方から学習ができるBinary Cross Entropyの方が学習効率が良さそうに感じるのですが、Cross Entropyの方が良いのはどのような場合なのか?というのがよくわかりませんでした…。

認知処理データを扱うコンペでは基本的にBinary Cross Entropyが用いられている気がします。ここら辺も、データに依存するのかもしれないですし、今後試行錯誤していきながら確認したいと思います。