본문 바로가기

딥러닝,CNN,pytorch

파이썬, 딥러닝 손실함수 교차엔트로피손실(CEE) 개념정리

딥러닝 모델을 구현할 때, 모델을 통해 예상한 값과 실제 값의 LOSS를 정의할때

MSE_LOSS와 CROSS_ENTROYPE_LOSS가 많이 사용된다.

120*120크기의 이미지를 받아 이 이미지가 사과이면 0, 바나나면 1, 메론이면 2 라고 분류하는 모듈을 만들었다고 치자.

그렇다면, y_pred=tensor([[a,b,c]....*배치의 개수])의 형식으로 나올 것이고 a=사과일 확률,b=바나나일 확률, c=메론일 확률 이게 된다.

하지만, y_pred는 엄연한 추정 값이다.

예를들어, a=0.1 b=0.6 c=0.2 라고 하면 우리는 이 그림을 '바나나' 라고 추정을 하게 되는 것이다.

그렇다면 우리는 이 y_pred를 loss=nn.CrossEntroypeLoss(y_pred,y_train) 이런 식으로 손실함수 속에 넣어주게 되면 된다.

하지만, 단순하게 '바나나'라고 추정했던 것이 맞은 판단인지, 틀린 판단인지만 정하고 끝나는것이 절대 아니다.

만약에 실제 정답이 '메론' 이였다고 생각 해 보자.

위의 예시에서는 (0.1,0.6,0.2)이므로 실제 정답일 경우를 0.2로 보았고

만약 (0.1,0.99,0.98)이런 식으로 추정을 했다면, 실제 정답일 경우를 0.98로 보았다.

중요한건, 내가만약 추정을 틀렸다고 하더라도, 실제 정답을 뽑을 확률이 높았었다면 교차엔트로피오차(CEE)는 굉장히 낮은 값을 가지게 된다는 점

이다.

무슨 얘기냐면, CEE는 y_train으로 정의되는 실제 정답값일 확률에 얼마나 근접하게 추론했냐 에 따라서 그 오차값을 결정한다는 것이다.

이를 수식으로 나타내면 다음과 같다.

교차엔트로피Loss공식

위 식에서 tk는 정답인 인덱스면 1이고 나머지는 0이다.

그러므로, 첫번째 케이스 에서는 ln0.2=1.6 가 되는 것이고

두번째 케이스 에서는 ln0.98=0.02이 되는 것이다.

정답일 확률을 무려 0.98로 추론 했으니 정답에 매우 근사하게 모델을 설계 한 것이고

그로인해 오차값이 아주 적은값으로 나타나는 것이다.

이러한 교차 엔트로피 손실은 output이 다중 차원을 가지는(이것은 a?b?c? 이런식으로)

다중 분류에서 사용된다는 특징을 가진다고 보면 될 것 같다.