확률분포 P와 Q
S=Aj
P(Aj) : 확률분포 P에서 사건 Aj가 발생할 확률
Q(Aj) : 확률분포 Q에서 사건 Aj가 발생할 확률
i(Aj) : 확률분포 Q에서 사건 Aj의 자기정보
-i(Aj)=−log2Q(Aj)
-자기정보는 Aj를 표현하는 비트수
-잘못된 확률분포 Q를 사용하게 되면, 실제 최적의 비트수를 사용하지 못하게 됨
H(P,Q)
집합 S상에서 확률분포 P에 대한 확률분포 Q의 교차 엔트로피
확률분포 P에서 i(Aj)의 평균
H(P,Q)=∑jP(Aj)i(Aj)=−∑jP(Aj)log2Q(Aj)=−∑x∈XP(x)log2Q(x)
이 값은 정확한 확률분포 P를 사용했을 때의 비트수보다 크게 됨
H(P,Q)=−∑x∈XP(x)log2Q(x)≥−∑jP(x)log2P(x)=H(P)
따라서 이 값은 P와 Q가 얼마나 비슷한지를 표현
같으면 H(P,Q)=H(P)
다르면 H(P,Q)>H(P)
H(P,Q):
Q(X)를 가정하고 코드 부여
X |
P(X) |
i(X) |
Q(X) |
i(X) |
code |
A |
1/2 |
1 |
1/8 |
3 |
000 |
B |
1/4 |
2 |
1/8 |
3 |
001 |
C |
1/8 |
3 |
1/4 |
2 |
01 |
D |
1/8 |
3 |
1/2 |
1 |
1 |
평균비트수
3×21+3×41+2×81+1×81=821비트
1.5배나 더 많은 비트 사용 필요
분류 문제에서의 손실함수
분류문제
-주어진 대상이 A인지 아닌지를 판단
-주어진 대상이 A,B,C,… 중 어느 것인지를 판단
기계학습에서는 주어진 대상이 각 그룹에 속할 확률을 제공
원하는 답 P=[p1,p2,…,pn],p1+p2+⋯+pn=1
제시된 답 Q=[q1,q2,…,qn],q1+q2+⋯+qn=1
P와 Q가 얼마나 다른지에 대한 척도 필요
제곱합
∑(pi−qi)2
확률이 다를수록 큰 값을 가짐
하지만 학습속도 느림
교차 엔트로피 H(P,Q):
확률이 다를수록 큰 값을 가짐
학습 속도 빠름
분류 문제에서 주로 교차 엔트로피 사용
S=A,B
실제 상황
P=[1,0]
→P(A)=1,P(B)=0
예측 Q(X)
[0.8,0.2]:Q(A)=0.8,Q(B)=0.2
H(P,Q)=−∑x∈XP(x)log2Q(x)=−1×log20.8=0.3219
[0.5,0.5]:Q(A)=0.5,Q(B)=0.5
H(P,Q)=−∑x∈XP(x)log2Q(x)=−1×log20.5=1
[0.2,0.8]:Q(A)=0.2,Q(B)=0.8
H(P,Q)=−∑x∈XP(x)log2Q(x)=−1×log20.2=2.32
import numpy as np
def crossentropy(P, Q):
return sum([-P[i]*np.log2(Q[i]) for i in range(len(P))])
P = [1, 0, 0, 0]
Q = [0.7, 0.1, 0.1, 0.1]
print(crossentropy(P,Q))