-
엔트로피, 크로스엔트로피, KL다이버전스프로그래밍/머신러닝 2021. 10. 5. 22:03반응형
https://www.youtube.com/watch?v=mBMc_3sNa9w
위 영상에 엔트로피와 크로스엔트로피, KL다이버전스의 대한 얘기가 나오는데
일단 엔트로피에 대해 내가 이해한 것을 정리하면
어떤 사건이 일어날 확률이 작다면, 그 사건이 일어났다는 것 자체가 희귀하 일이므로, 확률의 역수를 취한 것을 정보로 정의할 수 있고, log2를 취한 것은 확률끼리의 곱을 덧셈으로 만들어 계산을 용이하게 하고, 그 정보를 몇 개의 이진수로 표현했는지를 나타내기 위함이다. 이 정보에 다시 확률을 곱한 것은 한 사건에 대한 정보가 전체 정보에서 얼마나 가중치(지분율)를 같냐를 표현하기 위한 것 같다.엔트로피는 이해하겠는데 궁금한 것은 크로스엔트로피를 정의할 때
왜 시그마 y^ * log(1/y)가 아닌
시그마 y * log(1/y^)으로 정의됐냐는 것이다.y^은 실제 상황이 이럴 것이다라고 가정한 모델이고
y는 측정을 통해서 얻어낸 확률(데이터)이다. -> 참값이라고 가정우리가 알고 있는 것은 실제 진실은 없고 y관측치와 y^모델에서 예측하는 것 2가지뿐이다.
https://www.youtube.com/watch?v=F-wNva7tdFc
위 영상에서 이런 내용이 있는데"실제 분포를 가정 후 예측한 분포에 따른 정보 획득의 유용성을 나타냄"
이해한 바를 풀어써보면
정보가 log(p)로 정의가 되니까 모델을 통한 예측으로 얻는 정보는 log(1/y^)이 된다. 그리고 한 사건에 대한 정보가 전체 사건에서 차지하는 비율은 실제 측정된 확률만큼 차지할 거라고 보는 것이다.KL다이버전스를 계산할 때도
크로스 엔트로피 - 엔트로피를 계산하여 가정한 모델과 측정된 데이터의 차이를 계산하는데 이것도 앞 뒤의 순서가 저렇게 정의된 이유는
처음에는 일반적인 오차의 정의를 따랐기 때문이라고 생각했는데
절대오차 = 이론값(실제값, 참값) - 실험값(예측값, 근삿값)
오차 = (이론값 - 실험값) / 이론값 * 100
측정값이 실제값에서 얼마만큼 다른 지를 나타낸다.이론값(실제값) = 실험값(예측값) + 오차
실험 결과에서 오차를 더함으로써 실제값에 맞춰서 피드백을 주어 예측값을 수정하는 용도로도 활용할 수 있다.(머신러닝에선 이론이 틀려서 실제상황에 맞춰가며 오차를 줄이는 것이 학습이기 때문에)예를 들어 내가 예측하는 온도는 85도 이어야 하는데 실제 측정 결과가 83도가 나왔다. 그럼 내가 생각하는 결과가 틀렸으므로 이를 수정하도록 피드백을 주어야 한다.
그럼 오차는 83 - 85 = -2도 음수가 나올 것이고
85 + (-2) = 83
내가 예측한 결과인 85에서 -2만큼을 더해서 생각하라는 피드백을 주어 측정된 결과에 맞춰 수정할 수가 있게 된다.처음엔 오차의 정의를 따랐을 거라고 생각했는데 이렇게 오차를 활용하기 위해서 KL다이버전스를 크로스엔트로피가 앞에 오도록 한 건 아닐 것 같고(선후가 안 맞음)
크로스 엔트로피가 실제 y의 분포에 가정한 y^의 심볼들을 얼마나 넣을 수 있는가인데
모델을 잘못 가정하면 필요한 비트수가 많아지게 되어 실제 엔트로피보다 크로스 엔트로피가 커지게 된다. 둘의 차이를 계산하는 게 KL다이버전스 이므로 결과를 양수로 만들기 위해 큰 수를 앞에 둔 것이라 생각한다.
https://stats.stackexchange.com/questions/335197/why-kl-divergence-is-non-negative반응형