LoginSignup
0
1

More than 3 years have passed since last update.

深層学習/クロスエントロピー

Last updated at Posted at 2020-03-28

1.はじめに

 今回は、クロスエントロピー(交差エントロピー)について勉強したことをまとめます。

2.最尤推定からの導出

 シグモイド関数を $\sigma とし、$y = $\sigma$(W・x + b)とすると、ニューロンが発火(1を出力)する確率は以下の様に表せます。
  P(C = 1|x) = $\sigma$(W・x + b)

逆に発火しない確率は以下の様に表せます。
  P(C = 0|x) = 1 - $\sigma$(W・x + b)

この2つを1つの式で表すと、1つのニューロンの発火確率は以下の様に表せます(但し、t=0 or t=1)。
  P(C = t|x) = $y^t(1 -y)^{1-t}$

ネットワーク全体の尤度Lは、全てのニューロンの発火確率の掛け算になるので、
  $L = \prod_{n=1}^N y_n^{t_n}(1-y_n)^{1-t_n}$ 

 最尤度は、この式を最大化することで求まりますが、最小化する方が最適化しやすいのでマイナスを掛けます。確率の掛け算は、値がどんどん小さくなり扱い難いので、対数(log)を取ります。そして、Nが変化しても比較できる様に、Nで割ると、
  $L = -\frac{1}{N}\sum_{n=1}^N t_nlogy_n+(1-t_n)log(1-y_n)$

 これが、クロスエントロピー(交差エントロピー)の式です。

3.具体的な誤差計算

 今、正解ラベル$t_1$〜$t_3$と予測確率$y_1$〜$y_3$が以下の様だとします。
スクリーンショット 2020-03-28 11.29.28.png
 先程のクロスエントロピーの式に値を代入すると
スクリーンショット 2020-03-28 11.54.05.png

4.コード

 クロスエントロピーを求めるコードをpythonで書くと、

import numpy as np

def calc_cross_entropy(y_true, y_pred):
    loss = np.mean( -1 * (y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)), axis=0)
    return loss

y_true =np.array([[1], [0], [0]])
y_pred = np.array([[0.8], [0.1], [0.1]])

answer = calc_cross_entropy(y_true,  y_pred)
print(answer)

# 出力
# [0.14462153]
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1