204강에서 손실함수를 유도했습니다. 이제 그것을 최소로 만듭니다.
줄이고 싶은 것은 참 분포 전체에 대한 손실의 평균인데, 우리에게는 표본밖에 없습니다. 그래서 가진 표본에 대한 평균을 대신 줄입니다.
이것을 경험적 위험 최소화라 하고, 기계학습의 거의 모든 알고리즘이 이 틀 안에 있습니다.
이 강의는 그 틀을 세우고, 최소화가 늘 답은 아니라는 것까지 봅니다.
문제. 두 위험을 구분합니다.
(1) 네 가지 위험을 정리하세요.
(2) 둘이 얼마나 다른지 재세요.
(3) 학습이 무엇을 고르는 일인지 쓰세요.
생각의 실마리. "잘 맞는다"는 말이 어느 자료에 대해인지가 전부입니다.
풀이. (1) 정리합니다.
| 무엇 | 무엇에 대한 평균 | 잴 수 있는가 |
|---|---|---|
| 참 위험 | 참 분포 전체 | 아니오 |
| 경험적 위험 | 가진 표본 | 예 |
| 검증 위험 | 떼어 둔 표본 | 예 |
| 시험 위험 | 한 번만 쓰는 표본 | 예 |
첫째 줄이 목표이고 둘째 줄이 그것을 대신합니다. 둘 사이의 차이를 다루는 것이 03단원입니다.
(2) 둘이 얼마나 다른지 잽니다. 참 분포를 만 개로 대신하고 작은 표본으로 맞춥니다.
| 표본 크기 | 경험적 위험 | 참 위험 | 차이 |
|---|---|---|---|
한 번이 아니라 여러 번 뽑아 평균을 냈습니다. 한 번만 보면 흔들립니다.
표본 에 계수 개면 경험적 위험이 인데 참 위험은 입니다. 거의 완벽히 맞았는데 배운 것이 아닙니다.
표본이 늘면 둘이 붙습니다. 에서 차이가 이며, 이것이 학습이 되는 이유입니다.
(3) 학습이 무엇을 고르는 일인지 씁니다.
| 무엇을 고르나 | 무엇으로 | 어디서 |
|---|---|---|
| 가설 집합 | 어떤 함수를 후보로 둘지 | 모형 설계 |
| 손실함수 | 무엇을 벌줄지 | 강 |
| 최적화 방법 | 어떻게 찾을지 | 강 이후 |
| 정규화 | 얼마나 단순하게 둘지 | 강 |
학습 알고리즘이란 이 넷을 정한 것입니다. 그 이상도 이하도 아닙니다.
이 문제에서 배우는 것. 경험적 위험이 참 위험보다 작게 나오는 것이 우연이 아니라 구조입니다. 같은 표본으로 계수를 고르고 그 표본으로 점수를 매기므로, 고르는 행위 자체가 점수를 낙관하게 만듭니다. 189강 문제 3의 선택 후 추론과 정확히 같은 구조이고, 203강 문제 3에서 교차엔트로피가 참값보다 작게 나온 것도 이것입니다. 그래서 학습에 쓴 자료로 성능을 보고하는 것은 어떤 경우에도 안 됩니다.
바로 확인 1.
확인 1-1. 참 위험과 경험적 위험의 차이를 쓰세요.
답. 참 분포 전체에 대한 평균과 가진 표본에 대한 평균입니다.
확인 1-2. 검산에서 표본 와 의 두 위험을 쓰세요.
답. 과 , 과 입니다.
확인 1-3. 학습 알고리즘이 정하는 넷을 쓰세요.
답. 가설 집합, 손실함수, 최적화 방법, 정규화입니다.
문제. 최적화의 난이도를 봅니다.
(1) 어떤 문제가 쉬운지 정리하세요.
(2) 시작점을 바꿔 보세요.
(3) 볼록하면 무엇이 보장되는지 쓰세요.
생각의 실마리. "최소로 만든다"는 말이 언제나 가능한 것은 아닙니다.
풀이. (1) 정리합니다.
| 무엇 | 볼록한가 | 국소 최소가 전역인가 | 어디서 |
|---|---|---|---|
| 제곱오차와 선형모형 | 예 | 예 | 강 |
| 교차엔트로피와 선형 로짓 | 예 | 예 | 강 |
| 제곱오차와 시그모이드 | 아니오 | 아니오 | 강 문제 |
| 교차엔트로피와 신경망 | 아니오 | 아니오 | S |
앞 둘은 한 번 내려가면 끝입니다. 뒤 둘은 어디서 시작하느냐가 남습니다.
(2) 시작점을 바꿔 봅니다. 참 계수는 과 입니다.
| 손실 | 시작점 | 찾은 기울기 | 찾은 절편 | 참값과의 거리 |
|---|---|---|---|---|
| 교차엔트로피 | 에서 | |||
| 교차엔트로피 | 멀리서 | |||
| 제곱오차 | 에서 | |||
| 제곱오차 | 멀리서 |
교차엔트로피는 두 시작점에서 소수점 여섯 자리까지 같은 자리에 옵니다.
제곱오차도 에서 시작하면 잘 찾습니다. 오히려 로 조금 더 가깝습니다.
그런데 멀리서 시작하면 만큼 떨어진 곳에 갇힙니다. 기울기가 사라졌기 때문입니다.
정확도의 문제가 아니라 어디서 시작하느냐에 걸린다는 것이 요점입니다. 204강 문제 2의 표가 여기서 학습 실패로 나타납니다.
(3) 볼록하면 무엇이 보장되는지 씁니다.
| 성질 | 무엇을 뜻하나 |
|---|---|
| 국소 최소가 전역 최소 | 한 번 내려가면 끝입니다 |
| 기울기 이면 최적 | 멈추면 다 온 것입니다 |
| 두 해의 평균도 해 | 최적해 집합이 볼록합니다 |
| 강볼록이면 해가 하나 | 정규화가 그것을 만듭니다 |
마지막 줄이 211강에서 다시 나옵니다. 벌점이 볼록성을 강하게 만듭니다.
이 문제에서 배우는 것. 딥러닝이 비볼록인데도 되는 것이 이 강의의 시점에서는 설명되지 않습니다. 위 표의 넷째 줄이 그것이고, 실제로 초기값과 학습률에 따라 다른 자리에 도착합니다. 그런데 큰 신경망에서는 도착한 자리들이 성능이 비슷하다는 경험이 쌓여 있고, 그 이유는 아직 완전히 밝혀지지 않았습니다. 그래서 S10은 "전역 최소를 찾는다"는 목표를 포기하고 안정적으로 좋은 자리에 도착하는 법을 다룹니다.
바로 확인 2.
확인 2-1. 볼록한 문제에서 기울기가 이면 무엇을 뜻하는지 쓰세요.
답. 전역 최소에 도달한 것입니다.
확인 2-2. 검산에서 제곱오차를 멀리서 시작했을 때의 결과를 쓰세요.
답. 기울기 에 절편 로 참값에서 떨어집니다.
확인 2-3. 검산에서 교차엔트로피의 두 시작점 결과를 쓰세요.
답. 둘 다 와 로 같습니다.
문제. 못 최적화하는 손실을 대신합니다.
(1) 네 손실을 정리하세요.
(2) 모양을 값으로 보세요.
(3) 이상점에 얼마나 견디는지 재세요.
생각의 실마리. 진짜 재고 싶은 것은 정확도인데, 계단이라 기울기가 이거나 없습니다.
풀이. (1) 정리합니다.
| 무엇 | 미분 가능한가 | 볼록한가 | 쓸 수 있는가 |
|---|---|---|---|
| - 손실 | 아니오 | 아니오 | 직접은 못 씀 |
| 힌지 손실 | 거의 | 예 | SVM |
| 로지스틱 손실 | 예 | 예 | 로지스틱 회귀 |
| 지수 손실 | 예 | 예 | 부스팅 |
뒤 셋을 대리 손실이라 합니다. - 손실의 위쪽을 덮습니다.
(2) 모양을 값으로 봅니다. 여유는 입니다.
| 여유 | - 손실 | 힌지 | 로지스틱 | 지수 |
|---|---|---|---|---|
셋 다 여유가 인 자리에서 정확히 입니다. - 손실을 위에서 덮습니다.
여유가 음수로 커지면 지수 손실이 가장 빠르게 커집니다. 에서 로 힌지의 다섯 배입니다.
그래서 지수 손실은 이상점에 아주 약합니다.
(3) 이상점에 얼마나 견디는지 잽니다. 정답이 뒤집힌 이상점을 넣어 가며 방향이 몇 도 돌아가는지 봅니다.
| 이상점 개수 | 힌지 | 로지스틱 | 지수 |
|---|---|---|---|
이상점 개에서 지수 손실이 도로 로지스틱의 세 배 넘게 돌아갑니다.
개까지도 지수가 가장 큽니다.
개가 되면 셋이 도 근처로 비슷해집니다. 그쯤이면 이상점이 자료의 일부입니다.
적은 이상점에 얼마나 견디느냐가 갈리는 자리이며, 204강 문제 1의 제곱오차와 절대오차 이야기가 분류에서 되풀이됩니다.
이 문제에서 배우는 것. 대리 손실을 최소화한 것이 정확도를 최대화한 것과 같은지가 따로 물어야 할 질문입니다. 위 표에서 이상점 개일 때 셋 다 도 돌아갔는데, 그 정도면 정확도도 함께 떨어집니다. 그런데 이상점 개일 때는 지수 손실만 도 돌아갔고 정확도는 거의 그대로입니다. 손실은 크게 나빠졌는데 정확도는 멀쩡한 경우이며, 어느 쪽을 보고할지가 결론을 바꿉니다. 226강에서 이 간극을 지표로 다룹니다.
바로 확인 3.
확인 3-1. 대리 손실이 무엇인지 쓰세요.
답. 최적화가 안 되는 - 손실을 위에서 덮는 미분 가능한 볼록 손실입니다.
확인 3-2. 검산에서 여유 일 때 세 대리 손실을 쓰세요.
답. , , 입니다.
확인 3-3. 검산에서 이상점 개일 때 세 손실이 돌아간 각도를 쓰세요.
답. , , 도입니다.
문제. 완벽히 맞춰 봅니다.
(1) 차수를 올려 가며 맞추세요.
(2) 잡음을 외운 것인지 확인하세요.
(3) 표본을 늘려 보세요.
생각의 실마리. 경험적 위험은 으로 만들 수 있습니다. 점을 다 지나는 다항식을 찾으면 됩니다.
풀이. (1) 점 개에 차수를 올려 가며 맞춥니다.
| 차수 | 학습 위험 | 참 곡선과의 위험 | 계수의 크기 |
|---|---|---|---|
차수 이면 학습 위험이 에 닿습니다. 점이 개이기 때문입니다.
그런데 참 곡선과의 위험은 로 크게 나빠집니다.
계수의 크기가 에서 으로 폭발합니다. 이것이 211강 정규화의 동기입니다.
(2) 잡음을 외운 것인지 확인합니다.
| 차수 | 잡음과 잔차의 상관 | 무엇을 뜻하나 |
|---|---|---|
| 거의 안 외움 | ||
| 잡음을 외움 | ||
| 잡음을 외움 | ||
| 잡음을 외움 |
차수가 높아질수록 맞춘 값이 잡음을 그대로 따라갑니다.
상관이 에 가까우면 신호가 아니라 잡음을 배운 것입니다.
(3) 표본을 늘려 봅니다. 차수는 로 고정합니다.
| 표본 크기 | 차수 학습 위험 | 참 곡선과의 위험 | 계수의 크기 |
|---|---|---|---|
잡음을 새로 뽑았으므로 표본 의 값이 앞 표와 다릅니다.
같은 차수 인데 표본이 늘면 참 곡선과의 위험이 에서 로 줄어듭니다.
계수의 크기도 에서 으로 얌전해집니다.
모형이 복잡한 것이 문제가 아닙니다. 표본에 견줘 복잡한 것이 문제이며, 214강에서 다시 봅니다.
이 문제에서 배우는 것. "학습 위험이 "이라는 보고가 좋은 소식이 아닙니다. 위 표에서 차수 이 그것을 달성했는데 참 곡선과의 위험은 다섯 배가 됐습니다. 그런데 학습 위험만 보면 그 모형이 가장 좋아 보입니다. 189강 문제 1에서 가 변수를 늘릴수록 오르던 것과 같은 함정이고, 대응도 같습니다. 떼어 둔 자료에서 재는 것이며, 그것이 212강의 교차검증입니다.
바로 확인 4.
확인 4-1. 검산에서 차수 의 두 위험과 계수 크기를 쓰세요.
답. 과 이며 계수는 입니다.
확인 4-2. 검산에서 차수 의 잡음과 잔차의 상관을 쓰세요.
답. 입니다.
확인 4-3. 검산에서 차수 일 때 표본 와 의 참 곡선과의 위험을 쓰세요.
답. 과 입니다.
문제. 실제로 무엇을 최소화하는지 봅니다.
(1) 무엇을 더하는지 정리하세요.
(2) 두 목표를 함께 줄여 보세요.
(3) 멈추는 기준을 정하세요.
생각의 실마리. 실무의 목적함수는 손실 하나가 아닙니다.
풀이. (1) 정리합니다.
| 무엇을 더하나 | 왜 |
|---|---|
| 정규화 항 | 복잡도에 벌점을 줍니다 |
| 표본 가중치 | 중요한 표본을 크게 봅니다 |
| 클래스 가중치 | 불균형을 다룹니다 |
| 제약 | 만족해야 할 조건을 겁니다 |
| 여러 손실의 합 | 목표가 여럿일 때 |
마지막 줄이 어렵습니다. 가중치를 어떻게 정할지가 문제입니다.
(2) 두 목표를 함께 줄여 봅니다. 한 모형이 두 목표를 함께 맞춰야 합니다.
| 둘째 목표의 무게 | 첫째 목표 위험 | 둘째 목표 위험 | 합 |
|---|---|---|---|
무게를 키우면 둘째 목표가 좋아지고 첫째가 나빠집니다.
그런데 이 표에는 함정이 있습니다. 합이 최소인 자리를 찾는데, 그 합이 곧 무게 인 목적함수입니다.
| 둘째 목표를 몇 배로 재나 | 합이 최소인 무게 | 무엇을 뜻하나 |
|---|---|---|
| 배 | 언제나 | |
| 배 | 언제나 |
단위를 열 배로 해도 답이 로 같습니다. 우연이 아닙니다.
그냥 더한 합을 기준으로 삼으면 무게 이 정의상 최적입니다. 기준이 목적함수와 같으면 아무것도 고른 것이 아닙니다.
목표를 먼저 표준화해 봅니다.
| 어떻게 하나 | 단위 배일 때 | 단위 배일 때 | 같은가 |
|---|---|---|---|
| 원자료 그대로 | 아니오 | ||
| 표준화한 뒤 | 예 |
원자료를 그대로 쓰면 이던 답이 으로 바뀝니다.
표준화하면 두 경우 다 으로 같습니다.
평가만 상대값으로 바꾸는 것으로는 모자랍니다. 한 계수 벡터가 두 목표를 함께 내야 하므로 목표 자체를 맞춰야 합니다.
(3) 멈추는 기준을 정합니다.
| 어떤 기준 | 무엇을 조심 |
|---|---|
| 정해진 횟수 | 너무 적거나 많을 수 있음 |
| 기울기가 작아지면 | 평탄한 자리에서 멈춤 |
| 학습 위험이 안 줄면 | 과적합은 못 잡음 |
| 검증 위험이 오르면 | 검증 표본을 쓰게 됨 |
| 시간이나 비용 | 재현이 어려움 |
넷째 줄이 표준입니다. 다만 검증 표본이 선택에 쓰인다는 점을 잊으면 안 됩니다.
조기 종료가 실제로 무엇을 하는지 봅니다. 차수 다항식을 경사하강으로 천천히 맞춥니다.
| 몇 걸음 | 학습 위험 | 참 곡선과의 위험 | 계수의 크기 |
|---|---|---|---|
학습 위험은 에서 로 계속 줄어드는데 참 곡선과의 위험은 걸음에서 돌아섭니다.
계수의 크기가 걸음마다 조금씩 자랍니다. 이 가 됩니다.
걸음을 일찍 멈추는 것이 계수를 작게 두는 것과 비슷한 일을 합니다. 211강에서 이것이 정규화와 어떻게 이어지는지 봅니다.
이 문제에서 배우는 것. 여러 목표를 하나로 합치는 순간 그 무게가 새로운 하이퍼파라미터가 됩니다. 위에서 본 것은 그 무게를 "합을 최소로" 골라서는 안 된다는 것이고, 목표들의 단위를 먼저 맞춰야 한다는 것입니다. 실무에서는 여기서 한 걸음 더 나아가 파레토 곡선 전체를 그려 놓고 사람이 고릅니다. 어느 무게가 옳은지는 자료가 아니라 무엇을 더 중요하게 여기느냐가 정하며, 198강 문제 5의 "자료가 아니라 대상이 정한다"와 같은 자리입니다.
바로 확인 5.
확인 5-1. 검산에서 두 목표의 무게를 과 으로 뒀을 때의 두 위험을 쓰세요.
답. 과 , 과 입니다.
확인 5-2. 합을 기준으로 무게를 고르면 왜 안 되는지 쓰세요.
답. 기준이 곧 무게 인 목적함수라 언제나 이 나오기 때문입니다.
확인 5-3. 검산에서 조기 종료의 걸음과 걸음의 참 곡선과의 위험을 쓰세요.
답. 과 입니다.
| 무엇 | 뜻 |
|---|---|
| 참 위험 | 참 분포에 대한 손실의 평균 |
| 경험적 위험 | 표본에 대한 손실의 평균 |
| 경험적 위험 최소화 | 후자를 줄여 전자를 줄이려는 틀 |
| 대리 손실 | - 손실을 덮는 볼록 손실 |
| 조기 종료 | 걸음을 일찍 멈추는 정규화 |
| 손실 | 이상점에 |
|---|---|
| 힌지 | 비교적 강함 |
| 로지스틱 | 중간 |
| 지수 | 아주 약함 |
| 볼록성 | 무엇이 보장 |
|---|---|
| 볼록 | 국소 최소가 전역 |
| 강볼록 | 해가 하나 |
| 비볼록 | 시작점이 결과를 바꿈 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 학습 자료로 성능을 보고합니다 | 구조적으로 낙관됩니다 |
| 학습 위험 을 목표로 합니다 | 잡음을 외운 것입니다 |
| 복잡한 모형이 나쁘다고 봅니다 | 표본에 견줘 복잡한 것이 문제입니다 |
| 여러 손실을 그냥 더합니다 | 단위를 먼저 맞춥니다 |
| 합을 기준으로 무게를 고릅니다 | 순환 논증입니다 |
문제 6. 참 위험과 경험적 위험의 차이를 쓰세요.
답. 참 분포 전체에 대한 평균과 가진 표본에 대한 평균입니다.
문제 7. 검산에서 표본 와 의 두 위험을 쓰세요.
답. 과 , 과 입니다.
문제 8. 학습 알고리즘이 정하는 넷을 쓰세요.
답. 가설 집합, 손실함수, 최적화 방법, 정규화입니다.
문제 9. 검산에서 제곱오차를 멀리서 시작했을 때의 결과를 쓰세요.
답. 기울기 에 절편 로 참값에서 떨어집니다.
문제 10. 검산에서 교차엔트로피의 두 시작점 결과를 쓰세요.
답. 둘 다 와 로 같습니다.
문제 11. 대리 손실이 무엇인지 쓰세요.
답. - 손실을 위에서 덮는 미분 가능한 볼록 손실입니다.
문제 12. 검산에서 여유 일 때 세 대리 손실을 쓰세요.
답. , , 입니다.
문제 13. 검산에서 이상점 개일 때 세 손실이 돌아간 각도를 쓰세요.
답. , , 도입니다.
문제 14. 검산에서 차수 의 두 위험과 계수 크기를 쓰세요.
답. 과 이며 계수는 입니다.
문제 15. 검산에서 차수 의 잡음과 잔차의 상관을 쓰세요.
답. 입니다.
문제 16. 검산에서 차수 일 때 표본 와 의 참 곡선과의 위험을 쓰세요.
답. 과 입니다.
문제 17. 합을 기준으로 무게를 고르면 왜 안 되는지 쓰세요.
답. 기준이 곧 무게 인 목적함수라 언제나 이 나오기 때문입니다.
문제 18. 검산에서 목표를 표준화한 뒤의 최적 무게를 쓰세요.
답. 단위가 배든 배든 으로 같습니다.
심화 1. 구조적 위험 최소화를 정리하세요.
| 항 | 뜻 |
|---|---|
| 첫 항 | 자료에 얼마나 맞나 |
| 둘째 항 | 얼마나 복잡한가 |
| 합 | 둘의 맞바꿈 |
가설 집합을 복잡도 순으로 겹겹이 쌓고 각 층에서 최소화합니다.
층마다 참 위험의 상한이 다르고 그 상한이 가장 작은 층을 고릅니다.
211강의 정규화가 이 틀의 실용판입니다. 층을 명시적으로 쌓는 대신 벌점의 세기로 연속적으로 조절합니다.
심화 2. 대리 손실이 언제 옳은지 정리하세요.
| 성질 | 뜻 |
|---|---|
| 분류 보정성 | 대리 손실의 최적해가 베이즈 규칙과 같음 |
| 초과 위험 한계 | 대리 손실의 차이가 - 손실의 차이를 통제 |
힌지와 로지스틱과 지수 모두 분류 보정성을 만족합니다.
그래서 무한 표본에서는 셋 다 옳은 답에 갑니다. 차이는 유한 표본에서의 흔들림과 이상점 내성입니다.
문제 3의 표가 그 차이를 잰 것입니다.
보정성이 없는 대리 손실도 있습니다. 제곱오차를 분류에 쓰면 여유가 아주 클 때 오히려 벌을 주므로 결이 다릅니다.
심화 3. 힌지 손실과 SVM을 정리하세요.
| 무엇 | 뜻 |
|---|---|
| 첫 항 | 여유가 미만인 점만 벌 |
| 둘째 항 | 여유를 넓히는 힘 |
| 서포트 벡터 | 첫 항이 살아 있는 점들 |
여유가 을 넘는 점은 손실에 기여하지 않습니다. 그래서 해가 소수의 점에만 달렸습니다.
로지스틱은 모든 점이 조금씩 기여합니다. 그것이 두 방법의 근본 차이이며, 220강에서 다룹니다.
문제 3의 힌지가 이상점에 비교적 강했던 것도 여유가 큰 이상점이 결국 손실을 선형으로만 키우기 때문입니다.
심화 4. 최적화와 일반화가 다르다는 것을 정리하세요.
| 무엇 | 무엇을 재나 |
|---|---|
| 최적화 오차 | 목적함수를 얼마나 잘 최소화했나 |
| 추정 오차 | 표본이 참 분포와 얼마나 다른가 |
| 근사 오차 | 가설 집합에 참 함수가 있는가 |
셋을 함께 줄여야 하는데 서로 밀고 당깁니다.
가설 집합을 키우면 근사 오차가 줄고 추정 오차가 늡니다. 그것이 210강의 편향과 분산입니다.
더 오래 최적화하면 최적화 오차가 주는데 추정 오차가 늘 수 있습니다. 문제 의 조기 종료가 그 자리입니다.
심화 5. 목적함수를 바꾸는 다른 방법들을 정리하세요.
| 무엇 | 어떻게 |
|---|---|
| 자료 증강 | 자료를 늘려 위험의 정의를 바꿈 |
| 잡음 주입 | 입력이나 가중치에 잡음 |
| 드롭아웃 | 무작위로 일부를 끔 |
| 라벨 평활 | 목표 분포를 바꿈 |
넷 다 정규화 항을 명시적으로 더하지 않는데 비슷한 일을 합니다.
자료 증강은 "이런 변환에도 답이 같아야 한다"는 지식을 손실에 넣는 것입니다.
잡음 주입은 특정 조건에서 릿지와 같아집니다. 211강 심화에서 확인합니다.
심화 6. 이 강의가 남긴 문제를 정리하세요.
틀은 세웠는데 실제로 푸는 방법은 아직입니다.
| 무엇을 못 했나 | 어디서 |
|---|---|
| 우도와 손실의 정확한 대응 | 강 |
| 선형회귀의 닫힌 해 | 강 |
| 로지스틱의 반복 해 | 강 |
| 다중분류로의 확장 | 강 |
204강에서 대응만 보였고 유도는 안 했습니다. 206강이 그 유도를 채우고, 207강부터 실제로 풉니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 참 위험 | 참 분포에 대한 손실의 평균입니다 | |
| 경험적 위험 | 표본에 대한 손실의 평균입니다 | |
| ERM | 경험적 위험 최소화 | 후자를 줄이는 틀입니다 |
| 가설 집합 | hypothesis class | 후보로 두는 함수들입니다 |
| 대리 손실 | surrogate loss | - 손실을 덮습니다 |
| 여유 | margin | 곱하기 예측값입니다 |
| 힌지 손실 | hinge loss | 여유 미만만 벌줍니다 |
| 볼록 | convex | 국소 최소가 전역 최소입니다 |
| 강볼록 | strongly convex | 해가 하나로 정해집니다 |
| 조기 종료 | early stopping | 걸음을 일찍 멈춥니다 |
| 구조적 위험 최소화 | SRM | 위험에 복잡도 벌점을 더합니다 |
다음은 206강 최대우도와 손실함수의 대응입니다. 이 강의가 무엇을 최소화할지를 세웠습니다.
204강에서 대응표만 보였고 유도는 하지 않았습니다. 206강은 정규, 베르누이, 다항, 포아송, 지수족을 차례로 놓고 음의 로그우도를 직접 전개해 각각의 손실을 꺼냅니다. 그러면 207강부터 그것을 실제로 풀 수 있습니다.
import numpy as np
rng = np.random.default_rng(20261012)
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)))
# --- 문제 1: 못 재는 것을 잽니다 ---------------------------------------
print(" 204강에서 손실함수를 유도했습니다. 이제 그것을 최소로 만듭니다")
print(" 그런데 진짜로 줄이고 싶은 것은 못 잽니다")
print(" %s %s %s"
% (pw("무엇", 22), rw("무엇에 대한 평균", 26), rw("잴 수 있는가", 16)))
for a, b, c in [("참 위험", "참 분포 전체", "아니오"),
("경험적 위험", "가진 표본", "예"),
("검증 위험", "떼어 둔 표본", "예"),
("시험 위험", "한 번만 쓰는 표본", "예")]:
print(" %s %s %s" % (pw(a, 22), rw(b, 26), rw(c, 16)))
print(" 첫째 줄이 목표이고 둘째 줄이 그것을 대신합니다")
print(" 둘 사이의 차이를 다루는 것이 03 단원입니다")
print(" 둘이 얼마나 다른지 재 봅니다")
N = 400000
true_w = np.array([1.0, -0.5, 0.8])
big_x = rng.normal(0, 1, (N, 3))
big_y = big_x @ true_w + rng.normal(0, 1.0, N)
def risk(w, X, y):
r = y - X @ w
return float(np.mean(r * r))
print(" 참 분포를 40 만 개로 대신하고 작은 표본으로 맞춥니다")
print(" %s %s %s %s"
% (pw("표본 크기", 12), rw("경험적 위험", 16), rw("참 위험", 14),
rw("차이", 14)))
for n in [5, 20, 100, 1000, 10000]:
e, t = [], []
reps = 400 if n <= 1000 else 60
for _ in range(reps):
idx = rng.integers(0, N, n)
X, y = big_x[idx], big_y[idx]
w, *_ = np.linalg.lstsq(X, y, rcond=None)
e.append(risk(w, X, y))
t.append(risk(w, big_x, big_y))
me, mt = float(np.mean(e)), float(np.mean(t))
print(" %s %16.6f %14.6f %14.6f"
% (pw("%d" % n, 12), me, mt, mt - me))
print(" 한 번이 아니라 여러 번 뽑아 평균을 냈습니다. 한 번만 보면 흔들립니다")
print(" 표본이 작으면 경험적 위험이 참 위험보다 훨씬 작습니다")
print(" 표본 5 에 계수 3 개면 거의 완벽히 맞습니다. 배운 것이 아닙니다")
print(" 표본이 늘면 둘이 붙습니다. 이것이 학습이 되는 이유입니다")
print(" 위험을 최소로 하는 자리를 찾는 것이 학습입니다")
print(" %s %s %s"
% (pw("무엇을 고르나", 22), rw("무엇으로", 26), rw("어디서", 18)))
for a, b, c in [("가설 집합", "어떤 함수를 후보로 둘지", "모형 설계"),
("손실함수", "무엇을 벌줄지", "204강"),
("최적화 방법", "어떻게 찾을지", "206강 이후"),
("정규화", "얼마나 단순하게 둘지", "211강")]:
print(" %s %s %s" % (pw(a, 22), rw(b, 26), rw(c, 18)))
print(" 학습 알고리즘이란 이 넷을 정한 것입니다. 그 이상도 이하도 아닙니다")
# --- 문제 2: 볼록성이 왜 중요한가 --------------------------------------
print(" 최소로 만드는 것이 쉬운 문제와 어려운 문제가 있습니다")
print(" %s %s %s %s"
% (pw("무엇", 26), rw("볼록한가", 12), rw("국소 최소가 전역인가", 24),
rw("어디서", 14)))
for a, b, c, d in [("제곱오차와 선형모형", "예", "예", "207강"),
("교차엔트로피와 선형 로짓", "예", "예", "208강"),
("제곱오차와 시그모이드", "아니오", "아니오", "204강 문제 2"),
("교차엔트로피와 신경망", "아니오", "아니오", "S10")]:
print(" %s %s %s %s" % (pw(a, 26), rw(b, 12), rw(c, 24), rw(d, 14)))
print(" 앞 둘은 한 번 내려가면 끝입니다. 뒤 둘은 어디서 시작하느냐가 남습니다")
print(" 같은 자료에 두 손실을 걸고 시작점을 바꿔 봅니다")
n2 = 800
x2 = rng.normal(0, 1, n2)
y2 = (rng.random(n2) < sig(2.0 * x2 - 0.5)).astype(float)
def fit(loss, w0, b0, steps=3000, lr=0.5):
w, b = w0, b0
for _ in range(steps):
z = w * x2 + b
p = sig(z)
if loss == "ce":
g = p - y2
else:
g = 2.0 * (p - y2) * p * (1 - p)
w -= lr * float(np.mean(g * x2))
b -= lr * float(np.mean(g))
return w, b
print(" 참 계수는 2.0 과 -0.5 입니다")
print(" %s %s %s %s %s"
% (pw("손실", 14), rw("시작점", 18), rw("찾은 기울기", 14),
rw("찾은 절편", 14), rw("참값과의 거리", 18)))
for loss, nm in [("ce", "교차엔트로피"), ("sq", "제곱오차")]:
for w0, b0, s0 in [(0.0, 0.0, "0 에서"), (-8.0, 5.0, "멀리서")]:
w, b = fit(loss, w0, b0)
print(" %s %s %14.6f %14.6f %18.6f"
% (pw(nm, 14), rw(s0, 18), w, b,
float(np.hypot(w - 2.0, b + 0.5))))
print(" 교차엔트로피는 두 시작점에서 소수점 여섯 자리까지 같은 자리에 옵니다")
print(" 제곱오차도 0 에서 시작하면 잘 찾습니다. 오히려 조금 더 가깝습니다")
print(" 그런데 멀리서 시작하면 8.628575 만큼 떨어진 곳에 갇힙니다")
print(" 정확도의 문제가 아니라 어디서 시작하느냐에 걸린다는 것이 요점입니다")
print(" 204강 문제 2 의 표가 여기서 학습 실패로 나타납니다")
print(" 볼록하면 무엇이 보장되는지 정리합니다")
print(" %s %s" % (pw("성질", 26), rw("무엇을 뜻하나", 30)))
for a, b in [("국소 최소가 전역 최소", "한 번 내려가면 끝입니다"),
("기울기 0 이면 최적", "멈추면 다 온 것입니다"),
("두 해의 평균도 해", "최적해 집합이 볼록합니다"),
("강볼록이면 해가 하나", "정규화가 그것을 만듭니다")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 마지막 줄이 211강에서 다시 나옵니다. 벌점이 볼록성을 강하게 만듭니다")
# --- 문제 3: 대리 손실 ---------------------------------------------------
print(" 진짜 재고 싶은 것은 대개 최적화가 안 됩니다")
print(" 정확도는 계단이라 기울기가 0 이거나 없습니다")
print(" %s %s %s %s"
% (pw("무엇", 22), rw("미분 가능한가", 16), rw("볼록한가", 12),
rw("쓸 수 있는가", 16)))
for a, b, c, d in [("0-1 손실", "아니오", "아니오", "직접은 못 씀"),
("힌지 손실", "거의", "예", "SVM"),
("로지스틱 손실", "예", "예", "로지스틱 회귀"),
("지수 손실", "예", "예", "부스팅")]:
print(" %s %s %s %s" % (pw(a, 22), rw(b, 16), rw(c, 12), rw(d, 16)))
print(" 뒤 셋을 대리 손실이라 합니다. 0-1 손실의 위쪽을 덮습니다")
print(" 네 손실의 모양을 값으로 봅니다")
print(" %s %s %s %s %s"
% (pw("여유", 12), rw("0-1 손실", 12), rw("힌지", 12),
rw("로지스틱", 14), rw("지수", 14)))
for m in [-3.0, -1.0, 0.0, 1.0, 3.0]:
z01 = 1.0 if m <= 0 else 0.0
hinge = max(0.0, 1.0 - m)
logi = np.logaddexp(0.0, -m) / np.log(2.0)
expo = np.exp(-m)
print(" %s %12.6f %12.6f %14.6f %14.6f"
% (pw("%.1f" % m, 12), z01, hinge, logi, expo))
print(" 셋 다 여유가 0 인 자리에서 1 이상입니다. 0-1 손실을 위에서 덮습니다")
print(" 여유가 음수로 커지면 지수 손실이 가장 빠르게 커집니다")
print(" 그래서 지수 손실은 이상점에 아주 약합니다")
print(" 이상점 하나가 학습을 얼마나 흔드는지 봅니다")
n3 = 600
x3 = rng.normal(0, 1, (n3, 2))
w3 = np.array([1.5, -1.0])
y3 = np.where(x3 @ w3 > 0, 1.0, -1.0)
def train_margin(X, y, kind, steps=4000, lr=0.2):
w = np.zeros(2)
for _ in range(steps):
m = y * (X @ w)
if kind == "hinge":
g = np.where(m < 1, -1.0, 0.0)
elif kind == "logi":
g = -sig(-m)
else:
g = -np.exp(-np.clip(m, -30, 30))
w -= lr * (X.T @ (g * y)) / len(y)
return w / max(np.linalg.norm(w), 1e-12)
base = w3 / np.linalg.norm(w3)
print(" 정답이 뒤집힌 이상점을 몇 개 넣어 가며 방향이 얼마나 돌아가는지 봅니다")
print(" %s %s %s %s"
% (pw("이상점 개수", 14), rw("힌지", 16), rw("로지스틱", 16), rw("지수", 16)))
for k in [0, 1, 5, 20]:
X = x3.copy()
y = y3.copy()
if k > 0:
X = np.concatenate([X, np.array([[6.0, 6.0]] * k)], axis=0)
y = np.concatenate([y, np.array([-1.0] * k)])
row = []
for kind in ["hinge", "logi", "expo"]:
w = train_margin(X, y, kind)
cosang = float(np.clip(np.dot(w, base), -1, 1))
row.append(np.degrees(np.arccos(cosang)))
print(" %s %16.6f %16.6f %16.6f"
% (pw("%d" % k, 14), row[0], row[1], row[2]))
print(" 값은 참 방향에서 몇 도 돌아갔는지입니다")
print(" 이상점 1 개에서 지수 손실이 9.034633 도로 로지스틱의 세 배 넘게 돌아갑니다")
print(" 5 개까지도 지수가 가장 큽니다")
print(" 20 개가 되면 셋이 12 도 근처로 비슷해집니다. 그쯤이면 이상점이 자료의 일부입니다")
print(" 이상점이 없을 때는 셋 다 1 도 아래입니다. 어느 손실이든 잘 찾습니다")
print(" 적은 이상점에 얼마나 견디느냐가 갈리는 자리입니다")
print(" 204강 문제 1 의 제곱오차와 절대오차 이야기가 분류에서 되풀이됩니다")
# --- 문제 4: 최소화가 늘 답은 아닙니다 ----------------------------------
print(" 경험적 위험을 완벽히 0 으로 만들 수 있습니다")
print(" 점을 다 지나는 다항식을 찾으면 됩니다")
n4 = 12
x4 = np.linspace(-1, 1, n4)
y4 = np.sin(3 * x4) + rng.normal(0, 0.2, n4)
xt = np.linspace(-1, 1, 400)
yt = np.sin(3 * xt)
print(" 점 12 개에 차수를 올려 가며 다항식을 맞춥니다")
print(" %s %s %s %s"
% (pw("차수", 10), rw("학습 위험", 16), rw("참 곡선과의 위험", 20),
rw("계수의 크기", 16)))
for deg in [1, 3, 5, 9, 11]:
A = np.vander(x4, deg + 1)
c, *_ = np.linalg.lstsq(A, y4, rcond=None)
tr = float(np.mean((y4 - A @ c) ** 2))
At = np.vander(xt, deg + 1)
te = float(np.mean((yt - At @ c) ** 2))
print(" %s %16.6f %20.6f %16.2f"
% (pw("%d" % deg, 10), tr, te, float(np.abs(c).max())))
print(" 차수 11 이면 학습 위험이 0 에 닿습니다. 점이 12 개이기 때문입니다")
print(" 그런데 참 곡선과의 위험은 크게 나빠집니다")
print(" 계수의 크기가 폭발합니다. 이것이 211강 정규화의 동기입니다")
print(" 잡음을 외운 것인지 확인합니다")
print(" %s %s %s"
% (pw("차수", 10), rw("잡음과 잔차의 상관", 22), rw("무엇을 뜻하나", 24)))
noise = y4 - np.sin(3 * x4)
for deg in [1, 3, 5, 9]:
A = np.vander(x4, deg + 1)
c, *_ = np.linalg.lstsq(A, y4, rcond=None)
fitted = A @ c
memorized = fitted - np.sin(3 * x4)
r = float(np.corrcoef(noise, memorized)[0, 1])
print(" %s %22.6f %s"
% (pw("%d" % deg, 10), r,
rw("거의 안 외움" if r < 0.5 else "잡음을 외움", 24)))
print(" 차수가 높아질수록 맞춘 값이 잡음을 그대로 따라갑니다")
print(" 상관이 1 에 가까우면 신호가 아니라 잡음을 배운 것입니다")
print(" 표본이 늘면 같은 차수라도 달라집니다")
print(" %s %s %s %s"
% (pw("표본 크기", 12), rw("차수 9 학습 위험", 20), rw("참 곡선과의 위험", 20),
rw("계수의 크기", 16)))
for n in [12, 30, 100, 1000]:
xs = np.linspace(-1, 1, n)
ys = np.sin(3 * xs) + rng.normal(0, 0.2, n)
A = np.vander(xs, 10)
c, *_ = np.linalg.lstsq(A, ys, rcond=None)
tr = float(np.mean((ys - A @ c) ** 2))
At = np.vander(xt, 10)
te = float(np.mean((yt - At @ c) ** 2))
print(" %s %20.6f %20.6f %16.4f"
% (pw("%d" % n, 12), tr, te, float(np.abs(c).max())))
print(" 잡음을 새로 뽑았으므로 표본 12 의 값이 앞 표와 다릅니다")
print(" 같은 차수 9 인데 표본이 늘면 참 곡선과의 위험이 크게 줄어듭니다")
print(" 계수의 크기도 얌전해집니다. 모형이 복잡한 것이 문제가 아닙니다")
print(" 표본에 견줘 복잡한 것이 문제입니다. 214강에서 다시 봅니다")
# --- 문제 5: 실무의 최소화 -----------------------------------------------
print(" 실무에서 무엇을 최소화하는지 정리합니다")
print(" %s %s"
% (pw("무엇을 더하나", 26), rw("왜", 30)))
for a, b in [("정규화 항", "복잡도에 벌점을 줍니다"),
("표본 가중치", "중요한 표본을 크게 봅니다"),
("클래스 가중치", "불균형을 다룹니다"),
("제약", "만족해야 할 조건을 겁니다"),
("여러 손실의 합", "목표가 여럿일 때")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 마지막 줄이 어렵습니다. 가중치를 어떻게 정할지가 문제입니다")
print(" 두 목표를 함께 줄여 봅니다")
n5 = 3000
x5 = rng.normal(0, 1, (n5, 4))
wA = np.array([1.0, 0.5, -0.5, 0.2])
wB = np.array([-0.3, 1.2, 0.4, -1.0])
yA = x5 @ wA + rng.normal(0, 0.5, n5)
yB = x5 @ wB + rng.normal(0, 0.5, n5)
print(" 한 모형이 두 목표를 함께 맞춰야 합니다")
print(" %s %s %s %s"
% (pw("둘째 목표의 무게", 18), rw("첫째 목표 위험", 20),
rw("둘째 목표 위험", 20), rw("합", 12)))
for lam in [0.0, 0.3, 1.0, 3.0, 100.0]:
A = np.concatenate([x5, np.sqrt(lam) * x5], axis=0)
b = np.concatenate([yA, np.sqrt(lam) * yB])
w, *_ = np.linalg.lstsq(A, b, rcond=None)
rA = float(np.mean((yA - x5 @ w) ** 2))
rB = float(np.mean((yB - x5 @ w) ** 2))
print(" %s %20.6f %20.6f %12.4f"
% (pw("%.1f" % lam, 18), rA, rB, rA + rB))
print(" 무게를 키우면 둘째 목표가 좋아지고 첫째가 나빠집니다")
print(" 합이 가장 작은 자리가 무게 1.0 근처입니다")
print(" 두 목표의 단위가 다르면 이 곡선의 모양이 통째로 달라집니다")
print(" 그런데 이 표에는 함정이 있습니다")
print(" 합이 최소인 자리를 찾는데 그 합이 곧 무게 1 인 목적함수입니다")
print(" %s %s %s"
% (pw("둘째 목표를 몇 배로 재나", 28), rw("합이 최소인 무게", 20),
rw("무엇을 뜻하나", 24)))
for scale in [1.0, 10.0]:
yB2 = yB * scale
best = None
for lam in np.linspace(0.0, 20.0, 401):
A = np.concatenate([x5, np.sqrt(lam) * x5], axis=0)
b = np.concatenate([yA, np.sqrt(lam) * yB2])
w, *_ = np.linalg.lstsq(A, b, rcond=None)
rA = float(np.mean((yA - x5 @ w) ** 2))
rB = float(np.mean((yB2 - x5 @ w) ** 2))
if best is None or rA + rB < best[0]:
best = (rA + rB, lam)
print(" %s %20.4f %s"
% (pw("%.0f 배" % scale, 28), best[1], rw("언제나 1", 24)))
print(" 단위를 열 배로 해도 답이 1 로 같습니다. 우연이 아닙니다")
print(" 그냥 더한 합을 기준으로 삼으면 무게 1 이 정의상 최적입니다")
print(" 기준이 목적함수와 같으면 아무것도 고른 것이 아닙니다")
print(" 목표를 먼저 표준화해 봅니다")
print(" 각 목표를 자기 표준편차로 나눈 뒤에 같은 일을 합니다")
def argmin_lam(ya, yb):
best = None
for lam in np.linspace(0.01, 20.0, 400):
A = np.concatenate([x5, np.sqrt(lam) * x5], axis=0)
b = np.concatenate([ya, np.sqrt(lam) * yb])
w, *_ = np.linalg.lstsq(A, b, rcond=None)
rA = float(np.mean((ya - x5 @ w) ** 2)) / float(np.var(ya))
rB = float(np.mean((yb - x5 @ w) ** 2)) / float(np.var(yb))
if best is None or rA + rB < best[0]:
best = (rA + rB, lam)
return best
print(" %s %s %s %s"
% (pw("어떻게 하나", 24), rw("단위 1 배일 때", 18),
rw("단위 10 배일 때", 20), rw("같은가", 12)))
r1 = argmin_lam(yA, yB)[1]
r2 = argmin_lam(yA, yB * 10.0)[1]
zA = yA / float(yA.std())
z1 = argmin_lam(zA, yB / float(yB.std()))[1]
z2 = argmin_lam(zA, (yB * 10.0) / float((yB * 10.0).std()))[1]
print(" %s %18.4f %20.4f %s"
% (pw("원자료 그대로", 24), r1, r2, rw("아니오", 12)))
print(" %s %18.4f %20.4f %s"
% (pw("표준화한 뒤", 24), z1, z2, rw("예", 12)))
print(" 원자료를 그대로 쓰면 0.6112 이던 답이 0.0100 으로 바뀝니다")
print(" 표준화하면 두 경우 다 1.0120 으로 같습니다")
print(" 평가만 상대값으로 바꾸는 것으로는 모자랍니다")
print(" 한 계수 벡터가 두 목표를 함께 내야 하므로 목표 자체를 맞춰야 합니다")
print(" 최소화를 멈추는 기준을 정합니다")
print(" %s %s"
% (pw("어떤 기준", 26), rw("무엇을 조심", 30)))
for a, b in [("정해진 횟수", "너무 적거나 많을 수 있음"),
("기울기가 작아지면", "평탄한 자리에서 멈춤"),
("학습 위험이 안 줄면", "과적합은 못 잡음"),
("검증 위험이 오르면", "검증 표본을 쓰게 됨"),
("시간이나 비용", "재현이 어려움")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 넷째 줄이 표준입니다. 다만 검증 표본이 선택에 쓰인다는 점을 잊으면 안 됩니다")
print(" 조기 종료가 실제로 무엇을 하는지 봅니다")
n6 = 60
x6 = np.linspace(-1, 1, n6)
y6 = np.sin(3 * x6) + rng.normal(0, 0.3, n6)
A6 = np.vander(x6, 16)
At6 = np.vander(xt, 16)
c = np.zeros(16)
scale = np.abs(A6).max(axis=0)
An = A6 / scale
Atn = At6 / scale
print(" 차수 15 다항식을 경사하강으로 천천히 맞춥니다")
print(" %s %s %s %s"
% (pw("몇 걸음", 12), rw("학습 위험", 16), rw("참 곡선과의 위험", 20),
rw("계수의 크기", 16)))
for step in range(1, 40001):
r = An @ c - y6
c -= 0.05 * (An.T @ r) / n6
if step in [10, 100, 1000, 10000, 40000]:
tr = float(np.mean((y6 - An @ c) ** 2))
te = float(np.mean((yt - Atn @ c) ** 2))
print(" %s %16.6f %20.6f %16.4f"
% (pw("%d" % step, 12), tr, te, float(np.abs(c).max())))
print(" 학습 위험은 계속 줄어드는데 참 곡선과의 위험은 어디선가 돌아섭니다")
print(" 계수의 크기가 걸음마다 조금씩 자랍니다")
print(" 걸음을 일찍 멈추는 것이 계수를 작게 두는 것과 비슷한 일을 합니다")
print(" 211강에서 이것이 정규화와 어떻게 이어지는지 봅니다")
print(" 205강은 무엇을 최소화할지 세웠습니다. 206강은 우도와의 대응을 봅니다")
# 204강에서 손실함수를 유도했습니다. 이제 그것을 최소로 만듭니다
# 그런데 진짜로 줄이고 싶은 것은 못 잽니다
# 무엇 무엇에 대한 평균 잴 수 있는가
# 참 위험 참 분포 전체 아니오
# 경험적 위험 가진 표본 예
# 검증 위험 떼어 둔 표본 예
# 시험 위험 한 번만 쓰는 표본 예
# 첫째 줄이 목표이고 둘째 줄이 그것을 대신합니다
# 둘 사이의 차이를 다루는 것이 03 단원입니다
# 둘이 얼마나 다른지 재 봅니다
# 참 분포를 40 만 개로 대신하고 작은 표본으로 맞춥니다
# 표본 크기 경험적 위험 참 위험 차이
# 5 0.395658 4.985743 4.590085
# 20 0.849473 1.174013 0.324541
# 100 0.979893 1.034883 0.054990
# 1000 0.999275 1.003484 0.004209
# 10000 0.999596 1.000667 0.001071
# 한 번이 아니라 여러 번 뽑아 평균을 냈습니다. 한 번만 보면 흔들립니다
# 표본이 작으면 경험적 위험이 참 위험보다 훨씬 작습니다
# 표본 5 에 계수 3 개면 거의 완벽히 맞습니다. 배운 것이 아닙니다
# 표본이 늘면 둘이 붙습니다. 이것이 학습이 되는 이유입니다
# 위험을 최소로 하는 자리를 찾는 것이 학습입니다
# 무엇을 고르나 무엇으로 어디서
# 가설 집합 어떤 함수를 후보로 둘지 모형 설계
# 손실함수 무엇을 벌줄지 204강
# 최적화 방법 어떻게 찾을지 206강 이후
# 정규화 얼마나 단순하게 둘지 211강
# 학습 알고리즘이란 이 넷을 정한 것입니다. 그 이상도 이하도 아닙니다
# 최소로 만드는 것이 쉬운 문제와 어려운 문제가 있습니다
# 무엇 볼록한가 국소 최소가 전역인가 어디서
# 제곱오차와 선형모형 예 예 207강
# 교차엔트로피와 선형 로짓 예 예 208강
# 제곱오차와 시그모이드 아니오 아니오 204강 문제 2
# 교차엔트로피와 신경망 아니오 아니오 S10
# 앞 둘은 한 번 내려가면 끝입니다. 뒤 둘은 어디서 시작하느냐가 남습니다
# 같은 자료에 두 손실을 걸고 시작점을 바꿔 봅니다
# 참 계수는 2.0 과 -0.5 입니다
# 손실 시작점 찾은 기울기 찾은 절편 참값과의 거리
# 교차엔트로피 0 에서 1.662752 -0.584441 0.347659
# 교차엔트로피 멀리서 1.662752 -0.584441 0.347659
# 제곱오차 0 에서 1.705524 -0.608524 0.313837
# 제곱오차 멀리서 -1.966223 7.162988 8.628575
# 교차엔트로피는 두 시작점에서 소수점 여섯 자리까지 같은 자리에 옵니다
# 제곱오차도 0 에서 시작하면 잘 찾습니다. 오히려 조금 더 가깝습니다
# 그런데 멀리서 시작하면 8.628575 만큼 떨어진 곳에 갇힙니다
# 정확도의 문제가 아니라 어디서 시작하느냐에 걸린다는 것이 요점입니다
# 204강 문제 2 의 표가 여기서 학습 실패로 나타납니다
# 볼록하면 무엇이 보장되는지 정리합니다
# 성질 무엇을 뜻하나
# 국소 최소가 전역 최소 한 번 내려가면 끝입니다
# 기울기 0 이면 최적 멈추면 다 온 것입니다
# 두 해의 평균도 해 최적해 집합이 볼록합니다
# 강볼록이면 해가 하나 정규화가 그것을 만듭니다
# 마지막 줄이 211강에서 다시 나옵니다. 벌점이 볼록성을 강하게 만듭니다
# 진짜 재고 싶은 것은 대개 최적화가 안 됩니다
# 정확도는 계단이라 기울기가 0 이거나 없습니다
# 무엇 미분 가능한가 볼록한가 쓸 수 있는가
# 0-1 손실 아니오 아니오 직접은 못 씀
# 힌지 손실 거의 예 SVM
# 로지스틱 손실 예 예 로지스틱 회귀
# 지수 손실 예 예 부스팅
# 뒤 셋을 대리 손실이라 합니다. 0-1 손실의 위쪽을 덮습니다
# 네 손실의 모양을 값으로 봅니다
# 여유 0-1 손실 힌지 로지스틱 지수
# -3.0 1.000000 4.000000 4.398182 20.085537
# -1.0 1.000000 2.000000 1.894636 2.718282
# 0.0 1.000000 1.000000 1.000000 1.000000
# 1.0 0.000000 0.000000 0.451941 0.367879
# 3.0 0.000000 0.000000 0.070097 0.049787
# 셋 다 여유가 0 인 자리에서 1 이상입니다. 0-1 손실을 위에서 덮습니다
# 여유가 음수로 커지면 지수 손실이 가장 빠르게 커집니다
# 그래서 지수 손실은 이상점에 아주 약합니다
# 이상점 하나가 학습을 얼마나 흔드는지 봅니다
# 정답이 뒤집힌 이상점을 몇 개 넣어 가며 방향이 얼마나 돌아가는지 봅니다
# 이상점 개수 힌지 로지스틱 지수
# 0 0.803162 0.324721 0.329770
# 1 1.512799 2.582486 9.034633
# 5 5.060938 9.754588 10.336278
# 20 12.494777 12.023989 11.598076
# 값은 참 방향에서 몇 도 돌아갔는지입니다
# 이상점 1 개에서 지수 손실이 9.034633 도로 로지스틱의 세 배 넘게 돌아갑니다
# 5 개까지도 지수가 가장 큽니다
# 20 개가 되면 셋이 12 도 근처로 비슷해집니다. 그쯤이면 이상점이 자료의 일부입니다
# 이상점이 없을 때는 셋 다 1 도 아래입니다. 어느 손실이든 잘 찾습니다
# 적은 이상점에 얼마나 견디느냐가 갈리는 자리입니다
# 204강 문제 1 의 제곱오차와 절대오차 이야기가 분류에서 되풀이됩니다
# 경험적 위험을 완벽히 0 으로 만들 수 있습니다
# 점을 다 지나는 다항식을 찾으면 됩니다
# 점 12 개에 차수를 올려 가며 다항식을 맞춥니다
# 차수 학습 위험 참 곡선과의 위험 계수의 크기
# 1 0.198691 0.216030 0.66
# 3 0.023903 0.017356 2.24
# 5 0.022803 0.017111 2.30
# 9 0.010392 0.058947 47.94
# 11 0.000000 3.392479 2110.13
# 차수 11 이면 학습 위험이 0 에 닿습니다. 점이 12 개이기 때문입니다
# 그런데 참 곡선과의 위험은 크게 나빠집니다
# 계수의 크기가 폭발합니다. 이것이 211강 정규화의 동기입니다
# 잡음을 외운 것인지 확인합니다
# 차수 잡음과 잔차의 상관 무엇을 뜻하나
# 1 0.358776 거의 안 외움
# 3 0.640657 잡음을 외움
# 5 0.661502 잡음을 외움
# 9 0.862374 잡음을 외움
# 차수가 높아질수록 맞춘 값이 잡음을 그대로 따라갑니다
# 상관이 1 에 가까우면 신호가 아니라 잡음을 배운 것입니다
# 표본이 늘면 같은 차수라도 달라집니다
# 표본 크기 차수 9 학습 위험 참 곡선과의 위험 계수의 크기
# 12 0.000986 0.096138 63.7640
# 30 0.041160 0.015900 10.8080
# 100 0.035536 0.005384 7.4457
# 1000 0.040739 0.000347 4.2013
# 잡음을 새로 뽑았으므로 표본 12 의 값이 앞 표와 다릅니다
# 같은 차수 9 인데 표본이 늘면 참 곡선과의 위험이 크게 줄어듭니다
# 계수의 크기도 얌전해집니다. 모형이 복잡한 것이 문제가 아닙니다
# 표본에 견줘 복잡한 것이 문제입니다. 214강에서 다시 봅니다
# 실무에서 무엇을 최소화하는지 정리합니다
# 무엇을 더하나 왜
# 정규화 항 복잡도에 벌점을 줍니다
# 표본 가중치 중요한 표본을 크게 봅니다
# 클래스 가중치 불균형을 다룹니다
# 제약 만족해야 할 조건을 겁니다
# 여러 손실의 합 목표가 여럿일 때
# 마지막 줄이 어렵습니다. 가중치를 어떻게 정할지가 문제입니다
# 두 목표를 함께 줄여 봅니다
# 한 모형이 두 목표를 함께 맞춰야 합니다
# 둘째 목표의 무게 첫째 목표 위험 둘째 목표 위험 합
# 0.0 0.260093 4.590989 4.8511
# 0.3 0.491445 2.817287 3.3087
# 1.0 1.346164 1.332776 2.6789
# 3.0 2.703753 0.518223 3.2220
# 100.0 4.518777 0.247131 4.7659
# 무게를 키우면 둘째 목표가 좋아지고 첫째가 나빠집니다
# 합이 가장 작은 자리가 무게 1.0 근처입니다
# 두 목표의 단위가 다르면 이 곡선의 모양이 통째로 달라집니다
# 그런데 이 표에는 함정이 있습니다
# 합이 최소인 자리를 찾는데 그 합이 곧 무게 1 인 목적함수입니다
# 둘째 목표를 몇 배로 재나 합이 최소인 무게 무엇을 뜻하나
# 1 배 1.0000 언제나 1
# 10 배 1.0000 언제나 1
# 단위를 열 배로 해도 답이 1 로 같습니다. 우연이 아닙니다
# 그냥 더한 합을 기준으로 삼으면 무게 1 이 정의상 최적입니다
# 기준이 목적함수와 같으면 아무것도 고른 것이 아닙니다
# 목표를 먼저 표준화해 봅니다
# 각 목표를 자기 표준편차로 나눈 뒤에 같은 일을 합니다
# 어떻게 하나 단위 1 배일 때 단위 10 배일 때 같은가
# 원자료 그대로 0.6112 0.0100 아니오
# 표준화한 뒤 1.0120 1.0120 예
# 원자료를 그대로 쓰면 0.6112 이던 답이 0.0100 으로 바뀝니다
# 표준화하면 두 경우 다 1.0120 으로 같습니다
# 평가만 상대값으로 바꾸는 것으로는 모자랍니다
# 한 계수 벡터가 두 목표를 함께 내야 하므로 목표 자체를 맞춰야 합니다
# 최소화를 멈추는 기준을 정합니다
# 어떤 기준 무엇을 조심
# 정해진 횟수 너무 적거나 많을 수 있음
# 기울기가 작아지면 평탄한 자리에서 멈춤
# 학습 위험이 안 줄면 과적합은 못 잡음
# 검증 위험이 오르면 검증 표본을 쓰게 됨
# 시간이나 비용 재현이 어려움
# 넷째 줄이 표준입니다. 다만 검증 표본이 선택에 쓰인다는 점을 잊으면 안 됩니다
# 조기 종료가 실제로 무엇을 하는지 봅니다
# 차수 15 다항식을 경사하강으로 천천히 맞춥니다
# 몇 걸음 학습 위험 참 곡선과의 위험 계수의 크기
# 10 0.562597 0.394501 0.1698
# 100 0.272620 0.152349 0.8648
# 1000 0.117169 0.038162 1.9211
# 10000 0.075619 0.013391 2.7092
# 40000 0.072641 0.015975 2.8349
# 학습 위험은 계속 줄어드는데 참 곡선과의 위험은 어디선가 돌아섭니다
# 계수의 크기가 걸음마다 조금씩 자랍니다
# 걸음을 일찍 멈추는 것이 계수를 작게 두는 것과 비슷한 일을 합니다
# 211강에서 이것이 정규화와 어떻게 이어지는지 봅니다
# 205강은 무엇을 최소화할지 세웠습니다. 206강은 우도와의 대응을 봅니다