Programmers/데브코스 인공지능

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

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

A : 사건

$i(A) = log_b(\frac{1}{P(A)})= -log_b P(A)$

확률이 높은 사건:

정보가 많지 않음

예) 도둑과 개 

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

정보가 많이 필요함

 

정보의 단위

b = 2: bits

b = e: nats

b = 10: hartleys

그냥 단위 많다

 

특성 

 

$i(AB) = log_b(\frac{1}{P(A)P(B)}) =log_b(\frac{1}{P(A)}) + log_b(\frac{1}{P(B)})$ = i(A) + i(B)

 

$P(H) = \frac{1}{8} , P(T) = \frac{7}{8}$

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

왜인지 모르겟다

 

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

$H(X) = \sum _j P(A_j)i(A_j) = - \sum _j P(A_j)log_2 P(A_j)$

 

특성

$0 \leq H(X) \leq log_2 K$

K: 사건의 수

 

 

솔찍히 뭔말인지 모르는중

 

 

 

엔트로피 (entropy) 

활용

평균 비트수를 표현

데이터 압축에 사용 가능

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

일반적으로 2비트

X P(X) i(X) code
A $\frac{1}{2}$ 1 0
B $\frac{1}{4}$ 2 10
C $\frac{1}{8}$ 3 110
D $\frac{1}{8}$ 3 111

i(X)를 활용하는 경우

평균 비트수 

$1 \times \frac{1}{2}+2 \times \frac{1}{4}+3 \times \frac{1}{8}+3 \times \frac{1}{8} = \frac{14}{8} = \frac{7}{4}$비트

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


확률분포 P와 Q

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



2. 교차 엔트로피 
1.H(P,Q)
집합 S상에서 확률분포 P에 대한 확률분포 Q의 교차 엔트로피
확률분포 P에서 $i(A_j)$의 평균
$H(P,Q) = \sum_j P(A_j) i(A_j) = - \sum_j log_2 Q(A_j) = - \sum _{x \in X } P(x)log_2P(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 $\frac{1}{2}$ 1 $\frac{1}{8}$ 3 000
B $\frac{1}{4}$ 2 $\frac{1}{8}$ 3 001
C $\frac{1}{8}$ 3 $\frac{1}{4}$ 2 01
D $\frac{1}{8}$ 3 $\frac{1}{2}$ 1 1

 

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

 

분류문제에서의 손실함수

분류문제

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

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

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

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

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

 

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

제곱합 

$\sum(p_i -q_i)\^2$

제곱을 해서 차이를 본다

하지만 학습속도가 느리다

 

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

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

학습 속도가 빠르다

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

 

 

분류 문제에서의 손실함수

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

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

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

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

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

 

뭔말인가??

 

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