Programmers/데브코스 인공지능

[프로그래머스 스쿨 AI] Weak 3 엔트로피

1. 자기정보 (self- information): i(A)

A : 사건

i(A)=logb(1P(A))=logbP(A)

확률이 높은 사건:

정보가 많지 않음

예) 도둑과 개 

개가 안짓을 확률>>>??

정보가 많이 필요함

 

정보의 단위

b = 2: bits

b = e: nats

b = 10: hartleys

그냥 단위 많다

 

특성 

 

i(AB)=logb(1P(A)P(B))=logb(1P(A))+logb(1P(B)) = i(A) + i(B)

 

P(H)=18,P(T)=78

i(H)=3비트, i(T)=0.193 비트

왜인지 모르겟다

 

엔트로피는 자기 정보의 평균

H(X)=jP(Aj)i(Aj)=jP(Aj)log2P(Aj)

 

특성

0H(X)log2K

K: 사건의 수

 

 

솔찍히 뭔말인지 모르는중

 

 

 

엔트로피 (entropy) 

활용

평균 비트수를 표현

데이터 압축에 사용 가능

4가지 벙보를 표현 하는데 필요한 비트수

일반적으로 2비트

X P(X) i(X) code
A 12 1 0
B 14 2 10
C 18 3 110
D 18 3 111

i(X)를 활용하는 경우

평균 비트수 

1×12+2×14+3×18+3×18=148=74비트

데이터를 표현하기위한 필요한 평균개수?


확률분포 P와 Q

S=Aj
P(Aj) : 확률분포 P에서 사건 Aj 가 발생할 확률
Q(Aj) : 확률분포 Q에서 사건 Aj가 발생할 확률
i(Aj) : 확률분포 Q에서 사건 Aj의 자기정보
i(Aj)=log2Q(Aj) 
자기 정보는 Aj를 표현하는 비트수
잘못된 확률분포 Q를 사용하게 되면, 실제 최적의 비트수를 사용하지 못하게 됨



2. 교차 엔트로피 
1.H(P,Q)
집합 S상에서 확률분포 P에 대한 확률분포 Q의 교차 엔트로피
확률분포 P에서 i(Aj)의 평균
H(P,Q)=jP(Aj)i(Aj)=jlog2Q(Aj)=xXP(x)log2P(x)=H(P)
따라서 이값은 P 와  Q가 얼마나 비슷한지를 표현
같으면 H(P,Q) = H(P)
다르면 H(P,Q) > H(P)

 

 

X P(X) i(X) P(X) i(X) code
A 12 1 18 3 000
B 14 2 18 3 001
C 18 3 14 2 01
D 18 3 12 1 1

 

위와같이 다른 값들을 봤을때 같을까 다를까 하는 문제를 알아맞추는 것같다

 

분류문제에서의 손실함수

분류문제

주어진 대상이 A인지 아닌지를 판단

주어진 대상이 A,B,C ...중 어느 것인지를 판단

기계학습에서는 주어진 대상니 각 그룹에 속할 확률을 제공

[0.8 ,0.2] : A일 확률 0.8 아닐 확률 0.2

이값이 정답인[1.0, 0.0] 과 얼마나 다른지 측정 필요

 

각 각에 확률들을 비교할 방법은 제곱을 해서 하는방법인

제곱합 

(piqi)\^2

제곱을 해서 차이를 본다

하지만 학습속도가 느리다

 

교차 엔트로피 H(P,Q):

확률이 다를수록 큰 값을 가짐

학습 속도가 빠르다

분류 문제에서 주로 교차 엔트로피를 사용한다

 

 

분류 문제에서의 손실함수

참고 : 분류 문제에서의 원하는 답

P = [p_1,p_2, ... ,p_n]

pi중 하나만 1이고, 나머지는 다 0임

엔트로피는 0 즉  H(P) = 0

pk = 1.0 이라고하면 , qk의 값이 최대한 커지는 방향으로 학습을 실행

 

뭔말인가??

 

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) = - \sum{x \in X} P(x)log_2 Q(x) = -1 \times log_2 0.8 = 0.3219

[0.5, 0.5] : Q(A) = 0.5, Q(B) = 0.5

H(P,Q) = - \sum{x \in X} P(x)log_2 Q(x) = -1 \times log_2 0.5 = 1

[0.2, 0.8] : Q(A) = 0.2, Q(B) = 0.8

H(P,Q) = - \sum{x \in X} P(x)log_2 Q(x) = -1 \times log_2 0.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]
Q = [0.8,0.2]
print(crossentropy(P,Q))
Q = [0.5,0.5]
print(crossentropy(P,Q))
Q = [0.2,0.8]
print(crossentropy(P,Q))

colab.research.google.com/drive/134cSgQ7VIQxE5CLVG0dmkOo2qPMwHlUE?usp=sharing

 

[Programmer][Weak3] 교차엔트로피.ipynb

Colaboratory notebook

colab.research.google.com