02단원에서 분포를 여섯 개 세웠습니다. 각 분포는 모든 값에 대한 확률의 목록이며 정보가 완전합니다.
그런데 완전한 정보가 늘 좋은 것은 아닙니다. 두 분포를 비교하려면 목록 전체를 견줘야 하고, 사람에게 전달하려면 그림이 필요하며, 최적화하려면 미분할 대상이 있어야 합니다.
그래서 분포를 몇 개의 수로 요약합니다. 그 첫째가 기댓값입니다.
이미 여러 번 썼습니다. 127강에서 이항분포의 평균을 라 했고, 129강 문제 5에서 평균을 적분으로 정의했으며, 121강 심화 6에서 손실함수가 기댓값이라고 했습니다. 이제 정식화합니다.
기댓값에는 두 가지 얼굴이 있습니다.
| 얼굴 | 뜻 |
|---|---|
| 무게중심 | 확률을 질량으로 보았을 때의 균형점 |
| 장기 평균 | 무한히 반복했을 때의 평균값 |
둘째 얼굴은 아직 증명되지 않았습니다. 142강의 큰 수의 법칙이 그것을 보장하며, 지금은 첫째 얼굴로 정의합니다.
그리고 이 강의에서 가장 강력한 도구 하나를 얻습니다.
독립이 필요 없습니다. 이 사실 하나로 122강에서 애써 세었던 문제들이 한 줄로 풀립니다.
문제. 주사위 두 개의 합 를 봅니다.
(1) 를 누적하며 계산하세요.
(2) 그 값이 무엇에 해당하는지 밝히세요.
(3) 연속분포에서도 계산해 보세요.
생각의 실마리. 확률 를 위치 에 놓인 질량이라 보면, 는 물리에서 배운 무게중심 공식과 같은 꼴입니다.
풀이. (1) 검산 결과입니다.
| 누적 무게중심 | |||
|---|---|---|---|
이며 대칭축과 같습니다.
(2) 마지막 열이 "여기까지의 질량만 놓았을 때의 무게중심"이며, 전부 놓으면 입니다.
(3) 연속에서는 합이 적분이 됩니다.
| 분포 | 수치 | 이론값 |
|---|---|---|
| 균등 | ||
| 지수 | ||
| 표준정규 |
이 문제에서 배우는 것: 기댓값의 정의.
기댓값. 이산이면
연속이면
둘이 다른 정의가 아닙니다. 126강 심화 1의 스틸체스 적분으로 쓰면 하나입니다.
무게중심 해석. 밀도를 질량 분포로 보면 기댓값은 막대가 균형을 이루는 받침점입니다.
이 해석이 여러 성질을 직관적으로 만듭니다.
| 성질 | 무게중심으로 읽으면 |
|---|---|
| 대칭분포의 평균은 대칭축 | 균형점이 가운데입니다 |
| 이상치가 평균을 끌어당김 | 멀리 있는 질량의 팔이 깁니다 |
| 상수를 더하면 평균도 더해짐 | 막대를 통째로 옮깁니다 |
| 상수를 곱하면 평균도 곱해짐 | 눈금을 늘립니다 |
셋째와 넷째 줄이 선형성의 절반이며, 문제 3에서 나머지 절반을 봅니다.
주의. 기댓값은 실제로 나올 수 있는 값이 아닐 수 있습니다.
주사위 하나의 기댓값은 인데 눈에 는 없습니다. **"기대"라는 이름이 오해를 부르며, 기댓값은 "가장 그럴듯한 값"이 아니라 "평균적인 값"**입니다. 가장 그럴듯한 값은 최빈값입니다.
바로 확인 1.
확인 1-1. 기댓값의 정의를 이산과 연속에서 각각 쓰세요.
답. 와 입니다.
확인 1-2. 기댓값의 물리적 해석을 쓰세요.
답. 확률을 질량으로 본 무게중심입니다.
확인 1-3. 기댓값이 실제 값으로 나올 수 있습니까?
답. 아닐 수 있습니다. 주사위 하나의 가 예입니다.
문제. 가 주사위 두 개의 합이고 입니다.
(1) 의 분포를 구해 를 계산하세요.
(2) 의 분포만으로 직접 계산하세요.
(3) 두 결과를 비교하세요.
생각의 실마리. 126강 문제 5에서 의 분포를 구하려면 역상의 확률을 더해야 했습니다. 그 수고를 건너뛸 수 있는지 봅니다.
풀이. (1) 의 분포는 126강 문제 5에서 이미 구했습니다.
(2)(3) 두 방법의 결과입니다.
| 방법 | 값 |
|---|---|
| 의 분포를 구해서 | |
| 의 분포로 바로 |
차이가 정확히 입니다.
이 문제에서 배우는 것: 무의식적 통계학자의 법칙.
LOTUS. 일 때
이며 의 분포를 구할 필요가 없습니다.
이름이 재미있습니다. 무의식적 통계학자의 법칙이라 불리는 것은, 많은 사람이 이 식을 당연하다고 여기고 증명 없이 쓰기 때문입니다.
증명은 역상을 모으는 것입니다. 의 분포는 이므로
같은 항을 다른 순서로 더한 것뿐입니다. 126강 문제 5에서 확률이 합쳐진다고 한 것이 여기서 값을 곱해도 유지됩니다.
이 법칙으로 분산이 바로 나옵니다.
검산에서 , , 으로 두 계산이 일치합니다. 133강에서 다룹니다.
적률생성함수도 이 법칙 위에 서 있습니다.
의 분포를 구하지 않고 계산하며, 134강의 주제입니다.
바로 확인 2.
확인 2-1. LOTUS를 쓰세요.
답. 이며 의 분포가 필요 없습니다.
확인 2-2. 증명의 핵심을 한 줄로 쓰세요.
답. 같은 항을 역상별로 묶었다가 푼 것뿐입니다.
확인 2-3. 이 법칙으로 무엇을 계산할 수 있는지 두 가지 쓰세요.
답. 분산과 적률생성함수입니다.
문제. 세 가지 문제의 기댓값을 지시함수의 합으로 구합니다.
(1) 생일 충돌 쌍의 기대 개수를 구하세요.
(2) 교란순열의 기대 고정점 수를 구하세요.
(3) 쿠폰 수집가의 기대 횟수를 구하세요.
생각의 실마리. 셋 다 "몇 개인가"를 묻습니다. 개수는 지시함수의 합이며, 127강 문제 3에서 이항분포에 쓴 수법이 그대로 통합니다.
풀이. (1)(2) 검산 결과입니다.
| 문제 | 지시함수 개수 | 각 확률 | 기댓값 | 직접 계산 |
|---|---|---|---|---|
| 생일 충돌 쌍 , 일 열거 | ||||
| 생일 충돌 쌍 , 일 | 열거 불가 | |||
| 교란순열 고정점 수 | ||||
| 교란순열 고정점 수 |
첫 줄에서 지시함수 논증을 완전 열거로 검증했고, 둘째 줄에 그 공식을 적용했습니다.
여기서 놀라운 것이 나옵니다. 의 기대 충돌 쌍 수가 인데, 입니다.
이것이 이라는 수의 정체입니다. 충돌 수를 포아송으로 근사하면
이라 정확히 절반입니다. 122강 문제 4에서 "쌍의 수가 커지기 때문"이라 했던 설명이 여기서 정량화되며, 128강의 포아송 근사가 도구입니다.
**교란순열의 고정점 수는 과 무관하게 정확히 **입니다. 각 원소가 제자리일 확률이 이고 원소가 개이기 때문입니다. 122강 문제 5에서 가 나온 이유가 이것이며, 평균 인 포아송이 일 확률이 입니다.
(3) 쿠폰 수집가입니다.
| nH_ | 비 | ||
|---|---|---|---|
세 문제 모두 지시함수들이 독립이 아닌데도 기댓값은 그냥 더해집니다.
이 문제에서 배우는 것: 기댓값의 선형성.
선형성. 임의의 확률변수와 상수에 대해
이며 독립을 전혀 요구하지 않습니다.
이것이 확률론에서 가장 값싸고 강력한 도구입니다. 분산은 독립을 요구하고, 곱의 기댓값도 독립을 요구하는데, 합의 기댓값만은 조건이 없습니다.
증명이 짧습니다. 두 확률변수가 같은 표본공간 위에 있으므로
표본점별로 더한 것을 쪼갠 것뿐이며, 126강 심화 1에서 확률변수를 함수로 보면 자연스럽습니다.
지시함수 분해. 세는 문제는 대개 지시함수의 합으로 쓸 수 있습니다.
의존 구조를 전혀 몰라도 됩니다. 생일 문제에서 충돌 쌍들은 서로 강하게 얽혀 있는데(세 사람의 생일이 같으면 세 쌍이 동시에 충돌), 기댓값 계산에는 아무 영향이 없습니다.
이 수법이 쓰이는 자리가 대단히 많습니다.
| 문제 | 지시함수 |
|---|---|
| 이항분포의 평균 | 각 시행의 성공 여부 |
| 생일 충돌 쌍 | 각 쌍의 일치 여부 |
| 교란순열 고정점 | 각 원소의 제자리 여부 |
| 정렬 알고리즘 비교 횟수 | 각 쌍의 비교 여부 |
| 그래프의 삼각형 개수 | 각 삼중쌍의 형성 여부 |
바로 확인 3.
확인 3-1. 선형성을 쓰고 필요한 조건을 쓰세요.
답. 이며 조건이 없습니다.
확인 3-2. 지시함수 분해를 쓰세요.
답. 이면 입니다.
확인 3-3. 생일 문제에서 명이 절반이 되는 이유를 쓰세요.
답. 기대 충돌 쌍 수가 에 가까워 이기 때문입니다.
문제. 두 가지 상황을 봅니다.
(1) 상트페테르부르크 게임의 기대 상금을 구하세요.
(2) 실제 상금의 분포를 보세요.
(3) 코시분포에서 를 조사하세요.
생각의 실마리. 기댓값은 급수나 적분이므로 수렴하지 않을 수 있습니다. 121강 문제 4에서 확률의 합은 반드시 이었지만, 의 합은 다른 문제입니다.
풀이. (1) 번째에 처음 앞면이 나오면 를 받습니다. 128강에서 였으므로
이며 검산에서 부분합이 항 수와 정확히 같습니다.
| 항 수 | 부분합 |
|---|---|
각 항이 정확히 이라 발산합니다. 기대 상금이 무한대입니다.
(2) 그런데 실제로 받는 금액은 대부분 작습니다.
| 상금 이하 | 확률 |
|---|---|
절반은 를 받고 는 이하를 받습니다. 기대 상금이 무한대인데 이 게임에 큰돈을 걸 사람은 없으며, 이를 상트페테르부르크 역설이라 합니다.
(3) 코시분포는 밀도가 입니다.
| 수치 적분 | 차이 | ||
|---|---|---|---|
| 10^ | 3.59\times10^ | ||
| 10^ | 4.04\times10^ | ||
| 10^ | 4.09\times10^ |
이 더 커지면 수치 적분이 따라가지 못하므로 해석값만 봅니다.
| 10^ | |
| 10^ | |
| 10^ | |
| 10^ |
로그로 천천히 발산합니다.
이 문제에서 배우는 것: 기댓값의 존재 조건.
존재 조건. 가 잘 정의되려면
이어야 합니다. 이를 절대적분가능이라 합니다.
절댓값을 요구하는 이유는 재배열 때문입니다. 조건부수렴하는 급수는 항의 순서를 바꾸면 값이 달라지므로(56강), 순서에 의존하지 않는 값을 얻으려면 절대수렴이 필요합니다.
꼬리가 얼마나 두꺼우면 기댓값이 없어지는지가 정해집니다.
| 꼬리 | ||
|---|---|---|
| (코시) | 없습니다 | 없습니다 |
| f(x)\sim x^ | 있습니다 | 없습니다 |
| f(x)\sim x^ | 있습니다 | 있습니다 |
| 이하 | 모든 적률이 있습니다 | 있습니다 |
멱법칙 꼬리 에서 차 미만의 적률만 존재합니다.
실무에서 이것이 위험한 이유가 있습니다. 기댓값이 없는데 표본평균을 계산하면 수가 나오기는 합니다. 다만 그 수가 아무 데도 수렴하지 않고 표본을 늘려도 안정되지 않습니다. 142강의 큰 수의 법칙이 적용되지 않기 때문입니다.
| 분야 | 두꺼운 꼬리 |
|---|---|
| 금융 손익 | 극단 사건이 평균을 지배합니다 |
| 네트워크 트래픽 | 소수의 거대 흐름 |
| 도시 인구, 소득 | 멱법칙 |
| 신경망 기울기 노름 | 학습 중 스파이크 |
넷째 줄이 기울기 클리핑의 근거입니다. 기울기 노름의 꼬리가 두꺼우면 평균이 불안정하므로, 상한을 씌워 강제로 유한하게 만듭니다.
바로 확인 4.
확인 4-1. 기댓값의 존재 조건을 쓰세요.
답. 인 절대적분가능입니다.
확인 4-2. 절댓값을 요구하는 이유를 쓰세요.
답. 조건부수렴이면 순서에 따라 값이 달라지기 때문입니다.
확인 4-3. 코시분포의 평균과 분산을 쓰세요.
답. 둘 다 존재하지 않습니다.
문제. 지수분포 에서 상수 로 예측할 때의 손실을 봅니다.
(1) 을 여러 에서 계산하세요.
(2) 도 계산하세요.
(3) 각각의 최소점을 찾으세요.
생각의 실마리. "가장 좋은 하나의 수"는 무엇을 좋다고 하느냐에 달려 있습니다. 손실을 다르게 재면 답도 달라질 것입니다.
풀이. (1)(2) 검산 결과입니다.
두 열의 최소가 서로 다른 에서 나타납니다.
(3) 최소점을 찾으면 이렇습니다.
| 손실 | 최소점 | 대응하는 대푯값 |
|---|---|---|
| 제곱오차 | 평균 | |
| 절대오차 | 중앙값 |
**중앙값의 이론값은 **이며, 최소점의 차이는 탐색 격자 간격에서 옵니다.
이 문제에서 배우는 것: 손실이 예측 대상을 정한다.
제곱오차의 최소점은 평균입니다.
증명이 한 줄입니다. 전개하면
이고 첫 항은 와 무관하므로 둘째 항을 으로 만드는 가 최소입니다.
이 분해가 편향-분산 분해의 원형이며 210강에서 다시 나옵니다. 손실이 줄일 수 없는 부분과 줄일 수 있는 부분으로 갈립니다.
절대오차의 최소점은 중앙값입니다.
미분해 보면 보입니다. 에 대한 도함수가 이므로, 이 되려면 양쪽 확률이 같아야 하고 그것이 중앙값의 정의입니다.
126강 심화 5의 핀볼 손실이 이 둘을 잇습니다.
| 손실 | 최적 예측 | 어디에 쓰는가 |
|---|---|---|
| 제곱오차 | 조건부 평균 | 회귀의 기본값 |
| 절대오차 | 조건부 중앙값 | 이상치에 강건 |
| 핀볼 | 조건부 분위수 | 예측 구간 |
| 교차엔트로피 | 조건부 확률 | 분류 |
모형이 무엇을 배울지는 손실이 정합니다. 회귀 모형이 조건부 평균을 예측하는 것은 제곱오차를 쓰기 때문이며, 다른 것을 원하면 손실을 바꿔야 합니다.
130강 심화 6과 이어집니다. 제곱오차를 쓰는 것은 가우스 잡음을 가정하는 것과 같고, 절대오차는 라플라스 잡음에 대응합니다. 손실 선택과 잡음 가정이 같은 결정입니다.
실무의 함정이 여기 있습니다. 응답 시간처럼 치우친 자료에 제곱오차를 쓰면 모형이 평균을 맞추려 하고, 평균은 소수의 느린 요청에 끌려갑니다. 을 원하면 절대오차를, 를 원하면 핀볼 손실을 써야 합니다.
바로 확인 5.
확인 5-1. 제곱오차의 최소점과 그 분해를 쓰세요.
답. 평균이며 입니다.
확인 5-2. 절대오차의 최소점과 그 이유를 쓰세요.
답. 중앙값이며 도함수 가 이 되는 점입니다.
확인 5-3. 모형이 무엇을 예측할지는 무엇이 정합니까?
답. 손실함수의 선택이 정합니다.
| 개념 | 식 |
|---|---|
| 기댓값(이산) | |
| 기댓값(연속) | |
| LOTUS | |
| 선형성 | |
| 지시함수 분해 | |
| 존재 조건 | |
| 제곱오차 분해 | \operatorname{Var}[X]+(\mathbb{E}[X]-c)^ |
| 손실 | 최적 예측 |
|---|---|
| 제곱오차 | 평균 |
| 절대오차 | 중앙값 |
| 핀볼 | 분위수 |
| 꼬리 | 존재하는 적률 |
|---|---|
| x^ | 없습니다 |
| x^ | 평균만 |
| x^ | 평균과 분산 |
| 지수 이하 | 전부 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 기댓값을 가장 그럴듯한 값이라 봅니다 | 그것은 최빈값입니다 |
| 선형성에 독립이 필요하다고 봅니다 | 조건이 없습니다 |
| 라 씁니다 | 젠센 부등식이 방향을 줍니다 |
| 기댓값이 늘 존재한다고 봅니다 | 절대적분가능해야 합니다 |
문제 6. 기댓값을 이산과 연속에서 각각 쓰세요.
답. 와 입니다.
문제 7. 기댓값의 물리적 해석을 쓰세요.
답. 확률을 질량으로 본 무게중심입니다.
문제 8. 기댓값이 실제 값으로 나올 수 있습니까?
답. 아닐 수 있으며 주사위 하나의 가 예입니다.
문제 9. LOTUS를 쓰고 그 이점을 쓰세요.
답. 이며 의 분포를 구할 필요가 없습니다.
문제 10. LOTUS 증명의 핵심을 쓰세요.
답. 같은 항을 역상별로 묶었다가 푼 것뿐입니다.
문제 11. 선형성을 쓰고 필요한 조건을 쓰세요.
답. 이며 조건이 없습니다.
문제 12. 지시함수 분해를 쓰세요.
답. 이면 입니다.
문제 13. 교란순열의 기대 고정점 수와 그것이 와 이어지는 이유를 쓰세요.
답. 과 무관하게 이며 평균 인 포아송이 일 확률이 입니다.
문제 14. 생일 문제에서 명이 절반이 되는 이유를 쓰세요.
답. 기대 충돌 쌍 수가 에 가까워 이기 때문입니다.
문제 15. 쿠폰 수집가의 기대 횟수를 쓰세요.
답. 입니다.
문제 16. 기댓값의 존재 조건과 절댓값을 요구하는 이유를 쓰세요.
답. 이며 조건부수렴이면 순서에 따라 값이 달라지기 때문입니다.
문제 17. 상트페테르부르크 역설을 쓰세요.
답. 기대 상금이 무한대인데 실제로는 절반이 를 받아 아무도 큰돈을 걸지 않습니다.
문제 18. 제곱오차와 절대오차의 최소점을 각각 쓰세요.
답. 평균과 중앙값입니다.
심화 1. 젠센 부등식과 그 함의를 정리하세요.
와 는 일반적으로 다릅니다. 108강의 볼록성이 방향을 정합니다.
젠센 부등식. 가 볼록이면
이며 오목이면 부등호가 뒤집힙니다.
등호는 가 선형이거나 가 상수일 때만 성립합니다.
| 부등식 | 이름 | |
|---|---|---|
| x^ | 분산이 음수가 아님 | |
| 산술평균 기하평균 | ||
| e^ | 적률생성함수의 하한 | |
| 조화평균 산술평균 |
둘째 줄이 특히 자주 쓰입니다. 곱셈적으로 쌓이는 양의 평균을 로그로 다룰 때 산술평균이 기하평균보다 크다는 사실이 됩니다. 129강 문제 5의 로그정규분포에서 평균이 중앙값보다 컸던 것이 이 부등식의 결과입니다.
셋째 줄이 기계학습에서 결정적입니다. 262강의 ELBO가 정확히 이 부등식으로 유도됩니다.
로그가 오목이라 기댓값을 안으로 넣으면 작아지고, 그 작아진 값이 최적화 가능한 하한이 됩니다.
실무의 함정도 있습니다. 평균 지연시간의 역수와 평균 처리량은 다릅니다. 이므로 어느 쪽을 재는지 분명히 해야 합니다.
심화 2. 꼬리합 공식을 유도하고 활용하세요.
기댓값을 확률의 합으로 쓰는 다른 방법이 있습니다.
꼬리합 공식. 이면
유도가 면적을 두 방향으로 세는 것입니다. 의 넓이를 방향으로 먼저 재면 이고 방향으로 먼저 재면 입니다. 103강의 푸비니 정리입니다.
이 공식으로 어려운 기댓값이 쉬워집니다.
기하분포에서 이므로
등비급수 한 번으로 끝납니다. 128강 문제 4에서 조건을 걸어 유도한 것보다 짧습니다.
지수분포에서도 마찬가지입니다.
생존분석에서 이 공식이 표준 도구입니다. 129강 심화 4의 생존함수 를 적분하면 곧바로 기대 수명이 나옵니다.
중도 절단이 있어도 는 추정할 수 있으므로, 관측되지 않은 수명까지 반영한 기댓값을 얻습니다.
심화 3. 조건부기댓값을 미리 보세요.
137강에서 정식으로 다루지만 개념을 미리 세웁니다.
마다 다른 수가 나오므로 는 의 함수이고, 따라서 확률변수입니다. 이것이 처음에 헷갈리는 지점입니다.
전체 기댓값 법칙.
123강의 전확률의 법칙을 기댓값으로 옮긴 것이며, 128강 문제 4에서 기하분포의 평균을 구할 때 이미 썼습니다.
첫 시행 결과로 조건을 건 것입니다.
이 수법이 재귀적 구조에 강력합니다.
| 문제 | 무엇으로 조건을 거는가 |
|---|---|
| 기하분포의 평균 | 첫 시행의 성공 여부 |
| 쿠폰 수집가 | 현재 모은 종류 수 |
| 랜덤워크의 도달 시간 | 첫 걸음의 방향 |
| 분기 과정의 소멸 확률 | 첫 세대의 자손 수 |
강화학습의 벨만 방정식이 이 구조입니다.
**"현재 가치는 즉시 보상과 다음 상태 가치의 기댓값"**이며, 첫 행동으로 조건을 건 전체 기댓값 법칙입니다. 274강에서 다룹니다.
심화 4. 기댓값과 최적화의 관계를 정리하세요.
기계학습의 목표는 대개 기댓값의 최소화입니다.
그런데 를 모르므로 계산할 수 없습니다. 대신 표본평균을 씁니다.
선형성 덕분에 의 기댓값이 정확히 입니다.
이를 불편추정량이라 하며 148강에서 다룹니다. 데이터가 독립일 필요조차 없고 동일 분포이기만 하면 됩니다.
기울기에도 같은 논리가 적용됩니다.
미니배치 기울기가 참 기울기의 불편추정량이며, 이것이 확률적 경사하강법이 작동하는 근거입니다. 119강 심화 5에서 잡음의 평균이 이라 한 것이 이 사실입니다.
미분과 기댓값을 바꿔 쓸 수 있느냐가 숨은 조건입니다.
적분과 미분의 교환이며 지배수렴정리가 보장합니다. 분포 자체가 에 의존하면 이 교환이 깨지고, 그때 필요한 것이 286강의 정책경사 정리와 재매개변수화 요령입니다.
심화 5. 표본평균과 기댓값의 관계를 미리 정리하세요.
기댓값을 "장기 평균"이라 부르지만 아직 증명하지 않았습니다. 142강이 그것을 보장합니다.
큰 수의 법칙. 가 독립이고 이면
두 가정이 모두 필요합니다.
| 깨지는 조건 | 결과 |
|---|---|
| 독립이 아님 | 수렴이 느리거나 안 함 |
| 아무 데도 수렴 안 함 |
둘째 줄이 문제 4의 코시분포입니다. 표본평균을 계산하면 수는 나오지만, 표본을 백만 개로 늘려도 안정되지 않습니다. 실제로 코시분포에서 은 다시 코시분포를 따르며, 이 커져도 퍼짐이 전혀 줄지 않습니다.
이것이 실무 진단법을 줍니다. 표본평균을 을 늘려가며 그려 보아 안정되지 않으면 꼬리가 두껍다는 신호입니다. 그때는 평균 대신 중앙값이나 절단평균을 쓰거나, 분포 자체를 다시 모형화해야 합니다.
심화 6. 기댓값을 추정하는 몬테카를로를 개관하세요.
를 적분으로 계산할 수 없을 때 표본으로 추정합니다.
**선형성으로 불편이고, 분산은 **입니다. 따라서 오차가 로 줄며 차원과 무관합니다.
이것이 몬테카를로의 결정적 장점입니다. 129강 심화 5에서 격자 기반 방법이 차원의 저주에 걸린다고 했는데, 몬테카를로는 걸리지 않습니다.
| 방법 | 차원에서의 오차 |
|---|---|
| 격자 적분 | |
| 몬테카를로 |
면 몬테카를로가 이깁니다.
분산을 줄이는 요령이 여럿 있습니다.
| 기법 | 아이디어 |
|---|---|
| 중요도 표집 | 중요한 영역에서 더 뽑고 가중치로 보정 |
| 대조변수 | 기댓값을 아는 상관된 양을 빼기 |
| 대조표본 | 음의 상관을 갖는 쌍을 함께 쓰기 |
| 층화 표집 | 구간을 나눠 각각에서 뽑기 |
첫째 줄이 강화학습의 오프폴리시 학습입니다. 다른 정책으로 모은 데이터로 목표 정책의 기댓값을 추정하며, 중요도 비가 가중치가 됩니다.
147강에서 정식으로 다루며, 157강의 MCMC는 에서 직접 뽑을 수 없을 때 쓰는 확장입니다.
import numpy as np, math, itertools
# --- 문제 1: 기댓값은 무게중심이다 --------------------------------------
S = list(itertools.product(range(1, 7), repeat=2))
N = len(S)
vals = sorted({a+b for a, b in S})
pmf = {v: sum(1 for w in S if w[0]+w[1] == v)/N for v in vals}
print(" 주사위 두 개의 합. E[X] = sum x p(x) 는 확률을 질량으로 본 무게중심입니다")
print(" x p(x) x*p(x) 누적 무게중심")
acc_w = acc_m = 0.0
for v in vals:
acc_w += pmf[v]; acc_m += v*pmf[v]
print(" %7d %10.6f %12.6f %16.6f" % (v, pmf[v], v*pmf[v], acc_m/acc_w))
print(" E[X] = %.6f 이며 대칭축 7 과 같습니다" % acc_m)
print(" 연속에서는 합이 적분이 됩니다")
print(" 분포 E[X] 수치 이론값")
def emean(dens, lo, hi, M=4000000):
xs = lo + (np.arange(M) + 0.5)*(hi-lo)/M
w = dens(xs)*(hi-lo)/M
return float(xs @ w)/w.sum()
print(" %-14s %12.6f %10.6f" % ("균등 U(0,1)", emean(lambda t: np.ones_like(t), 0, 1), 0.5))
print(" %-14s %12.6f %10.6f" % ("지수 lam=1.5", emean(lambda t: 1.5*np.exp(-1.5*t), 0, 60), 1/1.5))
print(" %-14s %12.6f %10.6f" % ("표준정규", emean(lambda t: np.exp(-t*t/2)/np.sqrt(2*np.pi), -12, 12), 0.0))
# 주사위 두 개의 합. E[X] = sum x p(x) 는 확률을 질량으로 본 무게중심입니다
# x p(x) x*p(x) 누적 무게중심
# 2 0.027778 0.055556 2.000000
# 3 0.055556 0.166667 2.666667
# 4 0.083333 0.333333 3.333333
# 5 0.111111 0.555556 4.000000
# 6 0.138889 0.833333 4.666667
# 7 0.166667 1.166667 5.333333
# 8 0.138889 1.111111 5.846154
# 9 0.111111 1.000000 6.266667
# 10 0.083333 0.833333 6.606061
# 11 0.055556 0.611111 6.857143
# 12 0.027778 0.333333 7.000000
# E[X] = 7.000000 이며 대칭축 7 과 같습니다
# 연속에서는 합이 적분이 됩니다
# 분포 E[X] 수치 이론값
# 균등 U(0,1) 0.500000 0.500000
# 지수 lam=1.5 0.666667 0.666667
# 표준정규 0.000000 0.000000
# --- 문제 2: g(X) 의 분포를 몰라도 E[g(X)] 를 구한다 ---------------------
print(" E[g(X)] 를 두 방법으로 계산합니다. g(x) = (x-7)^2")
g = lambda x: (x-7)**2
yv = sorted({g(v) for v in vals})
pY = {y: sum(pmf[v] for v in vals if g(v) == y) for y in yv}
way1 = sum(y*p for y, p in pY.items()) # Y 의 분포를 구해서
way2 = sum(g(v)*pmf[v] for v in vals) # X 의 분포로 바로
print(" y p_Y(y) y*p_Y(y)")
for y in yv:
print(" %7d %10.6f %13.6f" % (y, pY[y], y*pY[y]))
print(" 방법 1 (Y 의 분포를 구함) %14.10f" % way1)
print(" 방법 2 (X 의 분포로 바로) %14.10f" % way2)
print(" 차이 %.2e. Y 의 분포를 구할 필요가 없습니다" % abs(way1-way2))
print(" 이것으로 분산도 바로 나옵니다")
m = sum(v*pmf[v] for v in vals)
print(" E[X] = %.6f, E[(X-E[X])^2] = %.6f, E[X^2]-E[X]^2 = %.6f"
% (m, sum((v-m)**2*pmf[v] for v in vals),
sum(v*v*pmf[v] for v in vals) - m*m))
# E[g(X)] 를 두 방법으로 계산합니다. g(x) = (x-7)^2
# y p_Y(y) y*p_Y(y)
# 0 0.166667 0.000000
# 1 0.277778 0.277778
# 4 0.222222 0.888889
# 9 0.166667 1.500000
# 16 0.111111 1.777778
# 25 0.055556 1.388889
# 방법 1 (Y 의 분포를 구함) 5.8333333333
# 방법 2 (X 의 분포로 바로) 5.8333333333
# 차이 0.00e+00. Y 의 분포를 구할 필요가 없습니다
# 이것으로 분산도 바로 나옵니다
# E[X] = 7.000000, E[(X-E[X])^2] = 5.833333, E[X^2]-E[X]^2 = 5.833333
# --- 문제 3: 선형성은 독립을 요구하지 않는다 ----------------------------
print(" 지시함수의 합으로 보면 어려운 기댓값이 즉시 나옵니다")
print(" 문제 지시함수 개수 각 확률 기댓값 직접 계산")
ex_small = np.mean([sum(1 for i, j in itertools.combinations(range(4), 2) if a[i] == a[j])
for a in itertools.product(range(5), repeat=4)])
print(" %-28s %13d %10.6f %10.6f %10.6f"
% ("생일 충돌 쌍 (n=4, 5일) 열거", 6, 1/5, 6/5, ex_small))
print(" %-28s %13d %10.6f %10.6f %10s"
% ("생일 충돌 쌍 (n=23, 365일)", 253, 1/365, 253/365, "열거 불가"))
print(" 마지막 줄의 기대값 %.6f 이 log 2 = %.6f 과 거의 같은 것이 23 의 정체입니다"
% (253/365, np.log(2)))
print(" 충돌 수를 포아송으로 근사하면 P(충돌 없음) = e^{-0.6932} = %.6f 이라 절반입니다"
% np.exp(-253/365))
for n_d in [4, 8]:
exact = np.mean([sum(1 for i in range(n_d) if p[i] == i)
for p in itertools.permutations(range(n_d))])
print(" %-28s %13d %10.6f %10.6f %10.6f"
% ("교란순열 고정점 수 (n=%d)" % n_d, n_d, 1/n_d, n_d*(1/n_d), exact))
print(" 고정점 개수의 기대값이 n 과 무관하게 정확히 1 입니다")
print(" 쿠폰 수집가: n 종류를 다 모으는 기대 횟수 = n * H_n")
print(" n n*H_n n*log(n) 비")
for n_c in [10, 50, 365]:
H = sum(1/j for j in range(1, n_c+1))
print(" %9d %12.4f %13.4f %8.4f" % (n_c, n_c*H, n_c*np.log(n_c), n_c*H/(n_c*np.log(n_c))))
print(" 이 셋 모두 지시함수가 독립이 아닌데도 기댓값은 그냥 더해집니다")
# 지시함수의 합으로 보면 어려운 기댓값이 즉시 나옵니다
# 문제 지시함수 개수 각 확률 기댓값 직접 계산
# 생일 충돌 쌍 (n=4, 5일) 열거 6 0.200000 1.200000 1.200000
# 생일 충돌 쌍 (n=23, 365일) 253 0.002740 0.693151 열거 불가
# 마지막 줄의 기대값 0.693151 이 log 2 = 0.693147 과 거의 같은 것이 23 의 정체입니다
# 충돌 수를 포아송으로 근사하면 P(충돌 없음) = e^{-0.6932} = 0.499998 이라 절반입니다
# 교란순열 고정점 수 (n=4) 4 0.250000 1.000000 1.000000
# 교란순열 고정점 수 (n=8) 8 0.125000 1.000000 1.000000
# 고정점 개수의 기대값이 n 과 무관하게 정확히 1 입니다
# 쿠폰 수집가: n 종류를 다 모으는 기대 횟수 = n * H_n
# n n*H_n n*log(n) 비
# 10 29.2897 23.0259 1.2720
# 50 224.9603 195.6012 1.1501
# 365 2364.6460 2153.4625 1.0981
# 이 셋 모두 지시함수가 독립이 아닌데도 기댓값은 그냥 더해집니다
# --- 문제 4: 기댓값이 없을 수도 있다 ------------------------------------
print(" 상트페테르부르크 게임: k 번째에 처음 앞면이면 2^k 를 받습니다")
print(" 항 수 K 부분합 sum 2^k * 2^{-k}")
for K in [10, 20, 40, 80]:
print(" %11d %26.1f" % (K, float(K)))
print(" 각 항이 정확히 1 이라 부분합이 발산합니다. 기대 상금이 무한대입니다")
print(" 그런데 실제로 받는 금액은 대부분 작습니다")
print(" 상금 2^k 이하 확률")
for k in [1, 2, 3, 5, 10]:
print(" %12d %18.10f" % (2**k, 1 - 0.5**k))
print(" 코시분포는 E[|X|] 가 발산합니다")
print(" 치환 x = tan(th) 로 구간은 유계가 되지만 tan 이 끝에서 발산해 특이점은 남습니다")
print(" L 수치 적분 (1/pi) log(1+L^2) 차이")
for L in [10.0, 100.0, 10000.0]:
M = 4000000
top = np.arctan(L)
th = (np.arange(M) + 0.5)*(top/M)
v = float(2*np.tan(th).sum()*(top/M)/np.pi)
ex = (1/np.pi)*np.log(1+L*L)
print(" %9.0e %17.6f %22.6f %12.2e" % (L, v, ex, abs(v-ex)))
print(" L 이 더 커지면 수치 적분이 따라가지 못하므로 해석값만 봅니다")
print(" L (1/pi) log(1+L^2)")
for e in [6, 12, 30, 100]:
L = 10.0**e
print(" %9.0e %22.6f" % (L, (2*e*np.log(10))/np.pi))
print(" log 로 천천히 발산하므로 표본평균이 어디에도 수렴하지 않습니다")
# 상트페테르부르크 게임: k 번째에 처음 앞면이면 2^k 를 받습니다
# 항 수 K 부분합 sum 2^k * 2^{-k}
# 10 10.0
# 20 20.0
# 40 40.0
# 80 80.0
# 각 항이 정확히 1 이라 부분합이 발산합니다. 기대 상금이 무한대입니다
# 그런데 실제로 받는 금액은 대부분 작습니다
# 상금 2^k 이하 확률
# 2 0.5000000000
# 4 0.7500000000
# 8 0.8750000000
# 32 0.9687500000
# 1024 0.9990234375
# 코시분포는 E[|X|] 가 발산합니다
# 치환 x = tan(th) 로 구간은 유계가 되지만 tan 이 끝에서 발산해 특이점은 남습니다
# L 수치 적분 (1/pi) log(1+L^2) 차이
# 1e+01 1.469038 1.469038 3.59e-13
# 1e+02 2.931774 2.931774 4.04e-11
# 1e+04 5.863484 5.863485 4.09e-07
# L 이 더 커지면 수치 적분이 따라가지 못하므로 해석값만 봅니다
# L (1/pi) log(1+L^2)
# 1e+06 8.795227
# 1e+12 17.590454
# 1e+30 43.976136
# 1e+100 146.587120
# log 로 천천히 발산하므로 표본평균이 어디에도 수렴하지 않습니다
# --- 문제 5: 무엇을 최소화하느냐가 무엇을 예측할지 정한다 ---------------
print(" 치우친 분포(지수 lam=1)에서 c 를 바꿔 두 손실을 최소화합니다")
lam = 1.0
M = 2000000; hi = 40.0
xs = (np.arange(M) + 0.5)*(hi/M); w = lam*np.exp(-lam*xs)*(hi/M); w = w/w.sum()
mean = float(xs @ w); med = float(xs[np.searchsorted(np.cumsum(w), 0.5)])
print(" c E[(X-c)^2] E[|X-c|]")
for c in [0.4, 0.6, np.log(2), 0.8, 1.0, 1.2]:
print(" %7.4f %16.8f %16.8f" % (c, float(((xs-c)**2) @ w), float(np.abs(xs-c) @ w)))
cs = np.linspace(0.3, 1.5, 12001)
q2 = np.array([float(((xs-c)**2) @ w) for c in cs[::40]])
q1 = np.array([float(np.abs(xs-c) @ w) for c in cs[::40]])
print(" 제곱오차 최소점 %.6f (평균 %.6f)" % (cs[::40][int(q2.argmin())], mean))
print(" 절대오차 최소점 %.6f (중앙값 %.6f, 이론 log2 = %.6f)"
% (cs[::40][int(q1.argmin())], med, np.log(2)))
print(" 손실함수의 선택이 무엇을 예측할지를 정합니다")
# 치우친 분포(지수 lam=1)에서 c 를 바꿔 두 손실을 최소화합니다
# c E[(X-c)^2] E[|X-c|]
# 0.4000 1.36000000 0.74064009
# 0.6000 1.16000000 0.69762327
# 0.6931 1.09415865 0.69314718
# 0.8000 1.04000000 0.69865793
# 1.0000 1.00000000 0.73575888
# 1.2000 1.04000000 0.80238842
# 제곱오차 최소점 1.000000 (평균 1.000000)
# 절대오차 최소점 0.692000 (중앙값 0.693150, 이론 log2 = 0.693147)
# 손실함수의 선택이 무엇을 예측할지를 정합니다
문제 3의 둘째 줄과 그 아래 두 줄이 이 강의에서 가장 값진 발견입니다. 의 기대 충돌 쌍 수가 인데 입니다. 우연이 아닙니다. 충돌 수를 포아송으로 근사하면 이라 정확히 절반이며, 122강에서 "쌍의 수가 커지기 때문"이라 두루뭉술하게 넘어간 설명이 여기서 수식이 됩니다.
문제 4의 두 표를 나란히 보십시오. 왼쪽은 기대 상금이 무한대로 발산하는데 오른쪽은 가 이하를 받습니다. 기댓값 하나로 분포를 요약하는 것이 언제 무의미해지는지를 보여 줍니다.
코시분포의 마지막 표에서 치환이 완전히 통하지 않은 것도 기록해 둡니다. 131강에서는 이 특이점을 없앴는데, 여기서는 가 구간만 유계로 만들고 이 끝에서 발산해 특이점이 옮겨갔을 뿐입니다. 까지는 수치가 따라오지만 그 이상은 해석값에 의존해야 합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 기댓값 | 확률을 질량으로 본 무게중심입니다 | |
| LOTUS | 무의식적 통계학자의 법칙 | 의 분포 없이 계산합니다 |
| 선형성 | linearity | 독립을 요구하지 않습니다 |
| 지시함수 분해 | indicator decomposition | 세는 문제를 합으로 바꿉니다 |
| 절대적분가능 | absolutely integrable | 입니다 |
| 상트페테르부르크 역설 | St. Petersburg paradox | 기댓값이 무한대인 게임입니다 |
| 코시분포 | Cauchy | 평균도 분산도 없습니다 |
| 젠센 부등식 | Jensen's inequality | 볼록성이 방향을 정합니다 |
| 꼬리합 공식 | tail sum formula | |
| 전체 기댓값 법칙 | law of total expectation | |
| 불편추정량 | unbiased estimator | 기댓값이 참값과 같습니다 |
| 조화수 H_ | harmonic number | 입니다 |
다음 133강에서는 분산과 표준편차를 다룹니다. 기댓값이 분포의 중심을 재는 수라면, 분산은 퍼짐을 재는 수입니다. 문제 5의 제곱오차 분해에서 이미 등장했으며, 127강 문제 3에서 "분산은 독립일 때만 더해진다"고 한 것을 정식으로 증명합니다. 그리고 왜 하필 제곱인가라는 질문에 답합니다.