200강까지 자료가 무엇을 말하는지를 물었습니다. S9는 다른 것을 묻습니다.
이 물음에 답하려면 정보의 양을 재는 자가 있어야 합니다. 그 자를 만드는 것이 이 강의이고, 그 위에 202강의 상호정보량과 203강의 KL 발산과 204강의 손실함수가 차례로 올라갑니다.
출발점은 놀람입니다. 드문 일이 일어나면 많이 놀라고 흔한 일이면 덜 놀랍니다.
엔트로피는 그 놀람의 평균이며, 압축의 하한이자 불확실성의 크기입니다.
문제. 정보량을 정의합니다.
(1) 확률과 놀람의 관계를 재세요.
(2) 왜 로그여야 하는지 보이세요.
(3) 엔트로피를 계산하세요.
생각의 실마리. "정보를 얻었다"는 것은 몰랐던 것을 알게 됐다는 뜻입니다. 이미 확실했던 일에는 새 정보가 없습니다.
풀이. (1) 확률과 놀람을 나란히 봅니다.
| 일어날 확률 | 놀람의 크기 | 확률의 역수 | 몇 비트인가 |
|---|---|---|---|
확률 인 일에는 비트입니다. 이미 알고 있으니 새 정보가 없습니다.
확률이 절반이 될 때마다 비트씩 늘어납니다.
(2) 왜 로그인지 봅니다. 독립인 두 사건의 놀람이 더해져야 합니다.
| 두 사건 | 확률의 곱 | 놀람의 합 | 곱의 놀람 |
|---|---|---|---|
| 과 | |||
| 과 | |||
| 과 |
곱이 합이 됩니다. 이 성질을 요구하면 로그밖에 남지 않습니다.
(3) 엔트로피는 놀람의 평균입니다.
| 분포 | 엔트로피 비트 | 최대 | 몇 퍼센트 |
|---|---|---|---|
| 한쪽으로 몰림 와 | |||
| 치우침 와 | |||
| 공평한 동전 | |||
| 네 면 주사위 | |||
| 한 면만 나옴 | 정의 안 됨 |
고를 것이 하나뿐이면 이고 모두 같은 확률일 때 가장 큽니다.
가지가 모두 같으면 비트입니다.
엔트로피가 실제로 몇 개의 질문인지 봅니다.
| 값 | 확률 | 부호 길이 | 이상적 길이 |
|---|---|---|---|
평균 부호 길이 이고 엔트로피 입니다. 확률이 의 거듭제곱이면 둘이 정확히 같습니다.
엔트로피는 압축의 하한입니다. 그보다 짧게는 못 줄입니다.
이 문제에서 배우는 것. 정보량의 정의가 발견이 아니라 요구조건에서 나옵니다. "확률이 낮을수록 커야 하고, 확률 이면 이어야 하고, 독립이면 더해져야 한다"는 세 조건을 적으면 로그 말고는 남는 함수가 없습니다. 그래서 엔트로피는 누가 정한 지표가 아니라 유일하게 가능한 지표이며, 이 유일성이 203강에서 KL 발산이 "거리처럼 쓰이는 유일한 양"이 되는 근거로 이어집니다.
바로 확인 1.
확인 1-1. 정보량을 식으로 쓰고 왜 로그인지 쓰세요.
답. 이며 독립인 사건의 정보량이 더해져야 하기 때문입니다.
확인 1-2. 검산에서 확률 의 정보량을 쓰세요.
답. 비트입니다.
확인 1-3. 검산에서 다섯 분포의 엔트로피를 쓰세요.
답. , , , , 입니다.
문제. 부호를 만들어 확인합니다.
(1) 허프만 부호의 길이를 재세요.
(2) 여러 개를 묶어 보세요.
(3) 실제로 부호화해 보세요.
생각의 실마리. "엔트로피가 하한"이라는 말은 그보다 짧은 부호가 없다는 뜻입니다. 실제로 만들어 확인합니다.
풀이. (1) 확률이 의 거듭제곱이 아닌 분포로 해 봅니다.
| 분포 | 엔트로피 | 허프만 평균 길이 | 초과분 |
|---|---|---|---|
| 공평한 세 면 | |||
| 치우친 세 면 | |||
| 치우친 네 면 | |||
| 아주 치우침 |
허프만은 언제나 엔트로피 이상이고 비트를 넘지 않습니다.
마지막 줄이 가장 심합니다. 확률 인 값에도 최소 비트를 써야 하기 때문입니다.
(2) 여러 개를 묶어 봅니다. 확률 와 인 자료를 개씩 묶습니다.
| 몇 개씩 묶나 | 기호당 엔트로피 | 기호당 평균 길이 | 초과분 |
|---|---|---|---|
묶을수록 초과분이 줄어듭니다. 보다 작아집니다.
한 기호에 붙는 비트 손해가 개에 나눠지기 때문입니다. 이것이 압축이 엔트로피에 다가가는 방식입니다.
(3) 실제로 부호화합니다.
| 어떻게 부호화 | 기호당 비트 | 이론 하한 |
|---|---|---|
| 그냥 과 | ||
| 한 개씩 허프만 | ||
| 네 개씩 묶어 허프만 |
한 개씩은 비트에서 못 내려갑니다. 두 값에 각각 하나씩 이진 부호를 줘야 하기 때문입니다.
네 개씩 묶으면 로 하한 에 가까워집니다.
이 문제에서 배우는 것. 엔트로피는 "달성 가능한" 하한입니다. 어떤 부호도 그보다 짧을 수 없고, 충분히 많이 묶으면 얼마든지 가까워집니다. 이 두 방향이 함께 성립하는 것이 정보이론의 첫 정리이며, 그래서 엔트로피를 압축률의 단위로 쓸 수 있습니다. 실무에서 "이 자료는 몇 배까지 압축되나"라는 물음의 답이 곧 원래 표현의 비트 수를 엔트로피로 나눈 값입니다.
바로 확인 2.
확인 2-1. 허프만 부호의 초과분 상한을 쓰세요.
답. 비트를 넘지 않습니다.
확인 2-2. 검산에서 아주 치우친 분포의 엔트로피와 허프만 길이를 쓰세요.
답. 와 입니다.
확인 2-3. 검산에서 네 개씩 묶어 부호화했을 때의 기호당 비트를 쓰세요.
답. 이며 하한은 입니다.
문제. 단위와 연속을 다룹니다.
(1) 로그의 밑을 바꿔 보세요.
(2) 미분 엔트로피의 성질을 보세요.
(3) 왜 그런지 이산으로 확인하세요.
생각의 실마리. 로그의 밑은 자를 몇 등분했는가일 뿐입니다. 그런데 연속으로 넘어가면 성질 자체가 달라집니다.
풀이. (1) 밑을 바꿔 봅니다.
| 밑 | 단위 이름 | 공평한 동전 | 여섯 면 주사위 |
|---|---|---|---|
| 비트 | |||
| 내트 | |||
| 디짓 |
단위만 다르고 정보의 양은 같습니다. 상수배로 서로 바뀝니다.
기계학습에서는 미분이 깔끔한 내트를 씁니다. 의 도함수가 이기 때문입니다.
(2) 연속으로 넘어갑니다.
| 구간 폭 | 미분 엔트로피 내트 | 판정 |
|---|---|---|
| 양수 | ||
| 양수 | ||
| 양수 | ||
| 음수 | ||
| 음수 |
폭이 보다 좁으면 음수가 됩니다. 이산 엔트로피와 다릅니다.
미분 엔트로피는 놀람의 절대량이 아니라 눈금에 딸린 값입니다. 단위를 미터에서 센티미터로 바꾸면 만큼 늘어납니다.
(3) 왜 그런지 이산으로 확인합니다. 표준정규를 폭 로 잘라 봅니다.
| 칸의 폭 | 이산 엔트로피 | 빼기 | 미분 엔트로피 |
|---|---|---|---|
칸을 좁힐수록 이산 엔트로피가 끝없이 커집니다. 이 가 됩니다.
거기서 를 빼면 미분 엔트로피 로 수렴합니다.
연속 확률변수를 정확히 적으려면 무한 비트가 듭니다. 그것이 이유입니다.
이 문제에서 배우는 것. 미분 엔트로피를 이산 엔트로피처럼 읽으면 틀립니다. 음수가 될 수 있고 단위를 바꾸면 값이 변하므로 "정보량"으로 쓸 수 없습니다. 그런데 두 미분 엔트로피의 차이는 눈금 항이 상쇄되어 뜻이 있으며, 그래서 203강의 KL 발산과 202강의 상호정보량은 연속에서도 그대로 성립합니다. 절대량은 못 쓰고 차이만 쓴다는 것이 요점입니다.
바로 확인 3.
확인 3-1. 세 단위 이름과 밑을 쓰세요.
답. 밑 는 비트, 밑 는 내트, 밑 은 디짓입니다.
확인 3-2. 미분 엔트로피가 이산과 다른 점 둘을 쓰세요.
답. 음수가 될 수 있고 눈금을 바꾸면 값이 달라집니다.
확인 3-3. 검산에서 칸 폭 일 때의 이산 엔트로피와 보정한 값을 쓰세요.
답. 과 이며 이론값은 입니다.
문제. 제약 아래 엔트로피를 최대로 합니다.
(1) 제약과 분포의 대응을 정리하세요.
(2) 정규가 정말 최대인지 확인하세요.
(3) 제약이 얼마나 강한지 재세요.
생각의 실마리. 아는 것이 적을수록 가장 넓게 잡는 것이 정직합니다. 그것이 엔트로피를 최대로 하는 분포입니다.
풀이. (1) 대응을 정리합니다.
| 무엇을 안다고 하나 | 답이 되는 분포 | 어디서 봤나 |
|---|---|---|
| 범위만 안다 | 균등분포 | 강 |
| 평균만 안다 | 지수분포 | 강 |
| 평균과 분산을 안다 | 정규분포 | 강 |
| 성공 확률만 안다 | 베르누이 | 강 |
강 문제 의 라그랑주 승수로 유도됩니다. 제약마다 승수가 하나씩 붙고, 그 승수가 지수 안으로 들어갑니다.
셋째 줄이 왜 정규분포가 어디에나 나오는지의 한 이유입니다.
(2) 정규가 정말 최대인지 확인합니다. 평균 이고 분산 인 여러 분포를 봅니다.
| 분포 | 표본 분산 | 미분 엔트로피 | 정규와의 차 |
|---|---|---|---|
| 정규 | |||
| 균등 | |||
| 라플라스 | |||
| 두 봉우리 혼합 |
정규의 이론값은 이고 입니다.
같은 분산인데 정규가 가장 큽니다. 나머지는 전부 음수 차이입니다.
마지막 줄은 봉우리가 둘이라 같은 분산에도 더 예측하기 쉽습니다.
(3) 제약이 얼마나 강한지 잽니다.
| 무엇을 아는가 | 남은 불확실성 내트 | 줄어든 양 |
|---|---|---|
| 범위만 앎 (폭 ) | ||
| 범위만 앎 (폭 ) | ||
| 평균 분산 을 앎 |
첫 줄의 폭 는 임의로 잡은 기준선입니다. 절대량이 아니라 차이를 봅니다.
범위를 네 배 좁히면 만큼인 가 줄어듭니다.
평균과 분산 두 숫자를 아는 것이 그보다 조금 더 줄여 줍니다.
그런데 그 둘로 분포를 다 안 것은 아닙니다. 가장 넓게 잡은 것입니다.
이 문제에서 배우는 것. "정규분포를 가정한다"는 말이 실은 "평균과 분산 말고는 아무것도 가정하지 않는다"는 뜻입니다. 흔히 정규 가정을 강한 제약으로 여기는데, 최대 엔트로피의 눈으로 보면 주어진 평균과 분산 아래에서 가장 약한 가정입니다. 그래서 정규를 쓰는 것이 보수적인 선택일 때가 많고, 반대로 다른 분포를 쓰는 것은 추가 정보가 있다는 주장입니다. 강의 중심극한정리와는 다른 경로로 같은 자리에 도착합니다.
바로 확인 4.
확인 4-1. 평균과 분산만 알 때 엔트로피를 최대로 하는 분포를 쓰세요.
답. 정규분포입니다.
확인 4-2. 검산에서 네 분포의 미분 엔트로피를 쓰세요.
답. , , , 입니다.
확인 4-3. 검산에서 정규의 미분 엔트로피 이론값을 쓰세요.
답. 이고 입니다.
문제. 표본으로 추정합니다.
(1) 표본 크기를 바꿔 가며 재세요.
(2) 치우침을 이론과 견주세요.
(3) 가짓수가 클 때를 보세요.
생각의 실마리. 참 분포를 알 때와 표본으로 추정할 때가 다릅니다.
풀이. (1)과 (2) 여섯 가지 값이고 참 엔트로피는 비트입니다.
| 표본 크기 | 추정 엔트로피 평균 | 참값 | 치우침 | 이론 치우침 |
|---|---|---|---|---|
표본이 작으면 엔트로피를 작게 봅니다. 안 나온 값이 이 되기 때문입니다.
마지막 두 열이 붙습니다. 가짓수 가 많을수록 더 심해집니다.
(3) 가짓수가 표본보다 많을 때를 봅니다. 표본은 개로 고정합니다.
| 가짓수 | 참 엔트로피 | 표본 개 추정 | 치우침 |
|---|---|---|---|
가짓수 에 표본 이면 치우침이 비트를 넘습니다.
단어나 사용자 아이디처럼 가짓수가 큰 변수에서 이것이 늘 문제입니다.
정리하면 이 단원의 흐름은 다음과 같습니다.
| 무엇 | 어디서 쓰이는가 |
|---|---|
| 엔트로피 | 압축의 하한과 불확실성 |
| 조건부 엔트로피 | 강 남은 불확실성 |
| 상호정보량 | 강 변수 사이의 의존 |
| KL 발산 | 강 두 분포의 거리 |
| 교차엔트로피 | 강 분류 손실함수 |
이 문제에서 배우는 것. 엔트로피 추정의 치우침이 언제나 한 방향입니다. 안 나온 값의 확률을 으로 두므로 불확실성을 과소평가하며, 그 크기가 가짓수에 비례하고 표본 크기에 반비례합니다. 그래서 가짓수가 큰 변수의 상호정보량을 그냥 계산하면 실제보다 크게 나오고, 특성 선택에서 그런 변수가 부당하게 유리해집니다. 강의 특성공학에서 이 문제를 다시 만나며, 대응은 표본을 늘리거나 치우침 보정을 쓰거나 값을 묶는 것입니다.
바로 확인 5.
확인 5-1. 엔트로피 추정의 치우침 방향과 이유를 쓰세요.
답. 아래로 치우치며 안 나온 값의 확률을 으로 두기 때문입니다.
확인 5-2. 검산에서 표본 과 의 치우침을 쓰세요.
답. 과 입니다.
확인 5-3. 검산에서 가짓수 일 때 표본 의 치우침을 쓰세요.
답. 입니다.
| 무엇 | 식 |
|---|---|
| 정보량 | |
| 엔트로피 | |
| 미분 엔트로피 | |
| 정규의 미분 엔트로피 | |
| 균등의 미분 엔트로피 | |
| 추정 치우침 |
| 제약 | 최대 엔트로피 분포 |
|---|---|
| 범위 | 균등 |
| 평균 (양수) | 지수 |
| 평균과 분산 | 정규 |
| 성공 확률 | 베르누이 |
| 밑 | 단위 | 어디서 |
|---|---|---|
| 비트 | 압축과 부호화 | |
| 내트 | 기계학습 | |
| 디짓 | 옛 문헌 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 미분 엔트로피를 정보량으로 읽습니다 | 눈금에 딸린 값입니다 |
| 미분 엔트로피가 음수라 놀랍니다 | 정상입니다 |
| 표본 엔트로피를 그대로 씁니다 | 아래로 치우칩니다 |
| 가짓수 큰 변수를 그냥 견줍니다 | 치우침이 크게 다릅니다 |
| 정규 가정을 강한 제약으로 봅니다 | 가장 약한 가정입니다 |
문제 6. 정보량을 식으로 쓰고 왜 로그인지 쓰세요.
답. 이며 독립인 사건의 정보량이 더해져야 하기 때문입니다.
문제 7. 검산에서 확률 의 정보량을 쓰세요.
답. 비트입니다.
문제 8. 검산에서 다섯 분포의 엔트로피를 쓰세요.
답. , , , , 입니다.
문제 9. 허프만 부호의 초과분 상한을 쓰세요.
답. 비트를 넘지 않습니다.
문제 10. 검산에서 아주 치우친 분포의 엔트로피와 허프만 길이를 쓰세요.
답. 와 입니다.
문제 11. 검산에서 를 에서 로 늘릴 때 초과분을 쓰세요.
답. , , , 입니다.
문제 12. 검산에서 네 개씩 묶어 부호화했을 때의 기호당 비트를 쓰세요.
답. 이며 하한은 입니다.
문제 13. 세 단위 이름과 밑을 쓰세요.
답. 밑 는 비트, 밑 는 내트, 밑 은 디짓입니다.
문제 14. 미분 엔트로피가 이산과 다른 점 둘을 쓰세요.
답. 음수가 될 수 있고 눈금을 바꾸면 값이 달라집니다.
문제 15. 검산에서 칸 폭 일 때의 이산 엔트로피와 보정한 값을 쓰세요.
답. 과 입니다.
문제 16. 검산에서 네 분포의 미분 엔트로피를 쓰세요.
답. , , , 입니다.
문제 17. 검산에서 표본 과 의 치우침을 쓰세요.
답. 과 입니다.
문제 18. 검산에서 가짓수 일 때 표본 의 치우침을 쓰세요.
답. 입니다.
심화 1. 엔트로피의 성질을 정리하세요.
| 성질 | 내용 |
|---|---|
| 비음성 | 이산에서는 이상 |
| 최댓값 | 균등일 때 |
| 오목성 | 분포에 대해 오목 |
| 사슬 규칙 | |
| 확장 불변 | 확률 인 값을 더해도 안 변함 |
셋째 줄이 중요합니다. 두 분포를 섞으면 엔트로피가 각각의 평균보다 크거나 같습니다.
섞을수록 불확실해진다는 직관이 그것이며, 강의 젠센 부등식이 근거입니다.
넷째 줄이 강의 출발점입니다. 둘을 함께 아는 불확실성은 하나를 안 뒤 나머지를 더한 것과 같습니다.
심화 2. 왜 최소 부호 길이가 인지 정리하세요.
크라프트 부등식이 접두사 부호의 존재 조건입니다.
| 무엇 | 왜 |
|---|---|
| 길이 인 부호 하나 | 가능한 것의 을 차지 |
| 전체 합이 이하 | 겹치지 않으려면 |
| 최적 길이 | \ell_{i}=-\log_{2}p_ |
정수 제약을 풀면 정확히 정보량이 나옵니다. 정수로 올림하면서 생기는 손해가 문제 의 초과분입니다.
산술부호는 그 정수 제약을 없앱니다. 여러 기호를 하나의 실수 구간으로 표현해 초과분을 에 가깝게 만듭니다.
심화 3. 점근 등분할 성질을 정리하세요.
길이 인 수열의 확률이 대부분 근처에 몰립니다.
| 무엇 | 크기 |
|---|---|
| 전체 수열 | 개 |
| 전형 집합 | 약 개 |
| 전형 집합의 확률 | 에 가까움 |
이면 전형 집합이 전체의 아주 작은 조각입니다.
압축이 가능한 이유가 이것입니다. 실제로 나타나는 수열만 번호를 매기면 비트로 충분합니다.
강의 큰 수의 법칙이 로그 확률에 적용된 형태입니다.
심화 4. 엔트로피 추정의 보정을 정리하세요.
| 방법 | 어떻게 |
|---|---|
| 밀러-매도 보정 | 를 더함 |
| 잭나이프 | 하나씩 빼고 다시 계산 |
| 베이즈 추정 | 사전분포를 넣음 |
| 커버리지 기반 | 안 나온 값의 확률을 추정 |
첫째 줄이 가장 간단하고 문제 의 이론 치우침이 그것입니다. 다만 가 표본보다 크면 잘 안 듭니다.
넷째 줄이 그 경우의 대응입니다. 한 번만 나온 값의 개수로 안 본 확률을 추정합니다.
를 어떻게 세느냐부터 문제입니다. 실제로 나타난 값만 셀지 가능한 값 전체를 셀지가 답을 바꿉니다.
심화 5. 엔트로피가 기계학습에서 쓰이는 자리를 정리하세요.
| 어디 | 무엇으로 |
|---|---|
| 의사결정나무 | 분할 기준 |
| 분류 손실 | 교차엔트로피 |
| 변분추론 | 하한의 한 항 |
| 정규화 | 출력 엔트로피에 벌점 |
| 능동학습 | 불확실한 표본 고르기 |
첫째 줄이 강입니다. 나누기 전후의 엔트로피 차이가 정보 이득이며, 그것이 강의 상호정보량입니다.
넷째 줄이 최근에 자주 쓰입니다. 출력이 너무 확신에 차지 않도록 엔트로피를 크게 유지합니다.
다섯째 줄이 자료가 비쌀 때 쓰입니다. 모형이 가장 헷갈려 하는 표본에 라벨을 붙입니다.
심화 6. 이 강의가 남긴 문제를 정리하세요.
하나의 분포만 쟀습니다.
| 무엇을 못 했나 | 어디서 |
|---|---|
| 두 변수의 관계 | 강 |
| 두 분포의 거리 | 강 |
| 모형과 자료의 어긋남 | 강 |
를 알고 나면 의 불확실성이 얼마나 남는가가 조건부 엔트로피이고, 얼마나 줄었는가가 상호정보량입니다. 상관계수와 달리 선형이 아닌 관계도 잡아냅니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 정보량 | 입니다 | |
| 엔트로피 | 정보량의 기댓값입니다 | |
| 미분 엔트로피 | 연속 분포의 엔트로피입니다 | |
| 비트 | bit | 밑이 일 때의 단위입니다 |
| 내트 | nat | 밑이 일 때의 단위입니다 |
| 허프만 부호 | Huffman code | 최적 접두사 부호입니다 |
| 크라프트 부등식 | Kraft inequality | 접두사 부호의 존재 조건입니다 |
| 최대 엔트로피 | maximum entropy | 제약 아래 가장 넓은 분포입니다 |
| 전형 집합 | typical set | 확률이 근처인 수열들입니다 |
| 밀러-매도 보정 | Miller-Madow | 추정 치우침을 더해 줍니다 |
다음은 202강 결합엔트로피, 조건부엔트로피, 상호정보량입니다. 이 강의가 하나의 분포를 쟀습니다.
를 알고 나서 에 남은 불확실성이 조건부 엔트로피이고, 줄어든 양이 상호정보량입니다. 202강은 그것을 계산하고, 상관계수가 못 잡는 관계를 상호정보량이 잡아내는 것을 수치로 보입니다.
import numpy as np
rng = np.random.default_rng(20261008)
def pw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return str(s) + " " * max(k, 0)
def rw(s, n):
k = n - sum(2 if ord(c) > 0x2FFF else 1 for c in str(s))
return " " * max(k, 0) + str(s)
def H(p, base=2.0):
p = np.asarray(p, dtype=float)
p = p[p > 0]
return float(-(p * (np.log(p) / np.log(base))).sum()) + 0.0
# --- 문제 1: 놀람의 크기를 재는 자 -------------------------------------
print(" 200강까지 자료가 무엇을 말하는지를 물었습니다")
print(" 이제 자료가 얼마나 말하는지를 잽니다")
print(" 드문 일이 일어나면 많이 놀라고 흔한 일이면 덜 놀랍니다")
print(" %s %s %s %s"
% (pw("일어날 확률", 14), rw("놀람의 크기", 16), rw("확률의 역수", 16),
rw("몇 비트인가", 16)))
for p in [1.0, 0.5, 0.25, 0.125, 0.01]:
v = -np.log2(p) + 0.0
print(" %s %16.6f %16.4f %16.6f"
% (pw("%.3f" % p, 14), v, 1.0 / p, v))
print(" 확률 1 인 일에는 0 비트입니다. 이미 알고 있으니 새 정보가 없습니다")
print(" 확률이 절반이 될 때마다 1 비트씩 늘어납니다")
print(" 로그를 쓰는 이유는 독립인 두 사건의 놀람이 더해지게 하려는 것입니다")
print(" %s %s %s %s"
% (pw("두 사건", 20), rw("확률의 곱", 14), rw("놀람의 합", 14),
rw("곱의 놀람", 14)))
for a, b in [(0.5, 0.5), (0.25, 0.5), (0.1, 0.2)]:
print(" %s %14.6f %14.6f %14.6f"
% (pw("%.2f 과 %.2f" % (a, b), 20), a * b,
-np.log2(a) - np.log2(b), -np.log2(a * b)))
print(" 곱이 합이 됩니다. 이 성질을 요구하면 로그밖에 남지 않습니다")
print(" 엔트로피는 놀람의 평균입니다")
print(" %s %s %s %s"
% (pw("분포", 26), rw("엔트로피 비트", 16), rw("최대", 12), rw("몇 퍼센트", 14)))
dists = [("한쪽으로 몰림 0.99 와 0.01", [0.99, 0.01]),
("치우침 0.9 와 0.1", [0.9, 0.1]),
("공평한 동전", [0.5, 0.5]),
("네 면 주사위", [0.25] * 4),
("한 면만 나옴", [1.0])]
for nm, p in dists:
mx = np.log2(len(p))
print(" %s %16.6f %12.4f %14s"
% (pw(nm, 26), H(p), mx,
rw("%.4f" % (H(p) / mx) if mx > 0 else "정의 안 됨", 14)))
print(" 고를 것이 하나뿐이면 0 이고 모두 같은 확률일 때 가장 큽니다")
print(" n 가지가 모두 같으면 log2 n 비트입니다")
print(" 엔트로피가 실제로 몇 개의 질문인지 봅니다")
print(" 예 아니오 질문으로 값을 맞히는 데 필요한 평균 횟수입니다")
probs = [0.5, 0.25, 0.125, 0.125]
lens = [1, 2, 3, 3]
print(" %s %s %s %s"
% (pw("값", 10), rw("확률", 12), rw("부호 길이", 12), rw("이상적 길이", 16)))
for i, (p, l) in enumerate(zip(probs, lens)):
print(" %s %12.4f %12d %16.6f"
% (pw("%d" % (i + 1), 10), p, l, -np.log2(p)))
avg = float(np.dot(probs, lens))
print(" 평균 부호 길이 %.6f 이고 엔트로피 %.6f 입니다" % (avg, H(probs)))
print(" 확률이 2 의 거듭제곱이면 둘이 정확히 같습니다")
print(" 엔트로피는 압축의 하한입니다. 그보다 짧게는 못 줄입니다")
# --- 문제 2: 하한이 실제로 지켜지는지 ----------------------------------
print(" 하한이 정말 지켜지는지 부호를 만들어 확인합니다")
def huffman(p):
nodes = [[float(pi), [i], {}] for i, pi in enumerate(p)]
codes = {i: "" for i in range(len(p))}
while len(nodes) > 1:
nodes.sort(key=lambda z: (z[0], min(z[1])))
a, b = nodes[0], nodes[1]
for i in a[1]:
codes[i] = "0" + codes[i]
for i in b[1]:
codes[i] = "1" + codes[i]
nodes = nodes[2:] + [[a[0] + b[0], a[1] + b[1], {}]]
return codes
print(" 확률이 2 의 거듭제곱이 아닌 분포로 해 봅니다")
print(" %s %s %s %s"
% (pw("분포", 30), rw("엔트로피", 14), rw("허프만 평균 길이", 20),
rw("초과분", 12)))
cases = [("공평한 세 면", [1 / 3] * 3),
("치우친 세 면", [0.7, 0.2, 0.1]),
("치우친 네 면", [0.6, 0.2, 0.15, 0.05]),
("아주 치우침", [0.95, 0.03, 0.01, 0.01])]
for nm, p in cases:
cd = huffman(p)
L = sum(p[i] * len(cd[i]) for i in range(len(p)))
print(" %s %14.6f %20.6f %12.6f"
% (pw(nm, 30), H(p), L, L - H(p)))
print(" 허프만은 언제나 엔트로피 이상이고 1 비트를 넘지 않습니다")
print(" 마지막 줄이 가장 심합니다. 확률 0.95 에도 1 비트를 써야 하기 때문입니다")
print(" 여러 개를 묶으면 그 손해가 줄어듭니다")
p0 = [0.95, 0.05]
print(" 확률 0.95 와 0.05 인 자료를 k 개씩 묶어 부호를 만듭니다")
print(" %s %s %s %s"
% (pw("몇 개씩 묶나", 14), rw("기호당 엔트로피", 18),
rw("기호당 평균 길이", 20), rw("초과분", 12)))
for k in [1, 2, 3, 4]:
n = 2 ** k
pk = []
for m in range(n):
q = 1.0
for b in range(k):
q *= p0[(m >> b) & 1]
pk.append(q)
cd = huffman(pk)
L = sum(pk[i] * len(cd[i]) for i in range(n)) / k
print(" %s %18.6f %20.6f %12.6f"
% (pw("%d" % k, 14), H(p0), L, L - H(p0)))
print(" 묶을수록 초과분이 줄어듭니다. 1 나누기 k 보다 작아집니다")
print(" 이것이 압축이 엔트로피에 다가가는 방식입니다")
print(" 실제로 부호화해서 길이를 재 봅니다")
N = 200000
x = (rng.random(N) < 0.05).astype(int)
cd1 = huffman(p0)
bits1 = sum(len(cd1[v]) for v in x)
k = 4
m = N // k
blocks = x[:m * k].reshape(m, k)
idx = (blocks * (2 ** np.arange(k))).sum(axis=1)
pk = []
for j in range(2 ** k):
q = 1.0
for b in range(k):
q *= p0[(j >> b) & 1]
pk.append(q)
cd4 = huffman(pk)
bits4 = sum(len(cd4[int(v)]) for v in idx)
print(" %s %s %s"
% (pw("어떻게 부호화", 24), rw("기호당 비트", 16), rw("이론 하한", 14)))
for nm, v in [("그냥 0 과 1", 1.0), ("한 개씩 허프만", bits1 / N),
("네 개씩 묶어 허프만", bits4 / (m * k))]:
print(" %s %16.6f %14.6f" % (pw(nm, 24), v, H(p0)))
print(" 한 개씩은 1 비트에서 못 내려갑니다. 이진 부호이기 때문입니다")
print(" 네 개씩 묶으면 하한 %.6f 에 가까워집니다" % H(p0))
# --- 문제 3: 밑과 연속 ---------------------------------------------------
print(" 로그의 밑을 바꾸면 단위가 바뀝니다")
print(" %s %s %s %s"
% (pw("밑", 10), rw("단위 이름", 14), rw("공평한 동전", 16),
rw("여섯 면 주사위", 18)))
for base, nm in [(2.0, "비트"), (np.e, "내트"), (10.0, "디짓")]:
print(" %s %s %16.6f %18.6f"
% (pw("%.4f" % base, 10), rw(nm, 14), H([0.5, 0.5], base),
H([1 / 6] * 6, base)))
print(" 단위만 다르고 정보의 양은 같습니다. 상수배로 서로 바뀝니다")
print(" 기계학습에서는 미분이 깔끔한 내트를 씁니다")
print(" 연속 분포로 넘어가면 성질이 달라집니다")
print(" 균등분포의 폭을 바꿔 가며 미분 엔트로피를 봅니다")
print(" %s %s %s"
% (pw("구간 폭", 14), rw("미분 엔트로피 내트", 22), rw("판정", 16)))
for w in [4.0, 2.0, 1.0, 0.5, 0.1]:
print(" %s %22.6f %s"
% (pw("%.1f" % w, 14), np.log(w),
rw("음수" if w < 1 else "양수", 16)))
print(" 폭이 1 보다 좁으면 음수가 됩니다. 이산 엔트로피와 다릅니다")
print(" 미분 엔트로피는 놀람의 절대량이 아니라 눈금에 딸린 값입니다")
print(" 단위를 미터에서 센티미터로 바꾸면 log 100 만큼 늘어납니다")
print(" 이산으로 잘게 나눠 보면 왜 그런지 보입니다")
print(" 표준정규를 폭 d 로 잘라 이산 엔트로피를 잽니다")
xs = np.linspace(-12, 12, 240001)
pdf = np.exp(-xs ** 2 / 2) / np.sqrt(2 * np.pi)
print(" %s %s %s %s"
% (pw("칸의 폭", 12), rw("이산 엔트로피", 18), rw("빼기 log(1/d)", 20),
rw("미분 엔트로피", 18)))
h_true = 0.5 * np.log(2 * np.pi * np.e)
for d in [1.0, 0.5, 0.1, 0.01]:
edges = np.arange(-12, 12 + d, d)
cnt = np.zeros(len(edges) - 1)
step = xs[1] - xs[0]
ii = np.clip(((xs + 12) / d).astype(int), 0, len(cnt) - 1)
np.add.at(cnt, ii, pdf * step)
cnt = cnt / cnt.sum()
hd = H(cnt, np.e)
print(" %s %18.6f %20.6f %18.6f"
% (pw("%.2f" % d, 12), hd, hd + np.log(d), h_true))
print(" 칸을 좁힐수록 이산 엔트로피가 끝없이 커집니다")
print(" 거기서 log(1/d) 를 빼면 미분 엔트로피로 수렴합니다")
print(" 연속 확률변수를 정확히 적으려면 무한 비트가 듭니다. 그것이 이유입니다")
# --- 문제 4: 최대 엔트로피 ---------------------------------------------
print(" 제약이 있을 때 엔트로피를 최대로 하는 분포를 찾습니다")
print(" %s %s %s"
% (pw("무엇을 안다고 하나", 26), rw("답이 되는 분포", 22),
rw("어디서 봤나", 20)))
for a, b, c in [("범위만 안다", "균등분포", "121강"),
("평균만 안다", "지수분포", "128강"),
("평균과 분산을 안다", "정규분포", "129강"),
("성공 확률만 안다", "베르누이", "127강")]:
print(" %s %s %s" % (pw(a, 26), rw(b, 22), rw(c, 20)))
print(" 107강 문제 4 의 라그랑주 승수로 유도됩니다")
print(" 셋째 줄이 왜 정규분포가 어디에나 나오는지의 한 이유입니다")
print(" 정규가 정말 최대인지 확인합니다")
print(" 평균 0 이고 분산 1 인 여러 분포의 미분 엔트로피를 봅니다")
def diff_entropy(sample, bins=400):
lo, hi = float(sample.min()), float(sample.max())
d = (hi - lo) / bins
cnt, _ = np.histogram(sample, bins=bins, range=(lo, hi))
p = cnt / cnt.sum()
return H(p, np.e) + np.log(d)
M = 2000000
print(" %s %s %s %s"
% (pw("분포", 22), rw("표본 분산", 14), rw("미분 엔트로피", 18),
rw("정규와의 차", 16)))
samples = [("정규", rng.normal(0, 1, M)),
("균등", rng.uniform(-np.sqrt(3), np.sqrt(3), M)),
("라플라스", rng.laplace(0, 1 / np.sqrt(2), M)),
("두 봉우리 혼합", np.where(rng.random(M) < 0.5, -1.0, 1.0)
* np.sqrt(0.75) + rng.normal(0, 0.5, M))]
h_ref = None
for nm, sp in samples:
h = diff_entropy(sp)
if h_ref is None:
h_ref = h
print(" %s %14.6f %18.6f %16.6f"
% (pw(nm, 22), float(sp.var()), h, h - h_ref))
print(" 정규의 이론값은 0.5 곱하기 log(2 pi e) 이고 %.6f 입니다" % h_true)
print(" 같은 분산인데 정규가 가장 큽니다. 나머지는 전부 음수 차이입니다")
print(" 마지막 줄은 봉우리가 둘이라 같은 분산에도 더 예측하기 쉽습니다")
print(" 분산을 안다는 것이 얼마나 강한 제약인지 봅니다")
print(" %s %s %s"
% (pw("무엇을 아는가", 26), rw("남은 불확실성 내트", 22), rw("줄어든 양", 16)))
base_h = np.log(2 * 12.0)
rows = [("범위만 앎 (폭 24)", base_h),
("범위만 앎 (폭 6)", np.log(6.0)),
("평균 0 분산 1 을 앎", h_true)]
for nm, v in rows:
print(" %s %22.6f %16.6f" % (pw(nm, 26), v, base_h - v))
print(" 첫 줄의 폭 24 는 임의로 잡은 기준선입니다. 절대량이 아니라 차이를 봅니다")
print(" 범위를 네 배 좁히면 log 4 만큼인 1.386294 가 줄어듭니다")
print(" 평균과 분산 두 숫자를 아는 것이 그보다 조금 더 줄여 줍니다")
print(" 그런데 그 둘로 분포를 다 안 것은 아닙니다. 가장 넓게 잡은 것입니다")
# --- 문제 5: 실제 자료의 엔트로피 ---------------------------------------
print(" 실제 자료에서 엔트로피를 재면 무슨 일이 생기는지 봅니다")
print(" 참 분포를 알 때와 표본으로 추정할 때가 다릅니다")
true_p = np.array([0.4, 0.25, 0.15, 0.1, 0.06, 0.04])
Ht = H(true_p)
print(" 여섯 가지 값이고 참 엔트로피는 %.6f 비트입니다" % Ht)
print(" %s %s %s %s %s"
% (pw("표본 크기", 12), rw("추정 엔트로피 평균", 22), rw("참값", 12),
rw("치우침", 14), rw("이론 치우침", 16)))
for n in [10, 50, 200, 2000]:
hs = []
for _ in range(3000):
c = rng.multinomial(n, true_p)
hs.append(H(c / n))
theo = -(len(true_p) - 1) / (2.0 * n * np.log(2))
print(" %s %22.6f %12.6f %14.6f %16.6f"
% (pw("%d" % n, 12), float(np.mean(hs)), Ht,
float(np.mean(hs)) - Ht, theo))
print(" 표본이 작으면 엔트로피를 작게 봅니다. 안 나온 값이 0 이 되기 때문입니다")
print(" 치우침이 대략 가짓수 빼기 1 을 2 n log2 로 나눈 만큼입니다")
print(" 마지막 두 열이 붙습니다. 가짓수가 많을수록 더 심해집니다")
print(" 가짓수가 표본보다 많으면 어떻게 되는지 봅니다")
print(" %s %s %s %s"
% (pw("가짓수", 12), rw("참 엔트로피", 16), rw("표본 100 개 추정", 20),
rw("치우침", 14)))
for K in [4, 16, 64, 256]:
p = np.full(K, 1.0 / K)
hs = []
for _ in range(2000):
c = rng.multinomial(100, p)
hs.append(H(c / 100))
print(" %s %16.6f %20.6f %14.6f"
% (pw("%d" % K, 12), np.log2(K), float(np.mean(hs)),
float(np.mean(hs)) - np.log2(K)))
print(" 가짓수 256 에 표본 100 이면 치우침이 1.7 비트를 넘습니다")
print(" 단어나 사용자 아이디처럼 가짓수가 큰 변수에서 이것이 늘 문제입니다")
print(" 정리하고 다음으로 넘어갑니다")
print(" %s %s" % (pw("무엇", 24), rw("어디서 쓰이는가", 30)))
for a, b in [("엔트로피", "압축의 하한과 불확실성"),
("조건부 엔트로피", "202강 남은 불확실성"),
("상호정보량", "202강 변수 사이의 의존"),
("KL 발산", "203강 두 분포의 거리"),
("교차엔트로피", "204강 분류 손실함수")]:
print(" %s %s" % (pw(a, 24), rw(b, 30)))
print(" 201강은 하나의 분포를 쟀습니다. 202강은 두 분포의 관계를 잽니다")
# 200강까지 자료가 무엇을 말하는지를 물었습니다
# 이제 자료가 얼마나 말하는지를 잽니다
# 드문 일이 일어나면 많이 놀라고 흔한 일이면 덜 놀랍니다
# 일어날 확률 놀람의 크기 확률의 역수 몇 비트인가
# 1.000 0.000000 1.0000 0.000000
# 0.500 1.000000 2.0000 1.000000
# 0.250 2.000000 4.0000 2.000000
# 0.125 3.000000 8.0000 3.000000
# 0.010 6.643856 100.0000 6.643856
# 확률 1 인 일에는 0 비트입니다. 이미 알고 있으니 새 정보가 없습니다
# 확률이 절반이 될 때마다 1 비트씩 늘어납니다
# 로그를 쓰는 이유는 독립인 두 사건의 놀람이 더해지게 하려는 것입니다
# 두 사건 확률의 곱 놀람의 합 곱의 놀람
# 0.50 과 0.50 0.250000 2.000000 2.000000
# 0.25 과 0.50 0.125000 3.000000 3.000000
# 0.10 과 0.20 0.020000 5.643856 5.643856
# 곱이 합이 됩니다. 이 성질을 요구하면 로그밖에 남지 않습니다
# 엔트로피는 놀람의 평균입니다
# 분포 엔트로피 비트 최대 몇 퍼센트
# 한쪽으로 몰림 0.99 와 0.01 0.080793 1.0000 0.0808
# 치우침 0.9 와 0.1 0.468996 1.0000 0.4690
# 공평한 동전 1.000000 1.0000 1.0000
# 네 면 주사위 2.000000 2.0000 1.0000
# 한 면만 나옴 0.000000 0.0000 정의 안 됨
# 고를 것이 하나뿐이면 0 이고 모두 같은 확률일 때 가장 큽니다
# n 가지가 모두 같으면 log2 n 비트입니다
# 엔트로피가 실제로 몇 개의 질문인지 봅니다
# 예 아니오 질문으로 값을 맞히는 데 필요한 평균 횟수입니다
# 값 확률 부호 길이 이상적 길이
# 1 0.5000 1 1.000000
# 2 0.2500 2 2.000000
# 3 0.1250 3 3.000000
# 4 0.1250 3 3.000000
# 평균 부호 길이 1.750000 이고 엔트로피 1.750000 입니다
# 확률이 2 의 거듭제곱이면 둘이 정확히 같습니다
# 엔트로피는 압축의 하한입니다. 그보다 짧게는 못 줄입니다
# 하한이 정말 지켜지는지 부호를 만들어 확인합니다
# 확률이 2 의 거듭제곱이 아닌 분포로 해 봅니다
# 분포 엔트로피 허프만 평균 길이 초과분
# 공평한 세 면 1.584963 1.666667 0.081704
# 치우친 세 면 1.156780 1.300000 0.143220
# 치우친 네 면 1.533206 1.600000 0.066794
# 아주 치우침 0.354944 1.070000 0.715056
# 허프만은 언제나 엔트로피 이상이고 1 비트를 넘지 않습니다
# 마지막 줄이 가장 심합니다. 확률 0.95 에도 1 비트를 써야 하기 때문입니다
# 여러 개를 묶으면 그 손해가 줄어듭니다
# 확률 0.95 와 0.05 인 자료를 k 개씩 묶어 부호를 만듭니다
# 몇 개씩 묶나 기호당 엔트로피 기호당 평균 길이 초과분
# 1 0.286397 1.000000 0.713603
# 2 0.286397 0.573750 0.287353
# 3 0.286397 0.433250 0.146853
# 4 0.286397 0.367191 0.080794
# 묶을수록 초과분이 줄어듭니다. 1 나누기 k 보다 작아집니다
# 이것이 압축이 엔트로피에 다가가는 방식입니다
# 실제로 부호화해서 길이를 재 봅니다
# 어떻게 부호화 기호당 비트 이론 하한
# 그냥 0 과 1 1.000000 0.286397
# 한 개씩 허프만 1.000000 0.286397
# 네 개씩 묶어 허프만 0.366105 0.286397
# 한 개씩은 1 비트에서 못 내려갑니다. 이진 부호이기 때문입니다
# 네 개씩 묶으면 하한 0.286397 에 가까워집니다
# 로그의 밑을 바꾸면 단위가 바뀝니다
# 밑 단위 이름 공평한 동전 여섯 면 주사위
# 2.0000 비트 1.000000 2.584963
# 2.7183 내트 0.693147 1.791759
# 10.0000 디짓 0.301030 0.778151
# 단위만 다르고 정보의 양은 같습니다. 상수배로 서로 바뀝니다
# 기계학습에서는 미분이 깔끔한 내트를 씁니다
# 연속 분포로 넘어가면 성질이 달라집니다
# 균등분포의 폭을 바꿔 가며 미분 엔트로피를 봅니다
# 구간 폭 미분 엔트로피 내트 판정
# 4.0 1.386294 양수
# 2.0 0.693147 양수
# 1.0 0.000000 양수
# 0.5 -0.693147 음수
# 0.1 -2.302585 음수
# 폭이 1 보다 좁으면 음수가 됩니다. 이산 엔트로피와 다릅니다
# 미분 엔트로피는 놀람의 절대량이 아니라 눈금에 딸린 값입니다
# 단위를 미터에서 센티미터로 바꾸면 log 100 만큼 늘어납니다
# 이산으로 잘게 나눠 보면 왜 그런지 보입니다
# 표준정규를 폭 d 로 잘라 이산 엔트로피를 잽니다
# 칸의 폭 이산 엔트로피 빼기 log(1/d) 미분 엔트로피
# 1.00 1.458959 1.458959 1.418939
# 0.50 2.122395 1.429248 1.418939
# 0.10 3.721947 1.419361 1.418939
# 0.01 6.024113 1.418943 1.418939
# 칸을 좁힐수록 이산 엔트로피가 끝없이 커집니다
# 거기서 log(1/d) 를 빼면 미분 엔트로피로 수렴합니다
# 연속 확률변수를 정확히 적으려면 무한 비트가 듭니다. 그것이 이유입니다
# 제약이 있을 때 엔트로피를 최대로 하는 분포를 찾습니다
# 무엇을 안다고 하나 답이 되는 분포 어디서 봤나
# 범위만 안다 균등분포 121강
# 평균만 안다 지수분포 128강
# 평균과 분산을 안다 정규분포 129강
# 성공 확률만 안다 베르누이 127강
# 107강 문제 4 의 라그랑주 승수로 유도됩니다
# 셋째 줄이 왜 정규분포가 어디에나 나오는지의 한 이유입니다
# 정규가 정말 최대인지 확인합니다
# 평균 0 이고 분산 1 인 여러 분포의 미분 엔트로피를 봅니다
# 분포 표본 분산 미분 엔트로피 정규와의 차
# 정규 0.998643 1.418183 0.000000
# 균등 1.000469 1.242344 -0.175839
# 라플라스 1.001053 1.346640 -0.071543
# 두 봉우리 혼합 1.000672 1.312301 -0.105881
# 정규의 이론값은 0.5 곱하기 log(2 pi e) 이고 1.418939 입니다
# 같은 분산인데 정규가 가장 큽니다. 나머지는 전부 음수 차이입니다
# 마지막 줄은 봉우리가 둘이라 같은 분산에도 더 예측하기 쉽습니다
# 분산을 안다는 것이 얼마나 강한 제약인지 봅니다
# 무엇을 아는가 남은 불확실성 내트 줄어든 양
# 범위만 앎 (폭 24) 3.178054 0.000000
# 범위만 앎 (폭 6) 1.791759 1.386294
# 평균 0 분산 1 을 앎 1.418939 1.759115
# 첫 줄의 폭 24 는 임의로 잡은 기준선입니다. 절대량이 아니라 차이를 봅니다
# 범위를 네 배 좁히면 log 4 만큼인 1.386294 가 줄어듭니다
# 평균과 분산 두 숫자를 아는 것이 그보다 조금 더 줄여 줍니다
# 그런데 그 둘로 분포를 다 안 것은 아닙니다. 가장 넓게 잡은 것입니다
# 실제 자료에서 엔트로피를 재면 무슨 일이 생기는지 봅니다
# 참 분포를 알 때와 표본으로 추정할 때가 다릅니다
# 여섯 가지 값이고 참 엔트로피는 2.200797 비트입니다
# 표본 크기 추정 엔트로피 평균 참값 치우침 이론 치우침
# 10 1.801189 2.200797 -0.399608 -0.360674
# 50 2.120992 2.200797 -0.079805 -0.072135
# 200 2.182511 2.200797 -0.018286 -0.018034
# 2000 2.198682 2.200797 -0.002115 -0.001803
# 표본이 작으면 엔트로피를 작게 봅니다. 안 나온 값이 0 이 되기 때문입니다
# 치우침이 대략 가짓수 빼기 1 을 2 n log2 로 나눈 만큼입니다
# 마지막 두 열이 붙습니다. 가짓수가 많을수록 더 심해집니다
# 가짓수가 표본보다 많으면 어떻게 되는지 봅니다
# 가짓수 참 엔트로피 표본 100 개 추정 치우침
# 4 2.000000 1.978535 -0.021465
# 16 4.000000 3.887197 -0.112803
# 64 6.000000 5.473609 -0.526391
# 256 8.000000 6.285861 -1.714139
# 가짓수 256 에 표본 100 이면 치우침이 1.7 비트를 넘습니다
# 단어나 사용자 아이디처럼 가짓수가 큰 변수에서 이것이 늘 문제입니다
# 정리하고 다음으로 넘어갑니다
# 무엇 어디서 쓰이는가
# 엔트로피 압축의 하한과 불확실성
# 조건부 엔트로피 202강 남은 불확실성
# 상호정보량 202강 변수 사이의 의존
# KL 발산 203강 두 분포의 거리
# 교차엔트로피 204강 분류 손실함수
# 201강은 하나의 분포를 쟀습니다. 202강은 두 분포의 관계를 잽니다