203강 문제 3에서 최대우도가 KL을 줄이는 것과 같다고 했습니다. 그러면 결론이 하나 따라옵니다.
"제곱오차를 쓸까 절대오차를 쓸까"는 취향이 아닙니다. 잡음이 어떤 분포인지를 가정하면 손실이 정해집니다.
| 무엇을 가정하나 | 어떤 손실이 나오나 |
|---|---|
| 정규 | 제곱오차 |
| 베르누이 | 이진 교차엔트로피 |
| 다항 | 소프트맥스 교차엔트로피 |
| 라플라스 | 절대오차 |
이 강의는 그 유도를 확인하고, 손실을 잘못 고르면 무엇을 잃는지를 수치로 봅니다.
문제. 유도를 확인합니다.
(1) 대응을 정리하세요.
(2) 정규 가정에서 제곱오차가 나오는지 보세요.
(3) 가정이 틀리면 어떻게 되는지 보세요.
생각의 실마리. 음의 로그우도를 적으면 낯익은 식이 나옵니다.
풀이. (1) 대응을 정리합니다.
| 무엇을 가정하나 | 음의 로그우도 | 이름 |
|---|---|---|
| 정규 분산 고정 | 제곱오차의 절반 더하기 상수 | 제곱오차 |
| 베르누이 | 의 음수 | 이진 교차엔트로피 |
| 다항 | 정답 자리 확률의 음의 로그 | 소프트맥스 교차엔트로피 |
| 라플라스 | 절댓값 오차 더하기 상수 | 절대오차 |
| 포아송 | 포아송 손실 |
손실을 고르는 것이 곧 잡음의 분포를 가정하는 것입니다.
(2) 정규 가정에서 제곱오차가 나오는지 확인합니다. 참 계수는 과 입니다.
| 무엇으로 맞추나 | 절편 | 기울기 | 참값과의 거리 |
|---|---|---|---|
| 제곱오차 최소화 | |||
| 정규 로그우도 최대화 |
둘이 같은 답을 냅니다. 제곱오차가 정규 가정의 음의 로그우도이기 때문입니다.
분산이 고정이면 분산 항이 상수라 최소화에 영향을 안 줍니다. 그래서 를 몰라도 계수는 구할 수 있습니다.
(3) 가정이 틀리면 어떻게 되는지 봅니다. 기울기 추정값의 흔들림을 잽니다.
| 잡음의 분포 | 제곱오차의 기울기 | 절대오차의 기울기 | 어느 쪽이 참에 가까운가 |
|---|---|---|---|
| 정규 | 제곱오차 | ||
| 라플라스 | 절대오차 | ||
| 이상점 섞임 | 절대오차 |
정규 잡음에서는 제곱오차가 흔들림이 작습니다. 대 입니다.
라플라스와 이상점이 섞이면 절대오차가 낫습니다. 이상점이 섞이면 이 이 됩니다.
손실을 잘못 고르면 계수는 맞아도 흔들림이 커집니다. 치우침이 아니라 분산의 문제입니다.
이 문제에서 배우는 것. 손실 선택이 곧 모형 가정이므로 진단도 같은 방식입니다. 184강에서 잔차를 그려 회귀 모형의 결함을 찾았듯, 잔차의 분포를 보면 손실이 맞는지 알 수 있습니다. 잔차에 이상점이 많으면 제곱오차가 잘못된 가정이며, 그때는 손실을 바꾸는 것이 이상점을 지우는 것보다 정직합니다. 이상점을 지우면 왜 지웠는지 설명해야 하는데, 손실을 바꾸면 "두꺼운 꼬리를 가정했다"고 한 줄로 적으면 됩니다.
바로 확인 1.
확인 1-1. 손실을 고르는 것이 무엇을 가정하는 것인지 쓰세요.
답. 잡음의 분포를 가정하는 것입니다.
확인 1-2. 검산에서 두 방식의 절편과 기울기를 쓰세요.
답. 과 , 과 입니다.
확인 1-3. 검산에서 이상점이 섞였을 때 두 손실의 흔들림을 쓰세요.
답. 과 입니다.
문제. 이진 교차엔트로피를 다룹니다.
(1) 손실 값을 재세요.
(2) 안정적으로 계산하세요.
(3) 기울기를 제곱오차와 견주세요.
생각의 실마리. 베르누이 가정의 음의 로그우도가 정보량 그 자체입니다.
풀이. (1) 손실 값을 잽니다.
| 정답 | 예측 확률 | 손실 | 무엇을 뜻하나 |
|---|---|---|---|
| 잘 맞힘 | |||
| 보통 | |||
| 크게 틀림 | |||
| 크게 틀림 | |||
| 크게 틀림 |
확률이 에 가까운데 정답이면 손실이 끝없이 커집니다.
201강 문제 1의 정보량이 그대로 손실이 된 것입니다. 확률 인 일이 일어났을 때의 놀람이 곧 벌입니다.
(2) 안정적으로 계산합니다.
| 로짓 | 그냥 계산 | 안정적 계산 | 차이 |
|---|---|---|---|
| 무한대 | 깨짐 | ||
로짓이 이면 확률이 으로 반올림되어 그냥 계산이 무한이 됩니다.
로 적으면 이 그대로 나옵니다.
에서는 아직 안 깨집니다. 경계가 대략 근처이며, 158강 문제 1의 부동소수점 문제입니다.
(3) 기울기를 제곱오차와 견줍니다.
| 무엇 | 기울기 | 무엇이 좋은가 |
|---|---|---|
| 교차엔트로피와 시그모이드 | (예측 확률 정답) | 예측 오차에 비례 |
| 제곱오차와 시그모이드 | 위에 시그모이드 미분이 곱해짐 | 많이 틀릴 때 기울기가 사라짐 |
| 로짓 | 정답 | 교차엔트로피 기울기 | 제곱오차 기울기 |
|---|---|---|---|
로짓 에서 교차엔트로피는 인데 제곱오차는 입니다.
크게 틀렸는데 제곱오차는 거의 안 배웁니다. 배 넘게 차이 나며, 시그모이드의 미분 가 양 끝에서 으로 가기 때문입니다.
그것이 분류에 제곱오차를 안 쓰는 이유입니다.
이 문제에서 배우는 것. 교차엔트로피와 시그모이드의 조합이 우연히 깔끔한 것이 아닙니다. 로그가 시그모이드의 지수를 상쇄해 기울기가 정확히 "예측 오차"가 되며, 소프트맥스와 다중 교차엔트로피에서도 같은 일이 일어납니다. 그래서 출력 활성화와 손실은 짝으로 고릅니다. 시그모이드에 제곱오차를 붙이거나 소프트맥스에 제곱오차를 붙이면 위 표의 넷째 줄 같은 자리에서 학습이 멈추며, 246강의 그래디언트 소실이 출력층에서 미리 일어난 셈입니다.
바로 확인 2.
확인 2-1. 검산에서 정답이 이고 확률이 일 때의 손실을 쓰세요.
답. 입니다.
확인 2-2. 검산에서 로짓 일 때 두 계산의 결과를 쓰세요.
답. 그냥 계산은 무한대이고 안정적 계산은 입니다.
확인 2-3. 검산에서 로짓 일 때 두 손실의 기울기를 쓰세요.
답. 과 입니다.
문제. 소프트맥스를 다룹니다.
(1) 이동 불변성을 확인하세요.
(2) 온도를 바꿔 보세요.
(3) 라벨 평활을 해 보세요.
생각의 실마리. 여러 갈래일 때 확률로 바꾸는 함수가 소프트맥스입니다.
풀이. (1) 이동 불변성을 확인합니다.
| 무엇을 더하나 | 소프트맥스 결과 |
|---|---|
값이 완전히 같습니다. 분자와 분모에 같은 인수가 곱해지기 때문입니다.
그래서 최댓값을 빼고 계산합니다. 빼지 않으면 가 넘치며, 158강 문제 1과 같습니다.
로짓이 하나 더 자유롭다는 뜻이기도 합니다. 클래스가 개면 자유도가 이며, 186강 문제 1의 더미변수 함정과 같은 구조입니다.
(2) 온도를 바꿔 봅니다.
| 온도 | 가장 큰 확률 | 엔트로피 비트 | 무엇에 가까운가 |
|---|---|---|---|
| 한 점 | |||
| 한 점 | |||
| 가운데 | |||
| 균등 | |||
| 균등 |
온도가 낮으면 한 점에 몰리고 높으면 균등해집니다.
온도 에서 엔트로피가 에 가까워집니다.
지식 증류에서 온도를 올려 교사의 부드러운 확률을 배웁니다. 정답만이 아니라 **"어느 클래스와 헷갈리는지"**가 정보이기 때문입니다.
(3) 라벨 평활을 해 봅니다.
| 평활 정도 | 목표 확률 | 최적 로짓 차이 | 판정 |
|---|---|---|---|
| 무한대 | 발산 | ||
| 유한 | |||
| 유한 | |||
| 유한 |
평활을 안 하면 목표가 이라 로짓 차이가 무한으로 갑니다.
조금만 평활해도 유한한 자리에서 멈춥니다. 203강 심화 4입니다.
실제로 무엇이 바뀌는지 재 봅니다.
| 평활 정도 | 검증 정확도 | 검증 교차엔트로피 | 가장 큰 확률의 평균 |
|---|---|---|---|
평활하면 가장 큰 확률의 평균이 에서 으로 내려갑니다. 확신이 줄어든 것입니다.
정확도는 거의 안 변하고 교차엔트로피는 조금 나빠집니다.
확신을 줄이는 것이 목표일 때만 씁니다. 226강에서 다시 봅니다.
이 문제에서 배우는 것. 라벨 평활은 손실을 고치는 것이 아니라 목표 분포를 고치는 것입니다. 위 표에서 검증 교차엔트로피가 나빠졌는데, 그것은 평가할 때는 원래 라벨을 쓰기 때문입니다. 그러므로 평활은 교차엔트로피 지표로는 언제나 손해로 보이며, 값어치는 다른 곳에서 나옵니다. 과확신이 줄어 보정이 나아지고, 큰 모형에서 일반화가 조금 나아진다는 보고가 있습니다. 지표가 나빠지는데도 쓰는 기법이므로 무엇을 얻는지 분명히 해야 합니다.
바로 확인 3.
확인 3-1. 소프트맥스에 상수를 더하면 어떻게 되는지 쓰고 왜 그렇게 하는지 쓰세요.
답. 결과가 안 변하며 넘침을 막으려고 최댓값을 뺍니다.
확인 3-2. 검산에서 온도 와 의 가장 큰 확률과 엔트로피를 쓰세요.
답. 과 , 와 입니다.
확인 3-3. 검산에서 평활 과 의 가장 큰 확률 평균을 쓰세요.
답. 과 입니다.
문제. 회귀에서 무엇을 추정하는지 봅니다.
(1) 손실과 추정 대상을 짝지으세요.
(2) 치우친 자료에서 확인하세요.
(3) 분위 손실을 써 보세요.
생각의 실마리. 같은 자료라도 무엇을 최소로 하느냐가 다른 값을 냅니다.
풀이. (1) 짝지웁니다.
| 손실 | 무엇을 추정하나 | 어떤 가정 |
|---|---|---|
| 제곱오차 | 조건부 평균 | 정규 잡음 |
| 절대오차 | 조건부 중앙값 | 라플라스 잡음 |
| 분위 손실 | 조건부 분위수 | 비대칭 벌 |
| 후버 손실 | 가운데 어디쯤 | 가운데는 정규 밖은 라플라스 |
손실이 다르면 같은 자료에서 다른 값을 추정합니다.
(2) 치우친 자료에서 확인합니다. 로그정규 자료입니다.
| 어떤 손실을 최소로 | 최적 상수 | 이론값 | 무엇인가 |
|---|---|---|---|
| 제곱오차 | 조건부 평균 | ||
| 절대오차 | 조건부 중앙값 |
제곱오차는 근처이고 절대오차는 근처입니다.
같은 자료인데 무엇을 최소로 하느냐가 답을 바꿉니다. 퍼센트 차이입니다.
163강 문제 1의 "평균과 중앙값이 각각 무엇을 최소로 하는가"가 여기서 손실함수로 다시 나옵니다.
(3) 분위 손실을 써 봅니다.
| 분위 | 분위 손실의 최적값 | 실제 분위수 | 차이 |
|---|---|---|---|
분위 손실의 최적값이 그 분위수와 정확히 같습니다.
199강 심화 2의 분위 예측이 이 손실로 만들어집니다. 한쪽을 로 다른 쪽을 로 벌주면 됩니다.
이 문제에서 배우는 것. "예측이 틀렸다"는 판정 자체가 손실에 딸려 있습니다. 로그정규 자료에서 을 예측한 모형과 를 예측한 모형 중 어느 쪽이 나은지는 무엇을 물었느냐에 달렸고, 재고 계획이면 인 이 답일 수도 있습니다. 그래서 모형을 평가할 때 학습에 쓴 손실과 평가에 쓴 손실이 같아야 하며, 제곱오차로 학습하고 절대오차로 평가하면 치우친 자료에서 늘 나쁘게 보입니다.
바로 확인 4.
확인 4-1. 제곱오차와 절대오차가 각각 무엇을 추정하는지 쓰세요.
답. 조건부 평균과 조건부 중앙값입니다.
확인 4-2. 검산에서 두 손실의 최적 상수를 쓰세요.
답. 와 입니다.
확인 4-3. 검산에서 분위 과 의 최적값을 쓰세요.
답. 과 입니다.
문제. 기준을 세웁니다.
(1) 물어야 할 것을 정리하세요.
(2) 클래스 가중치를 줘 보세요.
(3) 보정이 어떻게 되는지 보세요.
생각의 실마리. 손실을 고르기 전에 무엇을 예측하려는지부터 정해야 합니다.
풀이. (1) 물어야 할 것을 정리합니다.
| 무엇을 묻나 | 무엇이 정해지나 |
|---|---|
| 무엇을 예측하나 | 평균인가 중앙값인가 분위인가 |
| 잡음이 어떤 모양인가 | 정규인가 두꺼운 꼬리인가 |
| 틀림의 대가가 대칭인가 | 분위 손실이 필요한가 |
| 클래스가 불균형한가 | 가중치를 줄 것인가 |
| 확률이 필요한가 | 보정까지 볼 것인가 |
첫째 줄이 가장 먼저입니다. 227강에서 넷째 줄을 다룹니다.
(2) 클래스 가중치를 줘 봅니다. 양성 비율이 인 자료입니다.
| 양성 가중치 | 예측 양성 비율 | 재현율 | 정밀도 |
|---|---|---|---|
가중치를 키우면 재현율이 에서 으로 오르고 정밀도가 에서 로 내려갑니다.
가중치를 바꾸는 것은 문턱을 옮기는 것과 비슷한 일입니다. 227강에서 둘의 차이를 다룹니다.
(3) 보정이 어떻게 되는지 봅니다.
| 예측 확률 구간 | 가중치 의 실제 비율 | 가중치 의 실제 비율 | 구간 가운데 |
|---|---|---|---|
| 에서 | |||
| 에서 | |||
| 에서 | |||
| 에서 |
가중치 은 예측 확률과 실제 비율이 거의 같습니다. 구간에서 , 구간에서 입니다.
가중치 은 실제보다 훨씬 높게 예측합니다. 라고 한 자리의 실제 비율이 입니다. 보정이 깨졌습니다.
확률이 필요하면 가중치를 쓰고 나서 다시 보정해야 합니다.
이 문제에서 배우는 것. 가중치는 손실을 바꾸므로 최적해가 바뀌고, 그 최적해는 더 이상 참 확률이 아닙니다. 문제 1에서 손실이 곧 분포 가정이라고 했는데, 가중치를 주면 "양성이 실제보다 흔한 세계"의 우도를 최대화하는 셈입니다. 그래서 나온 확률은 그 가상의 세계의 확률이고, 실제 확률로 되돌리려면 보정이 필요합니다. 확률이 아니라 순위만 필요하면 가중치가 순위를 크게 안 바꾸므로 문제가 없으며, 226강의 ROC 곡선이 그 순위만 보는 지표입니다.
바로 확인 5.
확인 5-1. 손실을 고르기 전에 가장 먼저 물어야 할 것을 쓰세요.
답. 무엇을 예측하려는지입니다.
확인 5-2. 검산에서 가중치 과 의 재현율과 정밀도를 쓰세요.
답. 와 , 과 입니다.
확인 5-3. 검산에서 예측 확률 에서 구간의 두 실제 비율을 쓰세요.
답. 와 입니다.
| 가정 | 손실 | 무엇을 추정 |
|---|---|---|
| 정규 | 제곱오차 | 조건부 평균 |
| 라플라스 | 절대오차 | 조건부 중앙값 |
| 비대칭 벌 | 분위 손실 | 조건부 분위수 |
| 베르누이 | 이진 교차엔트로피 | 조건부 확률 |
| 다항 | 소프트맥스 교차엔트로피 | 조건부 확률 벡터 |
| 짝 | 기울기 |
|---|---|
| 시그모이드 + 교차엔트로피 | 예측 오차에 비례 |
| 소프트맥스 + 교차엔트로피 | 예측 오차에 비례 |
| 시그모이드 + 제곱오차 | 양 끝에서 사라짐 |
| 수치 안정 | 어떻게 |
|---|---|
| 이진 손실 | 로 |
| 소프트맥스 | 최댓값을 빼고 |
| 로그 확률 | 로짓에서 바로 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 손실을 취향으로 고릅니다 | 분포 가정입니다 |
| 분류에 제곱오차를 씁니다 | 기울기가 사라집니다 |
| 확률을 먼저 만들고 로그를 취합니다 | 로짓에서 바로 계산합니다 |
| 가중치를 준 확률을 그대로 씁니다 | 보정이 깨집니다 |
| 학습과 평가의 손실이 다릅니다 | 맞춰야 합니다 |
문제 6. 손실을 고르는 것이 무엇을 가정하는 것인지 쓰세요.
답. 잡음의 분포를 가정하는 것입니다.
문제 7. 검산에서 이상점이 섞였을 때 두 손실의 흔들림을 쓰세요.
답. 과 입니다.
문제 8. 검산에서 정답이 이고 확률이 일 때의 손실을 쓰세요.
답. 입니다.
문제 9. 검산에서 로짓 일 때 두 계산의 결과를 쓰세요.
답. 그냥 계산은 무한대이고 안정적 계산은 입니다.
문제 10. 검산에서 로짓 일 때 두 손실의 기울기를 쓰세요.
답. 과 입니다.
문제 11. 소프트맥스에 상수를 더하면 어떻게 되는지 쓰세요.
답. 결과가 안 변하며 그래서 최댓값을 빼고 계산합니다.
문제 12. 검산에서 온도 와 의 엔트로피를 쓰세요.
답. 과 입니다.
문제 13. 검산에서 평활 과 의 가장 큰 확률 평균을 쓰세요.
답. 과 입니다.
문제 14. 제곱오차와 절대오차가 각각 무엇을 추정하는지 쓰세요.
답. 조건부 평균과 조건부 중앙값입니다.
문제 15. 검산에서 두 손실의 최적 상수를 쓰세요.
답. 와 입니다.
문제 16. 검산에서 분위 과 의 최적값을 쓰세요.
답. 과 입니다.
문제 17. 검산에서 가중치 과 의 재현율을 쓰세요.
답. 와 입니다.
문제 18. 검산에서 예측 확률 에서 구간의 두 실제 비율을 쓰세요.
답. 와 입니다.
심화 1. 로지스틱 회귀의 기울기를 유도하세요.
| 단계 | 결과 |
|---|---|
| 곱하면 | |
시그모이드의 미분이 정확히 상쇄됩니다. 그것이 문제 2의 표가 보여 준 것입니다.
190강 문제 1의 IRLS가 이 기울기에서 나옵니다.
심화 2. 소프트맥스 교차엔트로피의 기울기를 유도하세요.
| 무엇 | 뜻 |
|---|---|
| 예측 확률 | |
| 목표 분포 | |
| 차이 | 그대로 기울기 |
이진의 경우가 특수한 경우입니다. 로 두면 문제 2의 식이 나옵니다.
라벨 평활도 만 바꾸므로 기울기 식이 그대로입니다.
야코비 행렬이 입니다. 231강의 행렬미분에서 다시 씁니다.
심화 3. 초점 손실을 정리하세요.
| 무엇이 달라지나 | |
|---|---|
| 보통 교차엔트로피 | |
| 쉬운 표본의 벌이 크게 줄어듦 |
이미 잘 맞히는 표본의 손실을 눌러 어려운 표본에 집중시킵니다.
클래스 불균형에서 가중치의 대안으로 쓰입니다. 가중치는 클래스별로 일정한데 이쪽은 표본별로 다릅니다.
보정은 여전히 깨집니다. 문제 5의 마지막 표와 같은 이유입니다.
심화 4. 손실이 볼록한지 정리하세요.
| 무엇 | 볼록한가 |
|---|---|
| 제곱오차와 선형모형 | 예 |
| 교차엔트로피와 선형 로짓 | 예 |
| 교차엔트로피와 신경망 | 아니오 |
| 정확도 | 미분 불가 |
셋째 줄이 딥러닝의 출발점입니다. 손실 자체는 볼록한데 모형이 비선형이라 전체가 볼록하지 않습니다.
넷째 줄이 왜 정확도를 직접 최적화하지 않는지의 이유입니다. 계단 함수라 기울기가 이거나 없습니다.
교차엔트로피가 정확도의 매끄러운 대리 손실입니다. 대리 손실을 줄이면 대개 정확도가 오르지만 언제나 그런 것은 아닙니다.
심화 5. 손실과 평가지표가 다를 때를 정리하세요.
| 학습 손실 | 평가지표 | 무엇이 어긋나나 |
|---|---|---|
| 교차엔트로피 | 정확도 | 확신의 크기까지 벌줌 |
| 교차엔트로피 | AUC | 순위만 보는데 값을 맞춤 |
| 제곱오차 | 절대오차 | 이상점의 무게가 다름 |
| 어떤 손실이든 | 사업 지표 | 대가가 비대칭 |
넷째 줄이 실무에서 가장 큽니다. 품절과 재고의 비용이 다르면 대칭 손실이 잘못된 답을 냅니다.
대응은 손실을 사업 지표에 맞추는 것이며, 그것이 문제 4의 분위 손실입니다.
직접 못 맞추면 문턱을 조정합니다. 226강에서 다룹니다.
심화 6. 01단원을 정리하세요.
| 강의 | 무엇을 세웠나 |
|---|---|
| 정보의 양을 재는 자 | |
| 두 변수의 관계 | |
| 두 분포의 어긋남 | |
| 어긋남을 손실로 |
205강부터 그 손실을 실제로 최소화합니다. 경험적 위험 최소화라는 틀을 세우고, 선형회귀와 로지스틱 회귀를 처음부터 유도합니다.
이 단원이 준 것은 "무엇을 최소화할 것인가"이고, 02단원이 주는 것은 "어떻게 최소화할 것인가"입니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 음의 로그우도 | NLL | 손실의 일반형입니다 |
| 이진 교차엔트로피 | BCE | 베르누이 가정의 손실입니다 |
| 로짓 | logit | 시그모이드 이전의 값입니다 |
| 소프트맥스 | softmax | 로짓을 확률로 바꿉니다 |
| 온도 | temperature | 로짓을 나누는 값입니다 |
| 라벨 평활 | label smoothing | 목표를 보다 작게 둡니다 |
| 분위 손실 | pinball loss | 한쪽을 로 벌줍니다 |
| 후버 손실 | Huber loss | 가운데는 제곱 밖은 절댓값입니다 |
| 초점 손실 | focal loss | 쉬운 표본의 벌을 줄입니다 |
| 보정 | calibration | 예측 확률과 실제 비율이 맞는지입니다 |
| 대리 손실 | surrogate loss | 진짜 지표 대신 최적화하는 손실입니다 |
여기서 01단원 정보의 양을 마칩니다. 강부터 강까지가 하나의 줄기였습니다.
다음은 205강 손실함수와 경험적 위험 최소화입니다. 이 단원이 무엇을 최소화할 것인가를 답했습니다. 02단원은 어떻게 최소화할 것인가를 답하며, 선형회귀와 로지스틱 회귀와 소프트맥스 회귀를 처음부터 유도해 학습이라는 것이 최적화 문제 하나임을 보입니다.
import numpy as np
rng = np.random.default_rng(20261011)
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 sig(z):
return 1.0 / (1.0 + np.exp(-np.clip(z, -500, 500)))
def softmax(z):
z = z - z.max(axis=-1, keepdims=True)
e = np.exp(z)
return e / e.sum(axis=-1, keepdims=True)
# --- 문제 1: 분포 가정이 손실을 정합니다 -------------------------------
print(" 203강 문제 3 에서 최대우도가 KL 을 줄이는 것과 같다고 했습니다")
print(" 그러면 손실함수는 고르는 것이 아니라 유도되는 것입니다")
print(" %s %s %s"
% (pw("무엇을 가정하나", 24), rw("음의 로그우도", 30), rw("이름", 22)))
for a, b, c in [("정규 분산 고정", "제곱오차의 절반 더하기 상수", "제곱오차"),
("베르누이", "y log p 더하기 (1-y) log(1-p) 의 음수", "이진 교차엔트로피"),
("다항", "정답 자리 확률의 음의 로그", "소프트맥스 교차엔트로피"),
("라플라스", "절댓값 오차 더하기 상수", "절대오차"),
("포아송", "람다 빼기 y log 람다", "포아송 손실")]:
print(" %s %s %s" % (pw(a, 24), rw(b, 30), rw(c, 22)))
print(" 손실을 고르는 것이 곧 잡음의 분포를 가정하는 것입니다")
print(" 정규 가정에서 제곱오차가 나오는지 확인합니다")
n1 = 200000
xs = rng.normal(0, 1, n1)
ys = 2.0 + 1.5 * xs + rng.normal(0, 1.0, n1)
print(" 참 계수는 2.0 과 1.5 이고 잡음은 표준정규입니다")
print(" %s %s %s %s"
% (pw("무엇으로 맞추나", 26), rw("절편", 12), rw("기울기", 12),
rw("참값과의 거리", 18)))
A = np.stack([np.ones(n1), xs], axis=1)
b_sq, *_ = np.linalg.lstsq(A, ys, rcond=None)
grid_a = np.linspace(1.9, 2.1, 81)
grid_b = np.linspace(1.4, 1.6, 81)
best = None
for a_ in grid_a:
for b_ in grid_b:
ll = float(np.sum(-0.5 * (ys - a_ - b_ * xs) ** 2))
if best is None or ll > best[0]:
best = (ll, a_, b_)
for nm, aa, bb in [("제곱오차 최소화", b_sq[0], b_sq[1]),
("정규 로그우도 최대화", best[1], best[2])]:
print(" %s %12.6f %12.6f %18.6f"
% (pw(nm, 26), aa, bb,
float(np.hypot(aa - 2.0, bb - 1.5))))
print(" 둘이 같은 답을 냅니다. 제곱오차가 정규 가정의 음의 로그우도이기 때문입니다")
print(" 분산이 고정이면 분산 항이 상수라 최소화에 영향을 안 줍니다")
print(" 잡음이 정규가 아니면 어떻게 되는지 봅니다")
print(" %s %s %s %s"
% (pw("잡음의 분포", 22), rw("제곱오차의 기울기", 20),
rw("절대오차의 기울기", 20), rw("어느 쪽이 참에 가까운가", 26)))
S = 400
for nm, gen in [("정규", lambda n: rng.normal(0, 1, n)),
("라플라스", lambda n: rng.laplace(0, 1 / np.sqrt(2), n)),
("이상점 섞임", lambda n: np.where(rng.random(n) < 0.02,
rng.normal(0, 12, n),
rng.normal(0, 1, n)))]:
e1, e2 = [], []
for _ in range(S):
n = 400
x = rng.normal(0, 1, n)
y = 1.5 * x + gen(n)
b1 = float(np.sum(x * y) / np.sum(x * x))
lo, hi = -1.0, 4.0
for _ in range(60):
m1 = lo + (hi - lo) / 3
m2 = hi - (hi - lo) / 3
if np.sum(np.abs(y - m1 * x)) < np.sum(np.abs(y - m2 * x)):
hi = m2
else:
lo = m1
b2 = (lo + hi) / 2
e1.append(b1)
e2.append(b2)
s1 = float(np.std(e1, ddof=1))
s2 = float(np.std(e2, ddof=1))
print(" %s %20.6f %20.6f %s"
% (pw(nm, 22), s1, s2,
rw("제곱오차" if s1 < s2 else "절대오차", 26)))
print(" 정규 잡음에서는 제곱오차가 흔들림이 작습니다")
print(" 라플라스와 이상점이 섞이면 절대오차가 낫습니다")
print(" 손실을 잘못 고르면 계수는 맞아도 흔들림이 커집니다")
# --- 문제 2: 이진 분류 --------------------------------------------------
print(" 베르누이 가정에서 이진 교차엔트로피가 나옵니다")
print(" 확률 p 로 예측하고 정답이 y 일 때의 손실을 봅니다")
print(" %s %s %s %s"
% (pw("정답", 10), rw("예측 확률", 14), rw("손실", 14), rw("무엇을 뜻하나", 22)))
for y, p in [(1, 0.99), (1, 0.5), (1, 0.1), (1, 0.01), (0, 0.99)]:
L = -(y * np.log(p) + (1 - y) * np.log(1 - p))
print(" %s %14.2f %14.6f %s"
% (pw("%d" % y, 10), p, L,
rw("잘 맞힘" if L < 0.1 else ("보통" if L < 1.0 else "크게 틀림"), 22)))
print(" 확률이 0 에 가까운데 정답이면 손실이 끝없이 커집니다")
print(" 201강 문제 1 의 정보량이 그대로 손실이 된 것입니다")
print(" 로짓으로 적으면 안정적입니다")
print(" %s %s %s %s"
% (pw("로짓", 12), rw("그냥 계산", 20), rw("안정적 계산", 20),
rw("차이", 14)))
for z in [-800.0, -50.0, 0.0, 50.0, 800.0]:
with np.errstate(over="ignore"):
p = 1.0 / (1.0 + np.exp(-z))
naive = -np.log(p) if p > 0 else float("inf")
stable = np.logaddexp(0.0, -z) + 0.0
print(" %s %20s %20.6f %s"
% (pw("%.1f" % z, 12),
rw("무한대" if np.isinf(naive) else "%.6f" % (naive + 0.0), 20),
stable,
rw("깨짐" if np.isinf(naive) else "%.6f" % (naive - stable + 0.0), 14)))
print(" 로짓이 -800 이면 확률이 0 으로 반올림되어 그냥 계산이 무한이 됩니다")
print(" log(1+exp(-z)) 로 적으면 800.000000 이 그대로 나옵니다")
print(" -50 에서는 아직 안 깨집니다. 경계가 대략 -745 근처입니다")
print(" 158강 문제 1 의 부동소수점 문제가 여기서 나타납니다")
print(" 기울기가 왜 깔끔한지 봅니다")
print(" %s %s %s"
% (pw("무엇", 26), rw("기울기", 26), rw("무엇이 좋은가", 24)))
for a, b, c in [("교차엔트로피와 시그모이드", "(예측 확률 빼기 정답) 곱하기 x",
"예측 오차에 비례"),
("제곱오차와 시그모이드", "위에 시그모이드 미분이 곱해짐",
"많이 틀릴 때 기울기가 사라짐")]:
print(" %s %s %s" % (pw(a, 26), rw(b, 26), rw(c, 24)))
print(" 두 손실의 기울기를 크게 틀린 자리에서 견줍니다")
print(" %s %s %s %s"
% (pw("로짓", 12), rw("정답", 10), rw("교차엔트로피 기울기", 22),
rw("제곱오차 기울기", 20)))
for z, y in [(-6.0, 1), (-3.0, 1), (0.0, 1), (3.0, 1), (6.0, 1)]:
p = sig(z)
g_ce = p - y
g_sq = 2.0 * (p - y) * p * (1 - p)
print(" %s %10d %22.6f %20.6f"
% (pw("%.1f" % z, 12), y, g_ce, g_sq))
print(" 로짓 -6 에서 교차엔트로피는 -0.997527 인데 제곱오차는 -0.004921 입니다")
print(" 크게 틀렸는데 제곱오차는 거의 안 배웁니다. 200 배 넘게 차이 납니다")
print(" 그것이 분류에 제곱오차를 안 쓰는 이유입니다")
# --- 문제 3: 다중 분류 ---------------------------------------------------
print(" 분류가 여러 갈래면 소프트맥스를 씁니다")
print(" 로짓에 상수를 더해도 확률이 안 변합니다. 확인해 봅니다")
z0 = np.array([2.0, 1.0, -1.0, 0.5])
print(" %s %s"
% (pw("무엇을 더하나", 20), rw("소프트맥스 결과", 46)))
for c in [0.0, 10.0, -100.0]:
q = softmax(z0 + c)
print(" %s %s"
% (pw("%.1f" % c, 20),
rw(" ".join("%.6f" % v for v in q), 46)))
print(" 값이 완전히 같습니다. 그래서 최댓값을 빼고 계산합니다")
print(" 빼지 않으면 exp 가 넘칩니다. 158강 문제 1 과 같습니다")
print(" 온도를 바꾸면 확률이 어떻게 되는지 봅니다")
print(" %s %s %s %s"
% (pw("온도", 10), rw("가장 큰 확률", 16), rw("엔트로피 비트", 18),
rw("무엇에 가까운가", 20)))
for T in [0.2, 0.5, 1.0, 3.0, 20.0]:
q = softmax(z0 / T)
h = float(-(q * np.log2(q)).sum())
print(" %s %16.6f %18.6f %s"
% (pw("%.1f" % T, 10), float(q.max()), h,
rw("한 점" if T < 0.6 else ("균등" if T > 2 else "가운데"), 20)))
print(" 온도가 낮으면 한 점에 몰리고 높으면 균등해집니다")
print(" 온도 20 에서 엔트로피가 log2 4 인 2 에 가까워집니다")
print(" 지식 증류에서 온도를 올려 교사의 부드러운 확률을 배웁니다")
print(" 라벨을 평활하면 최적 로짓이 유한해집니다")
print(" %s %s %s %s"
% (pw("평활 정도", 14), rw("목표 확률", 14), rw("최적 로짓 차이", 20),
rw("판정", 14)))
K = 4
for eps in [0.0, 0.01, 0.1, 0.3]:
t = eps / K
tgt = 1.0 - eps + t
if tgt >= 1.0:
print(" %s %14.6f %20s %s"
% (pw("%.2f" % eps, 14), tgt, rw("무한대", 20), rw("발산", 14)))
else:
gap = np.log(tgt * (K - 1) / (1.0 - tgt))
print(" %s %14.6f %20.6f %s"
% (pw("%.2f" % eps, 14), tgt, gap, rw("유한", 14)))
print(" 평활을 안 하면 목표가 1 이라 로짓 차이가 무한으로 갑니다")
print(" 조금만 평활해도 유한한 자리에서 멈춥니다. 203강 심화 4 입니다")
print(" 평활이 실제로 무엇을 바꾸는지 재 봅니다")
n3 = 4000
K3 = 5
Xt = rng.normal(0, 1, (n3, 6))
W = rng.normal(0, 1, (6, K3))
yt = np.array([rng.choice(K3, p=q) for q in softmax(Xt @ W * 1.5)])
Xv = rng.normal(0, 1, (4000, 6))
yv = np.array([rng.choice(K3, p=q) for q in softmax(Xv @ W * 1.5)])
def train(eps, steps=400, lr=0.5):
Wh = np.zeros((6, K3))
T = np.full((n3, K3), eps / K3)
T[np.arange(n3), yt] += 1.0 - eps
for _ in range(steps):
Q = softmax(Xt @ Wh)
Wh -= lr * (Xt.T @ (Q - T)) / n3
return Wh
print(" %s %s %s %s"
% (pw("평활 정도", 14), rw("검증 정확도", 16), rw("검증 교차엔트로피", 22),
rw("가장 큰 확률의 평균", 22)))
for eps in [0.0, 0.05, 0.2]:
Wh = train(eps)
Q = softmax(Xv @ Wh)
acc = float((Q.argmax(axis=1) == yv).mean())
ce = float(-np.mean(np.log(np.clip(Q[np.arange(len(yv)), yv], 1e-12, 1))))
print(" %s %16.6f %22.6f %22.6f"
% (pw("%.2f" % eps, 14), acc, ce, float(Q.max(axis=1).mean())))
print(" 평활하면 가장 큰 확률의 평균이 내려갑니다. 확신이 줄어든 것입니다")
print(" 정확도는 거의 안 변하고 교차엔트로피는 조금 나빠집니다")
print(" 확신을 줄이는 것이 목표일 때만 씁니다. 226강에서 다시 봅니다")
# --- 문제 4: 회귀 손실 ---------------------------------------------------
print(" 회귀에서도 가정이 손실을 정합니다")
print(" %s %s %s"
% (pw("손실", 20), rw("무엇을 추정하나", 22), rw("어떤 가정", 24)))
for a, b, c in [("제곱오차", "조건부 평균", "정규 잡음"),
("절대오차", "조건부 중앙값", "라플라스 잡음"),
("분위 손실", "조건부 분위수", "비대칭 벌"),
("후버 손실", "가운데 어디쯤", "가운데는 정규 밖은 라플라스")]:
print(" %s %s %s" % (pw(a, 20), rw(b, 22), rw(c, 24)))
print(" 손실이 다르면 같은 자료에서 다른 값을 추정합니다")
print(" 치우친 자료에서 확인합니다")
n4 = 400000
y4 = np.exp(rng.normal(0, 1.0, n4))
print(" 로그정규 자료입니다. 평균과 중앙값이 크게 다릅니다")
print(" %s %s %s %s"
% (pw("어떤 손실을 최소로", 24), rw("최적 상수", 16), rw("이론값", 16),
rw("무엇인가", 18)))
mean4 = float(y4.mean())
med4 = float(np.median(y4))
lo, hi = 0.0, 10.0
for _ in range(80):
m1 = lo + (hi - lo) / 3
m2 = hi - (hi - lo) / 3
if np.sum(np.abs(y4 - m1)) < np.sum(np.abs(y4 - m2)):
hi = m2
else:
lo = m1
abs_opt = (lo + hi) / 2
print(" %s %16.6f %16.6f %s"
% (pw("제곱오차", 24), mean4, float(np.exp(0.5)), rw("조건부 평균", 18)))
print(" %s %16.6f %16.6f %s"
% (pw("절대오차", 24), abs_opt, 1.0, rw("조건부 중앙값", 18)))
print(" 제곱오차는 1.6487 근처이고 절대오차는 1.0 근처입니다")
print(" 같은 자료인데 무엇을 최소로 하느냐가 답을 바꿉니다")
print(" 분위 손실로 여러 분위를 잡아 봅니다")
print(" %s %s %s %s"
% (pw("분위", 10), rw("분위 손실의 최적값", 22), rw("실제 분위수", 18),
rw("차이", 12)))
for tau in [0.1, 0.5, 0.9, 0.99]:
lo, hi = 0.0, 30.0
for _ in range(80):
m1 = lo + (hi - lo) / 3
m2 = hi - (hi - lo) / 3
def ql(m):
r = y4 - m
return float(np.sum(np.where(r >= 0, tau * r, (tau - 1) * r)))
if ql(m1) < ql(m2):
hi = m2
else:
lo = m1
est = (lo + hi) / 2
true = float(np.quantile(y4, tau))
print(" %s %22.6f %18.6f %12.6f"
% (pw("%.2f" % tau, 10), est, true, est - true))
print(" 분위 손실의 최적값이 그 분위수와 같습니다")
print(" 199강 심화 2 의 분위 예측이 이 손실로 만들어집니다")
print(" 한쪽을 tau 로 다른 쪽을 1 빼기 tau 로 벌주면 됩니다")
# --- 문제 5: 실무에서 손실 고르기 ---------------------------------------
print(" 실무에서 손실을 고르는 기준을 정리합니다")
print(" %s %s"
% (pw("무엇을 묻나", 26), rw("무엇이 정해지나", 30)))
for a, b in [("무엇을 예측하나", "평균인가 중앙값인가 분위인가"),
("잡음이 어떤 모양인가", "정규인가 두꺼운 꼬리인가"),
("틀림의 대가가 대칭인가", "분위 손실이 필요한가"),
("클래스가 불균형한가", "가중치를 줄 것인가"),
("확률이 필요한가", "보정까지 볼 것인가")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 첫째 줄이 가장 먼저입니다. 227강에서 넷째 줄을 다룹니다")
print(" 클래스가 불균형할 때 가중치를 줘 봅니다")
n5 = 40000
x5 = rng.normal(0, 1, (n5, 3))
w5 = np.array([1.5, -1.0, 0.7])
pr = sig(x5 @ w5 - 3.0)
y5 = (rng.random(n5) < pr).astype(float)
xv = rng.normal(0, 1, (20000, 3))
pv = sig(xv @ w5 - 3.0)
yv5 = (rng.random(20000) < pv).astype(float)
print(" 양성 비율이 %.4f 인 자료입니다" % float(y5.mean()))
def train_lr(weight_pos, steps=600, lr=0.5):
b = np.zeros(4)
A = np.concatenate([np.ones((n5, 1)), x5], axis=1)
wts = np.where(y5 == 1, weight_pos, 1.0)
for _ in range(steps):
q = sig(A @ b)
b -= lr * (A.T @ (wts * (q - y5))) / wts.sum()
return b
Av = np.concatenate([np.ones((20000, 1)), xv], axis=1)
print(" %s %s %s %s"
% (pw("양성 가중치", 14), rw("예측 양성 비율", 18), rw("재현율", 12),
rw("정밀도", 12)))
for wp in [1.0, 5.0, 20.0]:
b = train_lr(wp)
q = sig(Av @ b)
pred = (q > 0.5).astype(float)
tp = float(((pred == 1) & (yv5 == 1)).sum())
rec = tp / max(float((yv5 == 1).sum()), 1.0)
prec = tp / max(float((pred == 1).sum()), 1.0)
print(" %s %18.6f %12.6f %12.6f"
% (pw("%.1f" % wp, 14), float(pred.mean()), rec, prec))
print(" 가중치를 키우면 재현율이 오르고 정밀도가 내려갑니다")
print(" 가중치를 바꾸는 것은 문턱을 옮기는 것과 비슷한 일입니다")
print(" 227강에서 둘의 차이를 다룹니다")
print(" 확률이 잘 보정됐는지 봅니다")
b1 = train_lr(1.0)
b2 = train_lr(20.0)
print(" %s %s %s %s"
% (pw("예측 확률 구간", 20), rw("가중치 1 의 실제 비율", 24),
rw("가중치 20 의 실제 비율", 24), rw("구간 가운데", 14)))
q1 = sig(Av @ b1)
q2 = sig(Av @ b2)
for lo_, hi_ in [(0.0, 0.1), (0.1, 0.3), (0.3, 0.6), (0.6, 1.0)]:
m1 = (q1 >= lo_) & (q1 < hi_)
m2 = (q2 >= lo_) & (q2 < hi_)
r1 = float(yv5[m1].mean()) if m1.sum() > 20 else float("nan")
r2 = float(yv5[m2].mean()) if m2.sum() > 20 else float("nan")
print(" %s %24.6f %24.6f %14.2f"
% (pw("%.1f 에서 %.1f" % (lo_, hi_), 20), r1, r2, (lo_ + hi_) / 2))
print(" 가중치 1 은 예측 확률과 실제 비율이 거의 같습니다")
print(" 가중치 20 은 실제보다 훨씬 높게 예측합니다. 보정이 깨졌습니다")
print(" 확률이 필요하면 가중치를 쓰고 나서 다시 보정해야 합니다")
print(" 204강으로 01 단원을 마칩니다. 205강부터 학습을 최적화로 적습니다")
# 203강 문제 3 에서 최대우도가 KL 을 줄이는 것과 같다고 했습니다
# 그러면 손실함수는 고르는 것이 아니라 유도되는 것입니다
# 무엇을 가정하나 음의 로그우도 이름
# 정규 분산 고정 제곱오차의 절반 더하기 상수 제곱오차
# 베르누이 y log p 더하기 (1-y) log(1-p) 의 음수 이진 교차엔트로피
# 다항 정답 자리 확률의 음의 로그 소프트맥스 교차엔트로피
# 라플라스 절댓값 오차 더하기 상수 절대오차
# 포아송 람다 빼기 y log 람다 포아송 손실
# 손실을 고르는 것이 곧 잡음의 분포를 가정하는 것입니다
# 정규 가정에서 제곱오차가 나오는지 확인합니다
# 참 계수는 2.0 과 1.5 이고 잡음은 표준정규입니다
# 무엇으로 맞추나 절편 기울기 참값과의 거리
# 제곱오차 최소화 1.999357 1.497512 0.002570
# 정규 로그우도 최대화 2.000000 1.497500 0.002500
# 둘이 같은 답을 냅니다. 제곱오차가 정규 가정의 음의 로그우도이기 때문입니다
# 분산이 고정이면 분산 항이 상수라 최소화에 영향을 안 줍니다
# 잡음이 정규가 아니면 어떻게 되는지 봅니다
# 잡음의 분포 제곱오차의 기울기 절대오차의 기울기 어느 쪽이 참에 가까운가
# 정규 0.049303 0.061859 제곱오차
# 라플라스 0.048961 0.037900 절대오차
# 이상점 섞임 0.099937 0.058787 절대오차
# 정규 잡음에서는 제곱오차가 흔들림이 작습니다
# 라플라스와 이상점이 섞이면 절대오차가 낫습니다
# 손실을 잘못 고르면 계수는 맞아도 흔들림이 커집니다
# 베르누이 가정에서 이진 교차엔트로피가 나옵니다
# 확률 p 로 예측하고 정답이 y 일 때의 손실을 봅니다
# 정답 예측 확률 손실 무엇을 뜻하나
# 1 0.99 0.010050 잘 맞힘
# 1 0.50 0.693147 보통
# 1 0.10 2.302585 크게 틀림
# 1 0.01 4.605170 크게 틀림
# 0 0.99 4.605170 크게 틀림
# 확률이 0 에 가까운데 정답이면 손실이 끝없이 커집니다
# 201강 문제 1 의 정보량이 그대로 손실이 된 것입니다
# 로짓으로 적으면 안정적입니다
# 로짓 그냥 계산 안정적 계산 차이
# -800.0 무한대 800.000000 깨짐
# -50.0 50.000000 50.000000 0.000000
# 0.0 0.693147 0.693147 0.000000
# 50.0 0.000000 0.000000 -0.000000
# 800.0 0.000000 0.000000 0.000000
# 로짓이 -800 이면 확률이 0 으로 반올림되어 그냥 계산이 무한이 됩니다
# log(1+exp(-z)) 로 적으면 800.000000 이 그대로 나옵니다
# -50 에서는 아직 안 깨집니다. 경계가 대략 -745 근처입니다
# 158강 문제 1 의 부동소수점 문제가 여기서 나타납니다
# 기울기가 왜 깔끔한지 봅니다
# 무엇 기울기 무엇이 좋은가
# 교차엔트로피와 시그모이드 (예측 확률 빼기 정답) 곱하기 x 예측 오차에 비례
# 제곱오차와 시그모이드 위에 시그모이드 미분이 곱해짐 많이 틀릴 때 기울기가 사라짐
# 두 손실의 기울기를 크게 틀린 자리에서 견줍니다
# 로짓 정답 교차엔트로피 기울기 제곱오차 기울기
# -6.0 1 -0.997527 -0.004921
# -3.0 1 -0.952574 -0.086068
# 0.0 1 -0.500000 -0.250000
# 3.0 1 -0.047426 -0.004285
# 6.0 1 -0.002473 -0.000012
# 로짓 -6 에서 교차엔트로피는 -0.997527 인데 제곱오차는 -0.004921 입니다
# 크게 틀렸는데 제곱오차는 거의 안 배웁니다. 200 배 넘게 차이 납니다
# 그것이 분류에 제곱오차를 안 쓰는 이유입니다
# 분류가 여러 갈래면 소프트맥스를 씁니다
# 로짓에 상수를 더해도 확률이 안 변합니다. 확인해 봅니다
# 무엇을 더하나 소프트맥스 결과
# 0.0 0.609460 0.224208 0.030343 0.135989
# 10.0 0.609460 0.224208 0.030343 0.135989
# -100.0 0.609460 0.224208 0.030343 0.135989
# 값이 완전히 같습니다. 그래서 최댓값을 빼고 계산합니다
# 빼지 않으면 exp 가 넘칩니다. 158강 문제 1 과 같습니다
# 온도를 바꾸면 확률이 어떻게 되는지 봅니다
# 온도 가장 큰 확률 엔트로피 비트 무엇에 가까운가
# 0.2 0.992761 0.064681 한 점
# 0.5 0.842034 0.776371 한 점
# 1.0 0.609460 1.463474 가운데
# 3.0 0.371617 1.915983 균등
# 20.0 0.267402 1.997913 균등
# 온도가 낮으면 한 점에 몰리고 높으면 균등해집니다
# 온도 20 에서 엔트로피가 log2 4 인 2 에 가까워집니다
# 지식 증류에서 온도를 올려 교사의 부드러운 확률을 배웁니다
# 라벨을 평활하면 최적 로짓이 유한해집니다
# 평활 정도 목표 확률 최적 로짓 차이 판정
# 0.00 1.000000 무한대 발산
# 0.01 0.992500 5.983936 유한
# 0.10 0.925000 3.610918 유한
# 0.30 0.775000 2.335375 유한
# 평활을 안 하면 목표가 1 이라 로짓 차이가 무한으로 갑니다
# 조금만 평활해도 유한한 자리에서 멈춥니다. 203강 심화 4 입니다
# 평활이 실제로 무엇을 바꾸는지 재 봅니다
# 평활 정도 검증 정확도 검증 교차엔트로피 가장 큰 확률의 평균
# 0.00 0.747500 0.623150 0.752096
# 0.05 0.746250 0.639749 0.697520
# 0.20 0.744000 0.759759 0.567140
# 평활하면 가장 큰 확률의 평균이 내려갑니다. 확신이 줄어든 것입니다
# 정확도는 거의 안 변하고 교차엔트로피는 조금 나빠집니다
# 확신을 줄이는 것이 목표일 때만 씁니다. 226강에서 다시 봅니다
# 회귀에서도 가정이 손실을 정합니다
# 손실 무엇을 추정하나 어떤 가정
# 제곱오차 조건부 평균 정규 잡음
# 절대오차 조건부 중앙값 라플라스 잡음
# 분위 손실 조건부 분위수 비대칭 벌
# 후버 손실 가운데 어디쯤 가운데는 정규 밖은 라플라스
# 손실이 다르면 같은 자료에서 다른 값을 추정합니다
# 치우친 자료에서 확인합니다
# 로그정규 자료입니다. 평균과 중앙값이 크게 다릅니다
# 어떤 손실을 최소로 최적 상수 이론값 무엇인가
# 제곱오차 1.646292 1.648721 조건부 평균
# 절대오차 0.997393 1.000000 조건부 중앙값
# 제곱오차는 1.6487 근처이고 절대오차는 1.0 근처입니다
# 같은 자료인데 무엇을 최소로 하느냐가 답을 바꿉니다
# 분위 손실로 여러 분위를 잡아 봅니다
# 분위 분위 손실의 최적값 실제 분위수 차이
# 0.10 0.276490 0.276490 0.000000
# 0.50 0.997393 0.997392 0.000001
# 0.90 3.604728 3.604714 0.000014
# 0.99 10.197042 10.196388 0.000655
# 분위 손실의 최적값이 그 분위수와 같습니다
# 199강 심화 2 의 분위 예측이 이 손실로 만들어집니다
# 한쪽을 tau 로 다른 쪽을 1 빼기 tau 로 벌주면 됩니다
# 실무에서 손실을 고르는 기준을 정리합니다
# 무엇을 묻나 무엇이 정해지나
# 무엇을 예측하나 평균인가 중앙값인가 분위인가
# 잡음이 어떤 모양인가 정규인가 두꺼운 꼬리인가
# 틀림의 대가가 대칭인가 분위 손실이 필요한가
# 클래스가 불균형한가 가중치를 줄 것인가
# 확률이 필요한가 보정까지 볼 것인가
# 첫째 줄이 가장 먼저입니다. 227강에서 넷째 줄을 다룹니다
# 클래스가 불균형할 때 가중치를 줘 봅니다
# 양성 비율이 0.1289 인 자료입니다
# 양성 가중치 예측 양성 비율 재현율 정밀도
# 1.0 0.060150 0.327782 0.670823
# 5.0 0.240450 0.746141 0.381992
# 20.0 0.510100 0.939886 0.226818
# 가중치를 키우면 재현율이 오르고 정밀도가 내려갑니다
# 가중치를 바꾸는 것은 문턱을 옮기는 것과 비슷한 일입니다
# 227강에서 둘의 차이를 다룹니다
# 확률이 잘 보정됐는지 봅니다
# 예측 확률 구간 가중치 1 의 실제 비율 가중치 20 의 실제 비율 구간 가운데
# 0.0 에서 0.1 0.028764 0.003908 0.05
# 0.1 에서 0.3 0.173230 0.011744 0.20
# 0.3 에서 0.6 0.410742 0.035206 0.45
# 0.6 에서 1.0 0.743119 0.261622 0.80
# 가중치 1 은 예측 확률과 실제 비율이 거의 같습니다
# 가중치 20 은 실제보다 훨씬 높게 예측합니다. 보정이 깨졌습니다
# 확률이 필요하면 가중치를 쓰고 나서 다시 보정해야 합니다
# 204강으로 01 단원을 마칩니다. 205강부터 학습을 최적화로 적습니다