심층 학습/크로스 엔트로피

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$가 다음과 같습니다.

이전의 크로스 엔트로피의 식에 값을 대입하면


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]

좋은 웹페이지 즐겨찾기