はじめに
PyTorchのチュートリアルの「0.PyTorch入門 6.最適化」に、Negative Log Likelihood(以下、NLL)という損失関数が紹介されていました。私はこの損失関数を知らなかったので、調査してみました。その結果、NLLはKullback Leibler距離(以下、KL距離)、およびCross Entropy(以下、CE)と関連がある損失関数とわかりました。本記事では、NLLとKL距離、CEの関係についてまとめようと思います。
Kullback Leibler距離
定義
まず、KL距離を定義します。データがしたがう真の分布の確率関数を
、
を推定するためのモデルの確率関数を
とします。
はモデルに含まれるパラメータです。このとき、KL距離は次の式で定義されます。
このKL距離について次の命題が成り立ちます。
したがって、KL距離は損失関数として使うことができます。また、KL距離を損失関数としたとき、を推定する問題は、KL距離を最小化する問題に帰着できます。なお、KL距離は距離と呼ばれつつも正確には距離の定義を満たしません。
また、データから計算されるKL距離は、が
クラスの多項分布にしたがう場合、次の式で定義されます。
なお、上の式で現れる文字は下記の通りです。
:サンプルサイズ
:one-hot-encodingされている
番目データの正解ラベル
:
を満たす
番目のデータの予測値
:全データの正解ラベル
:全データの予測値
計算例
KL距離の計算例として、の二項分布を考えてみます。真の分布を
、モデルを
とします。このとき、KL距離は次のように計算されます。
また、データから計算されるKL距離は正解ラベルを、予測値を
とすると、
のとき
となります。
Cross Entropy
定義
次に、CEを定義します。まず、KL距離を分解すると
となります。このとき、第2項をCEと定義します。つまり、
です。このとき、次の命題が成り立ちます。
この命題は、
であることから、自明に成り立ちます。
以上より、KL距離の最小化問題は、CEの最小化問題に帰着できます。
また、データから計算されるCEは、が
クラスの多項分布したがう場合、次の式で定義されます。
計算例
CEの計算はKL距離と似ているので、割愛します。
Negative Log Likelihood
定義
NLLはデータに対して定義されます。が
クラスの多項分布にしたがう場合、次の式で定義されます。
なお、です。
この定義より、次の命題が成り立ちます。
これは、CEとNLLの定義から自明です。
Negative Log Likelihood・KL距離・CrossEntropyの関係のまとめ
本記事では、NLL・KL距離・CEに以下の関係があることを説明しました。
- KL距離の最小化問題とCEの最小化問題は同値
のとき、
となる
PyTorchでのNLLの使いどころ
クラス分類をするモデルを考えます。このとき、クラス分類するモデルのよくある構成を図1に示しました。

をソフトマックス関数で要素の和が1になるように変換し、変換した値と正解ラベルのCEを求める、というモデルです。このとき、CEはPyTorchで提供されているメソッドを組み合わせ、
cross_entropy(softmax(z), y)、もしくはnll_loss(log_softmax(z), y)とすることで求められます。これらの関係は下記のようになっています。

cross_entropy(softmax(z), y)の方がメソッド名がcross_entropyである分直感的ですが、計算速度はnll_loss(log_softmax(z), y)の方が早く、数値計算も安定しているようです(参考文献)。
まとめ
本記事では、以下の内容をまとめました。
- KL距離の最小化問題とCEの最小化問題は同値
のとき、
となる
- PyTorchでは、CEを
cross_entropy(softmax(z), y)、もしくはnll_loss(log_softmax(z), y)で計算できるcross_entropy(softmax(z), y)の方が直感的であるが、nll_loss(log_softmax(z), y)の方が計算速度が速く、数値計算も安定している