본문 바로가기

머신러닝, 딥러닝

교차 엔트로피 오차 ( Cross Entropy Error, CEE )

손실 함수로서, 교차 엔트로피 오차 ( Cross Entropy Error , CEE ) 도 자주 이용한다.

cee의 식

Y는 신경망의 출력, T는 정답 레이블이다.

또 T는 정답에 해당하는 인덱스의 원소만 1이고 나머지는 0이다( ONE-HOT ENCODING )

그래서 위의 식은 실질적으로 정답일 때의 추정(T가 1일 때의 Y)의 자연로그를 계산하는 식이 된다. ( 정답이 아닌 나머지 모두는 T가 0이므로, log와 연산이 되어도 결과에 영향을 주지 않는다.)

즉, 교차 엔트로피 오차는 정답일 때의 출력이 전체 값을 정하게 된다.

자연로그 y= logx 의 그래프

이 그림에서 보듯이 x가 1일때는 y는 0이 되고, x가 0에 가까워질수록 y의 값은 점점 작아진다. 위의 식도 마찬가지로, 정답에 해당하는 출력이 커질수록 0에 다가가다가, 그 출력이 1일 때 0이 된다. 반대로 정답일 때의 출력이 작아질수록 오차는 커진다.

교차 엔트로피의 오차를 파이썬으로 구현해보자.

import numpy as np

def mean_squared_error(y, t):

return 0.5 * np.sum((y-t)**2)

def cross_entropy_code(y, t):

delta = 1e-7

return -np.sum(t * np.log(y + delta))

t = [ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

# 예시 1 : '2'일 확률이 가장 높다고 추정함 ( 0.6 )

y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]

print(cross_entropy_code(np.array(y), np.array(t)))

# 예시 2 : '7'일 확률이 가장 높다고 추정함 ( 0.6 )

y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]

print(cross_entropy_code(np.array(y), np.array(t)))


0.510825457099338

2.302584092994546

이때 cross_entropy_code에서, 아주 작은 값인 delta를 더했다. 이는 np.log를 입력할 때, 0을 입력하면 -무한대 를 의미하는 -inf가 출력되어 더 이상 계산을 진행할 수 없으므로, 아주 작은 값을 더해서 절대 0이 되지 않도록, 즉 -무한대가 발생하지 않도록 방지한 것이다.

첫번째 예는 정답일 때의 출력이 0.6인 경우로, 이때의 cee는 0.51이다.

두번째 예는 정답일 때의 출력이 0.1인 경우로, 이때의 cee는 무려 2.3이다.

즉 결과( 오차 값 )가 더작은 첫 번째 추정이 정답일 가능성이 높다고 판단한 것으로, 앞서 평균 제곱 오차의 판단과 일치한다.

 

 

'머신러닝, 딥러닝' 카테고리의 다른 글

왜 손실함수를 사용하는가?  (0) 2020.01.20
미니 배치 학습  (0) 2020.01.20
tensorflow CNN (합성곱) 에서의 conv2d  (0) 2020.01.20
손실 함수와 평균 제곱 오차 ( MSE )  (1) 2020.01.19
신경망 학습  (0) 2020.01.19