손실 함수로서, 교차 엔트로피 오차 ( 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 |