交差エントロピーの計算

ディープラーニングの分類問題における損失関数として一般的に使用されている交差エントロピーに関していろいろな解説記事を読んでいると諸説あり、Chainerで実装されているのはどちらかを確認します。

\(\displaystyle \mathcal{L} = - \dfrac{1}{N}\sum_{n} \sum_{k} t_{nk} \log y_{nk}\)

もしくは

\(\displaystyle \mathcal{L} = - \dfrac{1}{N} \dfrac{1}{K} \sum_{n} \sum_{k} \left\{ t_{nk} \log y_{nk} + (1 - t_{nk}) \log (1 - y_{nk}) \right\}\)

となっている2パターンがありました。この違いは、教師データとして与えられた正解ラベル以外の要素を考慮するかしないかになります。

Chainerで損失関数の計算

In [57]:
import numpy as np
import chainer.functions as F
In [58]:
t = np.array([0], 'i')
In [59]:
y = np.array([[0.7, 0.2, 0.1]], 'f')
In [60]:
loss = F.softmax_cross_entropy(y, t)
loss
Out[60]:
variable(0.76794964)

検証

In [73]:
y_softmax = F.softmax(y)
y_softmax
Out[73]:
variable([[0.46396342, 0.28140804, 0.25462854]])
In [74]:
- np.log(0.46396342)
Out[74]:
0.7679495660705155
In [75]:
- np.log(1 - 0.28140804)
Out[75]:
0.3304615927872412
In [76]:
-np.log(1 - 0.25462854)
Out[76]:
0.2938725808374165
In [77]:
- np.log(0.46396342) - np.log(1 - 0.28140804) -np.log(1 - 0.25462854)
Out[77]:
1.3922837396951733

検証結果

Chainerでのクロスエントロピーは、

\(\displaystyle \mathcal{L} = - \dfrac{1}{N}\sum_{n} \sum_{k} t_{nk} \log y_{nk}\)

で計算されており、正解ラベルのみ損失関数として考慮していました。