207강에서 선형회귀는 정규방정식이라는 공식으로 풀렸습니다. 로지스틱에는 그런 공식이 없습니다.
기울기를 으로 둔 식이 에 대해 안 풀립니다. 예측 확률 안에 가 시그모이드로 들어가 있어 분리가 되지 않습니다.
대신 좋은 소식이 둘 있습니다. 목적함수가 볼록하고, 강에서 본 기울기가 깔끔해 뉴턴 방법이 아주 잘 듣습니다.
문제. 왜 공식이 없는지 봅니다.
(1) 기울기가 어디서 인지 확인하세요.
(2) 볼록한지 확인하세요.
(3) 멀리서 무엇이 달라지는지 보세요.
생각의 실마리. 참 계수를 알아도 그 자리에서 기울기가 정확히 은 아닙니다.
풀이. (1) 확인합니다.
| 무엇 | 값 | 판정 |
|---|---|---|
| 가 일 때 기울기 크기 | 아님 | |
| 참 에서 기울기 크기 | 아님 |
참 에서도 기울기가 정확히 이 아닙니다. 표본이 유한하기 때문입니다.
최대우도 해는 참 가 아니라 이 표본에서 기울기가 인 자리입니다.
(2) 볼록한지 확인합니다. 헤세 행렬은 이고 는 의 대각행렬입니다.
| 어느 자리에서 | 가장 작은 고유값 | 판정 |
|---|---|---|
| 에서 | 양수 | |
| 참 에서 | 양수 | |
| 멀리서 | 양수 |
가 언제나 양수이므로 양반정부호입니다.
어디서든 양수입니다. 그래서 국소 최소가 곧 전역 최소이며, 강 문제 에서 교차엔트로피가 시작점에 안 걸렸던 이유입니다.
(3) 멀리서 무엇이 달라지는지 봅니다.
| 계수를 몇 배로 | 가장 작은 고유값 | 에서 대비 |
|---|---|---|
계수를 키우면 확률이 이나 에 붙어 가 으로 갑니다.
곡률이 사라지므로 경사하강이 아주 느려집니다. 배에서 이며, 이것이 문제 의 완전 분리와 이어집니다.
이 문제에서 배우는 것. 볼록한데도 어려운 자리가 있습니다. 볼록성은 "국소 최소에 갇히지 않는다"는 보증이지 "빨리 도착한다"는 보증이 아닙니다. 위 표에서 계수가 커질수록 곡률이 분의 로 줄었는데, 경사하강은 곡률에 반비례해 느려집니다. 강 문제 에서 제곱오차가 멀리서 갇혔던 것과 다른 종류의 어려움이며, 여기서는 갇히지는 않지만 도달하지 못합니다.
바로 확인 1.
확인 1-1. 로지스틱에 닫힌 해가 없는 이유를 쓰세요.
답. 기울기 식 안에 가 시그모이드로 들어가 분리되지 않기 때문입니다.
확인 1-2. 검산에서 세 자리의 가장 작은 고유값을 쓰세요.
답. , , 입니다.
확인 1-3. 검산에서 계수를 배로 했을 때 곡률이 몇 분의 몇이 되는지 쓰세요.
답. 입니다.
문제. 방법을 견줍니다.
(1) 방법을 정리하세요.
(2) 수렴 속도를 재세요.
(3) 비용을 견주세요.
생각의 실마리. 닫힌 해가 없으면 반복해야 합니다. 어떻게 반복하느냐가 갈립니다.
풀이. (1) 정리합니다.
| 방법 | 한 걸음에 무엇 | 걸음당 비용 | 몇 걸음 |
|---|---|---|---|
| 경사하강 | 기울기 방향으로 | 많음 | |
| 뉴턴 | 헤세로 나눠 | np^{2}+p^ | 적음 |
| IRLS | 가중 최소제곱 한 번 | 뉴턴과 같음 | 적음 |
| 확률적 경사하강 | 일부만 보고 | 배치 크기 | 아주 많음 |
둘째와 셋째가 같은 방법입니다. 문제 에서 왜 같은지 봅니다.
(2) 수렴 속도를 잽니다.
| 몇 걸음 | 경사하강의 최적과의 차 | 뉴턴의 최적과의 차 |
|---|---|---|
뉴턴은 여덟 걸음에 기계 정밀도까지 갑니다.
뉴턴이 이차 수렴이라 자릿수가 걸음마다 두 배로 늡니다. 걸음에 , 걸음에 입니다.
경사하강이 몇 걸음 걸리는지 봅니다.
| 몇 걸음 | 최적과의 차 | 계수와 최적의 거리 |
|---|---|---|
걸음이면 경사하강도 같은 자리에 옵니다.
뉴턴의 여덟 걸음과 견주면 배 넘게 걸린 셈입니다.
(3) 비용을 견줍니다. 표본은 으로 고정합니다.
| 변수 개수 | 뉴턴 한 걸음 비용 | 경사하강 한 걸음 | 비율 |
|---|---|---|---|
변수가 만 개면 뉴턴 한 걸음이 경사하강의 이만 배입니다.
그래서 큰 문제에서는 헤세를 안 만듭니다. S에서 다시 봅니다.
이 문제에서 배우는 것. "몇 걸음"과 "걸음당 비용"의 곱이 실제 비용입니다. 뉴턴이 배 적은 걸음을 쓰지만 변수가 개면 걸음당 배 비싸므로 전체로는 뉴턴이 열 배 손해입니다. 그 손익분기가 대략 변수 개 근처이고, 그래서 통계 소프트웨어의 로지스틱 회귀는 뉴턴을 쓰고 딥러닝은 확률적 경사하강을 씁니다. 같은 문제라도 크기가 방법을 정합니다.
바로 확인 2.
확인 2-1. 검산에서 뉴턴의 걸음과 걸음 오차를 쓰세요.
답. 과 입니다.
확인 2-2. 검산에서 경사하강이 몇 걸음에 수렴하는지 쓰세요.
답. 걸음이며 뉴턴의 배 넘게 걸립니다.
확인 2-3. 검산에서 변수 일 때 두 방법의 걸음당 비용 비를 쓰세요.
답. 배입니다.
문제. 뉴턴을 다시 씁니다.
(1) 가중 최소제곱과 같은지 확인하세요.
(2) 가중치의 뜻을 보세요.
(3) 표준오차를 얻으세요.
생각의 실마리. 뉴턴 갱신식을 정리하면 강의 가중 최소제곱이 나옵니다.
풀이. (1) 확인합니다.
| 몇 걸음 | 뉴턴의 값 | IRLS의 값 | 차이 |
|---|---|---|---|
완전히 같습니다. 이름만 다른 하나의 방법입니다.
강의 가중 최소제곱을 걸음마다 가중치를 바꿔 가며 반복하는 것입니다.
(2) 가중치의 뜻을 봅니다.
| 예측 확률 구간 | 표본 수 | 평균 가중치 |
|---|---|---|
| 에서 | ||
| 에서 | ||
| 에서 | ||
| 에서 | ||
| 에서 |
확률이 근처인 표본의 가중치가 로 가장 큽니다.
이미 확실한 표본은 근처로 거의 기여하지 않습니다.
경계 근처의 표본이 계수를 정합니다. 강의 서포트 벡터와 닮았습니다.
(3) 표준오차를 얻습니다.
| 계수 | 추정값 | 표준오차 | 참값 |
|---|---|---|---|
헤세의 역행렬이 공분산 추정입니다. 강의 피셔 정보입니다.
IRLS를 풀면 계수와 표준오차가 함께 나옵니다.
이 문제에서 배우는 것. IRLS라는 이름이 계산 절차가 아니라 통계적 의미를 담고 있습니다. 가중치 는 강의 , 곧 그 관측의 분산이고, 분산의 역수로 가중하는 것이 강 문제 의 가중 최소제곱입니다. 그러니까 로지스틱 회귀는 **"분산이 자리마다 다른 회귀를 반복해 푸는 것"**이며, 포아송이든 감마든 지수족이면 똑같이 풀립니다. 강에서 도구로 썼던 것이 여기서 왜 그런지 밝혀집니다.
바로 확인 3.
확인 3-1. IRLS가 무엇을 반복하는지 쓰세요.
답. 가중치를 갱신해 가며 가중 최소제곱을 반복합니다.
확인 3-2. 검산에서 예측 확률 에서 구간과 에서 구간의 평균 가중치를 쓰세요.
답. 와 입니다.
확인 3-3. 검산에서 세 계수의 추정값과 표준오차를 쓰세요.
답. 과 , 과 , 과 입니다.
문제. 완전 분리를 봅니다.
(1) 계수가 발산하는 것을 보세요.
(2) 대응을 견주세요.
(3) 언제 일어나는지 재세요.
생각의 실마리. 자료가 선형으로 완전히 나뉘면 우도를 에 가깝게 만드는 방향으로 계수가 끝없이 커집니다.
풀이. (1) 정확히 나뉘는 자료를 만들어 봅니다.
| 몇 걸음 | 계수의 크기 | 음의 로그우도 | 가장 작은 고유값 |
|---|---|---|---|
계수가 계속 커지고 우도가 으로 갑니다. 멈추지 않습니다.
헤세의 고유값이 로 가서 뉴턴도 못 씁니다. 강 심화 의 완전 분리입니다.
(2) 대응을 견줍니다.
| 무엇을 하나 | 계수의 크기 | 빼기 최대 확률 | 목적함수를 바꾸나 |
|---|---|---|---|
| 아무것도 안 함 걸음 | 아니오 | ||
| 릿지 벌점 | 예 | ||
| 라벨 평활 | 예 | ||
| 걸음에서 멈춤 | 아니오 |
첫 줄은 걸음을 더 주면 계수가 계속 커집니다. 붙잡은 것이 아닙니다.
릿지와 라벨 평활은 계수를 과 에서 멈춰 세웁니다.
빼기 최대 확률이 첫 줄에서는 으로 뭉개지고 둘에서는 살아 있습니다.
릿지와 라벨 평활은 목적함수를 바꾸고 조기 종료는 안 바꿉니다. 강 문제 의 조기 종료가 여기서도 정규화처럼 작동합니다.
(3) 언제 일어나는지 잽니다. 라벨은 무작위입니다.
| 표본 | 변수 | 완전 분리 비율 | 판정 |
|---|---|---|---|
| 드묾 | |||
| 드묾 | |||
| 흔함 | |||
| 흔함 |
라벨이 무작위인데도 변수가 늘면 완전히 나뉩니다.
표본 에 변수 면 거의 언제나 그렇습니다.
강의 차원의 저주가 분류에서 나타난 모습입니다.
이 문제에서 배우는 것. 완전 분리는 "모형이 완벽하다"는 신호가 아니라 "정보가 모자라다"는 신호입니다. 위 표에서 라벨이 동전 던지기인데도 변수 개면 언제나 완벽히 나뉘었고, 그 모형의 학습 정확도는 퍼센트입니다. 강 문제 에서 차수 다항식이 점 개를 다 지났던 것, 강 문제 에서 잔차가 이었던 것과 같은 현상의 분류판입니다. 그래서 로지스틱 회귀 결과에서 계수가 을 넘으면 먼저 이것을 의심합니다.
바로 확인 4.
확인 4-1. 완전 분리가 무엇인지 쓰세요.
답. 자료가 선형으로 완전히 나뉘어 계수가 발산하는 상태입니다.
확인 4-2. 검산에서 세 대응의 계수 크기를 쓰세요.
답. 릿지 , 라벨 평활 , 걸음 종료 입니다.
확인 4-3. 검산에서 표본 에 변수 과 일 때의 완전 분리 비율을 쓰세요.
답. 과 입니다.
문제. 점검 항목을 정합니다.
(1) 무엇을 볼지 정리하세요.
(2) 수렴 판정을 해 보세요.
(3) 표준화의 영향을 보세요.
생각의 실마리. 반복법이므로 멈춘 자리가 답인지부터 확인해야 합니다.
풀이. (1) 정리합니다.
| 무엇 | 왜 |
|---|---|
| 수렴했는가 | 기울기 크기를 봅니다 |
| 계수가 지나치게 큰가 | 완전 분리를 의심합니다 |
| 변수를 표준화했는가 | 정규화와 수렴에 영향 |
| 확률이 보정됐는가 | 강 문제 |
| 표본 대 변수 비 | 완전 분리와 과적합 |
첫째 줄을 안 보고 결과를 읽는 일이 흔합니다.
(2) 수렴 판정을 해 봅니다.
| 몇 걸음 | 기울기 크기 | 목적함수 변화 | 계수 변화 |
|---|---|---|---|
기울기 크기가 가장 정직한 기준입니다.
목적함수 변화는 평탄한 자리에서 작아져 일찍 멈추게 합니다. 걸음에서 이미 이라 "다 됐다"고 판정할 수 있는데, 기울기는 아직 입니다.
강 문제 의 멈추는 기준과 같은 이야기입니다.
(3) 표준화의 영향을 봅니다. 세 변수의 눈금이 이천 배 차이 납니다.
| 무엇으로 | 설계행렬 조건수 | 걸음 뒤 기울기 | 판정 |
|---|---|---|---|
| 원자료 | 안 됨 | ||
| 표준화한 뒤 | 됨 |
원자료로는 걸음에도 기울기가 입니다. 수렴하지 않았습니다.
표준화하면 같은 걸음 수로 까지 갑니다.
강 문제 의 조건수 이야기가 반복법에서 수렴 속도로 나타납니다.
뉴턴은 눈금에 안 걸립니다.
| 무엇으로 | 뉴턴 걸음 뒤 기울기 | 판정 |
|---|---|---|
| 원자료 | 됨 | |
| 표준화한 뒤 | 됨 |
뉴턴은 헤세로 나누므로 눈금이 저절로 보정됩니다.
그래서 변수가 적으면 뉴턴을 쓰는 것이 마음 편합니다.
이 문제에서 배우는 것. 경사하강은 좌표계에 딸리고 뉴턴은 안 딸립니다. 기울기는 변수의 단위를 그대로 물려받아 눈금이 다르면 방향이 왜곡되는데, 헤세로 나누면 그 왜곡이 상쇄됩니다. 그래서 경사하강을 쓸 때 표준화는 선택이 아니라 필수이고, S의 배치 정규화와 아담 최적화기가 이 문제를 다른 방식으로 푸는 장치입니다. 강 문제 에서는 조건수가 정확도의 문제였는데, 여기서는 수렴 속도의 문제로 나타납니다.
바로 확인 5.
확인 5-1. 수렴 판정에 무엇을 보는 것이 가장 정직한지 쓰세요.
답. 기울기의 크기입니다.
확인 5-2. 검산에서 원자료와 표준화한 뒤의 걸음 기울기를 쓰세요.
답. 과 입니다.
확인 5-3. 검산에서 뉴턴 걸음 뒤 두 경우의 기울기를 쓰세요.
답. 과 입니다.
| 무엇 | 식 |
|---|---|
| 기울기 | |
| 헤세 | , |
| 뉴턴 갱신 | |
| IRLS 작업변수 | |
| 공분산 | H^ |
| 방법 | 걸음 수 | 걸음당 비용 |
|---|---|---|
| 경사하강 | ||
| 뉴턴 | np^{2}+p^ | |
| 확률적 경사하강 | 아주 많음 | 배치 |
| 완전 분리 대응 | 목적함수를 바꾸나 |
|---|---|
| 릿지 벌점 | 예 |
| 라벨 평활 | 예 |
| 조기 종료 | 아니오 |
| 변수 줄이기 | 예 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 수렴을 안 확인합니다 | 기울기 크기를 봅니다 |
| 목적함수 변화로 멈춥니다 | 평탄한 자리에서 일찍 멈춥니다 |
| 계수가 큰데 좋다고 봅니다 | 완전 분리를 의심합니다 |
| 표준화 없이 경사하강 | 수렴이 아주 느려집니다 |
| 변수를 표본만큼 넣습니다 | 언제나 완전히 나뉩니다 |
문제 6. 로지스틱에 닫힌 해가 없는 이유를 쓰세요.
답. 기울기 식 안에 가 시그모이드로 들어가 분리되지 않기 때문입니다.
문제 7. 검산에서 세 자리의 가장 작은 고유값을 쓰세요.
답. , , 입니다.
문제 8. 검산에서 계수를 배로 했을 때 곡률이 몇 분의 몇이 되는지 쓰세요.
답. 입니다.
문제 9. 검산에서 뉴턴의 걸음과 걸음 오차를 쓰세요.
답. 과 입니다.
문제 10. 검산에서 경사하강이 몇 걸음에 수렴하는지 쓰세요.
답. 걸음입니다.
문제 11. 검산에서 변수 일 때 두 방법의 걸음당 비용 비를 쓰세요.
답. 배입니다.
문제 12. IRLS가 무엇을 반복하는지 쓰세요.
답. 가중치를 갱신해 가며 가중 최소제곱을 반복합니다.
문제 13. 검산에서 예측 확률 에서 구간의 평균 가중치를 쓰세요.
답. 입니다.
문제 14. 검산에서 세 계수의 표준오차를 쓰세요.
답. , , 입니다.
문제 15. 검산에서 완전 분리 자료의 걸음 계수 크기를 쓰세요.
답. 입니다.
문제 16. 검산에서 세 대응의 계수 크기를 쓰세요.
답. , , 입니다.
문제 17. 검산에서 표본 에 변수 과 일 때의 완전 분리 비율을 쓰세요.
답. 과 입니다.
문제 18. 검산에서 원자료와 표준화한 뒤의 걸음 기울기를 쓰세요.
답. 과 입니다.
심화 1. 뉴턴 방법의 수렴 차수를 정리하세요.
| 무엇 | 조건 |
|---|---|
| 이차 수렴 | 헤세가 립시츠이고 최적에서 양정부호 |
| 어디서부터 | 충분히 가까운 자리 |
| 멀리서는 | 보장 안 됨 |
셋째 줄 때문에 실무에서는 걸음 크기를 줄여 가며 씁니다.
감쇠 뉴턴이 그것이며 선형 탐색을 함께 씁니다.
로지스틱은 볼록이라 감쇠 뉴턴이 전역 수렴합니다. 그래서 안심하고 쓸 수 있습니다.
심화 2. 준뉴턴 방법을 정리하세요.
| 무엇 | 어떻게 |
|---|---|
| BFGS | 헤세의 역행렬을 걸음마다 갱신 |
| L-BFGS | 최근 몇 걸음만 기억 |
| 메모리 | 대신 |
헤세를 안 만들고도 뉴턴에 가까운 속도를 냅니다.
L-BFGS가 중간 크기 문제의 표준입니다. 통계 소프트웨어의 기본 최적화기입니다.
변수가 수백만이면 그것도 비쌉니다. 그때 확률적 경사하강으로 갑니다.
심화 3. 확률적 경사하강이 왜 되는지 정리하세요.
| 무엇 | 뜻 |
|---|---|
| 불편 추정 | 배치의 기울기가 전체의 불편 추정 |
| 분산 | 배치 크기에 반비례 |
| 학습률 | 걸음마다 줄여야 수렴 |
강에서 미니배치 기울기의 분산을 다룹니다.
잡음이 있는데도 수렴하는 것이 놀라운 사실입니다. 학습률을 적절히 줄이면 보장됩니다.
잡음이 오히려 도움이 되기도 합니다. 비볼록 문제에서 얕은 자리를 빠져나옵니다.
심화 4. 완전 분리를 미리 검사하는 법을 정리하세요.
| 방법 | 어떻게 |
|---|---|
| 선형계획 | 나누는 초평면이 있는지 직접 품 |
| 계수 크기 | 학습 뒤 발산 여부로 |
| 예측 확률 | 이나 에 붙는지 |
| 표준오차 | 아주 커지는지 |
첫째 줄이 정확하지만 비쌉니다.
나머지 셋은 학습 뒤에 알 수 있는 신호입니다.
넷째 줄이 실무에서 가장 눈에 띕니다. 계수는 인데 표준오차가 이면 이것입니다.
심화 5. 로지스틱과 다른 이진 분류를 정리하세요.
| 모형 | 연결함수 | 언제 |
|---|---|---|
| 로지스틱 | 로짓 | 표준 |
| 프로빗 | 정규 분포함수 | 잠재변수 해석 |
| 여상보 로그로그 | 비대칭 | 드문 사건 |
| 선형확률모형 | 항등 | 해석이 쉬움 |
둘째 줄과 첫째 줄이 거의 같은 결과를 냅니다. 계수 크기만 대략 배 다릅니다.
셋째 줄은 한쪽 꼬리가 두꺼워 드문 사건에 맞습니다.
넷째 줄은 강 문제 에서 봤듯 확률이 범위를 벗어납니다. 그래도 계수 해석이 직접적이라 쓰입니다.
심화 6. 이 강의가 남긴 문제를 정리하세요.
두 갈래만 다뤘습니다.
| 무엇을 못 했나 | 어디서 |
|---|---|
| 갈래가 셋 이상 | 강 |
| 소프트맥스의 기울기 | 강 |
| 어느 갈래와 헷갈리는지 | 강 |
이진의 시그모이드가 소프트맥스의 특수한 경우이고, 기울기 식이 그대로 유지됩니다. 강 심화 에서 미리 본 가 그것이며, 강은 그것을 유도하고 다중분류의 실무 문제까지 다룹니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 시그모이드 | 로짓을 확률로 바꿉니다 | |
| 가중 대각행렬 | 를 담습니다 | |
| 헤세 | Hessian | 이계 도함수 행렬입니다 |
| 뉴턴 방법 | Newton's method | 헤세로 나눠 걸음을 정합니다 |
| IRLS | 반복 가중 최소제곱 | 뉴턴을 회귀로 다시 쓴 것입니다 |
| 이차 수렴 | quadratic convergence | 자릿수가 걸음마다 두 배로 늡니다 |
| 완전 분리 | complete separation | 계수가 발산하는 자리입니다 |
| 준뉴턴 | quasi-Newton | 헤세를 근사로 갱신합니다 |
| L-BFGS | limited-memory BFGS | 최근 몇 걸음만 기억합니다 |
| 감쇠 뉴턴 | damped Newton | 걸음 크기를 줄여 안전하게 갑니다 |
다음은 209강 소프트맥스 회귀와 다중분류입니다. 이 강의가 두 갈래를 풀었습니다.
시그모이드를 소프트맥스로 바꾸면 됩니다. 그런데 자유도가 하나 남는 문제가 생기고, 갈래가 아주 많으면 분모의 합을 계산하는 것 자체가 비싸집니다. 강은 그 둘을 다루고 단원을 마칩니다.
import numpy as np
rng = np.random.default_rng(20261015)
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 nll(X, y, w):
z = X @ w
return float(np.mean(np.logaddexp(0.0, z) - y * z))
# --- 문제 1: 닫힌 해가 없습니다 ----------------------------------------
print(" 207강의 정규방정식 같은 공식이 로지스틱에는 없습니다")
print(" 기울기를 0 으로 둔 식이 w 에 대해 안 풀립니다")
print(" 기울기는 (예측 확률 빼기 관측) 곱하기 x 의 평균입니다")
print(" 예측 확률 안에 w 가 시그모이드로 들어가 있어 분리가 안 됩니다")
n1 = 2000
X1 = np.concatenate([np.ones((n1, 1)), rng.normal(0, 1, (n1, 2))], axis=1)
w1 = np.array([-0.5, 1.5, -1.0])
y1 = (rng.random(n1) < sig(X1 @ w1)).astype(float)
print(" %s %s %s"
% (pw("무엇", 28), rw("값", 20), rw("판정", 16)))
w_zero = np.zeros(3)
g0 = X1.T @ (sig(X1 @ w_zero) - y1) / n1
g_true = X1.T @ (sig(X1 @ w1) - y1) / n1
for nm, v in [("w 가 0 일 때 기울기 크기", float(np.linalg.norm(g0))),
("참 w 에서 기울기 크기", float(np.linalg.norm(g_true)))]:
print(" %s %20.8f %s"
% (pw(nm, 28), v, rw("0 아님" if v > 1e-6 else "0", 16)))
print(" 참 w 에서도 기울기가 정확히 0 이 아닙니다. 표본이 유한하기 때문입니다")
print(" 최대우도 해는 참 w 가 아니라 이 표본에서 기울기가 0 인 자리입니다")
print(" 목적함수가 볼록한지 확인합니다")
print(" 헤세 행렬은 X 전치 D X 이고 D 는 p(1-p) 의 대각행렬입니다")
print(" p(1-p) 가 언제나 양수이므로 양반정부호입니다")
print(" %s %s %s"
% (pw("어느 자리에서", 24), rw("가장 작은 고유값", 22), rw("판정", 16)))
for nm, w in [("0 에서", np.zeros(3)), ("참 w 에서", w1),
("멀리서", np.array([5.0, -8.0, 6.0]))]:
p = sig(X1 @ w)
D = p * (1 - p)
Hm = X1.T @ (D[:, None] * X1) / n1
ev = float(np.linalg.eigvalsh(Hm).min())
print(" %s %22.10f %s"
% (pw(nm, 24), ev, rw("양수" if ev > 0 else "0 이하", 16)))
print(" 어디서든 양수입니다. 그래서 국소 최소가 곧 전역 최소입니다")
print(" 205강 문제 2 에서 교차엔트로피가 시작점에 안 걸렸던 이유입니다")
print(" 멀리서는 헤세가 아주 작아집니다")
print(" %s %s %s"
% (pw("계수를 몇 배로", 18), rw("가장 작은 고유값", 22),
rw("0 에서 대비", 18)))
p0 = sig(X1 @ np.zeros(3))
base_ev = float(np.linalg.eigvalsh(
X1.T @ ((p0 * (1 - p0))[:, None] * X1) / n1).min())
for k in [1, 3, 10, 30]:
w = k * w1
p = sig(X1 @ w)
D = p * (1 - p)
ev = float(np.linalg.eigvalsh(X1.T @ (D[:, None] * X1) / n1).min())
print(" %s %22.10f %18.6f"
% (pw("%d" % k, 18), ev, ev / base_ev))
print(" 계수를 키우면 확률이 0 이나 1 에 붙어 p(1-p) 가 0 으로 갑니다")
print(" 곡률이 사라지므로 경사하강이 아주 느려집니다")
print(" 이것이 완전 분리에서 계수가 발산하는 자리와 이어집니다")
# --- 문제 2: 세 가지 푸는 법 --------------------------------------------
print(" 풀 수 있는 방법이 여럿입니다")
print(" %s %s %s %s"
% (pw("방법", 20), rw("한 걸음에 무엇", 24), rw("걸음당 비용", 16),
rw("몇 걸음", 14)))
for a, b, c, d in [("경사하강", "기울기 방향으로", "n p", "많음"),
("뉴턴", "헤세로 나눠", "n p 제곱 더하기 p 세제곱", "적음"),
("IRLS", "가중 최소제곱 한 번", "뉴턴과 같음", "적음"),
("확률적 경사하강", "일부만 보고", "배치 크기 p", "아주 많음")]:
print(" %s %s %s %s" % (pw(a, 20), rw(b, 24), rw(c, 16), rw(d, 14)))
print(" 둘째와 셋째가 같은 방법입니다. 209강에서 왜 같은지 봅니다")
def gd(X, y, steps, lr=1.0):
w = np.zeros(X.shape[1])
hist = []
for t in range(steps):
g = X.T @ (sig(X @ w) - y) / len(y)
w -= lr * g
hist.append(nll(X, y, w))
return w, hist
def newton(X, y, steps):
w = np.zeros(X.shape[1])
hist = []
for t in range(steps):
p = sig(X @ w)
g = X.T @ (p - y) / len(y)
D = np.maximum(p * (1 - p), 1e-10)
Hm = X.T @ (D[:, None] * X) / len(y)
w -= np.linalg.solve(Hm, g)
hist.append(nll(X, y, w))
return w, hist
w_gd, h_gd = gd(X1, y1, 3000)
w_nt, h_nt = newton(X1, y1, 12)
best = nll(X1, y1, w_nt)
print(" 두 방법으로 같은 문제를 풉니다")
print(" %s %s %s"
% (pw("몇 걸음", 12), rw("경사하강의 최적과의 차", 26),
rw("뉴턴의 최적과의 차", 24)))
for t in [1, 2, 4, 8, 12]:
print(" %s %26.4e %24.4e"
% (pw("%d" % t, 12), h_gd[t - 1] - best, h_nt[t - 1] - best))
print(" 뉴턴은 여덟 걸음에 기계 정밀도까지 갑니다")
print(" 경사하강은 열두 걸음에 아직 멀리 있습니다")
print(" 뉴턴이 이차 수렴이라 자릿수가 걸음마다 두 배로 늡니다")
print(" 경사하강이 몇 걸음 걸리는지 봅니다")
print(" %s %s %s"
% (pw("몇 걸음", 14), rw("최적과의 차", 22), rw("계수와 최적의 거리", 24)))
for t in [10, 100, 1000, 3000]:
print(" %s %22.4e %24.6f"
% (pw("%d" % t, 14), h_gd[t - 1] - best,
float(np.linalg.norm(gd(X1, y1, t)[0] - w_nt))))
print(" 1000 걸음이면 경사하강도 같은 자리에 옵니다")
print(" 뉴턴의 여덟 걸음과 견주면 100 배 넘게 걸린 셈입니다")
print(" 대신 걸음당 비용이 훨씬 쌉니다. 변수가 많으면 이야기가 달라집니다")
print(" 변수 개수에 따라 어느 쪽이 나은지 봅니다")
print(" %s %s %s %s"
% (pw("변수 개수", 12), rw("뉴턴 한 걸음 비용", 22),
rw("경사하강 한 걸음", 20), rw("비율", 14)))
n_fix = 10000
for p in [10, 100, 1000, 10000]:
c_nt = n_fix * p * p + p ** 3
c_gd = n_fix * p
print(" %s %22.4e %20.4e %14.1f"
% (pw("%d" % p, 12), float(c_nt), float(c_gd), c_nt / c_gd))
print(" 변수가 만 개면 뉴턴 한 걸음이 경사하강의 이만 배입니다")
print(" 그래서 큰 문제에서는 헤세를 안 만듭니다. S10 에서 다시 봅니다")
# --- 문제 3: IRLS 로 읽기 -----------------------------------------------
print(" 뉴턴 한 걸음이 가중 최소제곱 한 번과 같습니다")
print(" 갱신식을 정리하면 z = Xw 더하기 (y 빼기 p) 나누기 p(1-p) 입니다")
print(" 그 z 를 가중치 p(1-p) 로 회귀하면 다음 w 가 나옵니다")
def irls(X, y, steps):
w = np.zeros(X.shape[1])
hist = []
for _ in range(steps):
eta = X @ w
p = sig(eta)
D = np.maximum(p * (1 - p), 1e-10)
z = eta + (y - p) / D
w = np.linalg.solve(X.T @ (D[:, None] * X), X.T @ (D * z))
hist.append(nll(X, y, w))
return w, hist
w_ir, h_ir = irls(X1, y1, 12)
print(" %s %s %s %s"
% (pw("몇 걸음", 12), rw("뉴턴의 값", 22), rw("IRLS 의 값", 22),
rw("차이", 16)))
for t in [1, 2, 4, 8, 12]:
print(" %s %22.10f %22.10f %16.4e"
% (pw("%d" % t, 12), h_nt[t - 1], h_ir[t - 1],
abs(h_nt[t - 1] - h_ir[t - 1])))
print(" 완전히 같습니다. 이름만 다른 하나의 방법입니다")
print(" 207강의 가중 최소제곱을 걸음마다 가중치를 바꿔 가며 반복하는 것입니다")
print(" 가중치가 무엇을 뜻하는지 봅니다")
p_fin = sig(X1 @ w_ir)
D_fin = p_fin * (1 - p_fin)
print(" %s %s %s"
% (pw("예측 확률 구간", 22), rw("표본 수", 14), rw("평균 가중치", 18)))
for lo, hi in [(0.0, 0.1), (0.1, 0.3), (0.3, 0.7), (0.7, 0.9), (0.9, 1.0)]:
m = (p_fin >= lo) & (p_fin < hi if hi < 1.0 else p_fin <= hi)
if m.sum() > 0:
print(" %s %14d %18.6f"
% (pw("%.1f 에서 %.1f" % (lo, hi), 22), int(m.sum()),
float(D_fin[m].mean())))
print(" 확률이 0.5 근처인 표본의 가중치가 가장 큽니다")
print(" 이미 확실한 표본은 거의 기여하지 않습니다")
print(" 경계 근처의 표본이 계수를 정합니다. 220강의 서포트 벡터와 닮았습니다")
print(" 표준오차도 여기서 나옵니다")
Hf = X1.T @ (D_fin[:, None] * X1)
cov = np.linalg.inv(Hf)
se = np.sqrt(np.diag(cov))
print(" %s %s %s %s"
% (pw("계수", 12), rw("추정값", 14), rw("표준오차", 14), rw("참값", 12)))
for i, t in enumerate(w1):
print(" %s %14.6f %14.6f %12.1f"
% (pw("%d" % i, 12), w_ir[i], se[i], t))
print(" 헤세의 역행렬이 공분산 추정입니다. 152강의 피셔 정보입니다")
print(" IRLS 를 풀면 계수와 표준오차가 함께 나옵니다")
# --- 문제 4: 수렴하지 않는 자리 -----------------------------------------
print(" 자료가 선형으로 완전히 나뉘면 계수가 발산합니다")
n4 = 200
X4 = np.concatenate([np.ones((n4, 1)), rng.normal(0, 1, (n4, 2))], axis=1)
sep = (X4[:, 1] + X4[:, 2] > 0).astype(float)
print(" 정확히 나뉘는 자료를 만들었습니다")
print(" %s %s %s %s"
% (pw("몇 걸음", 12), rw("계수의 크기", 18), rw("음의 로그우도", 20),
rw("가장 작은 고유값", 22)))
w = np.zeros(3)
for t in range(1, 401):
p = sig(X4 @ w)
g = X4.T @ (p - sep) / n4
w -= 5.0 * g
if t in [10, 50, 200, 400]:
pp = sig(X4 @ w)
D = pp * (1 - pp)
ev = float(np.linalg.eigvalsh(X4.T @ (D[:, None] * X4) / n4).min())
print(" %s %18.6f %20.8f %22.4e"
% (pw("%d" % t, 12), float(np.linalg.norm(w)),
nll(X4, sep, w), ev))
print(" 계수가 계속 커지고 우도가 0 으로 갑니다. 멈추지 않습니다")
print(" 헤세의 고유값이 0 으로 가서 뉴턴도 못 씁니다")
print(" 206강 심화 4 의 완전 분리입니다")
print(" 세 가지 대응을 견줍니다")
print(" %s %s %s %s"
% (pw("무엇을 하나", 24), rw("계수의 크기", 16),
rw("1 빼기 최대 확률", 20), rw("목적함수를 바꾸나", 22)))
lam = 1.0
w_r = np.zeros(3)
for _ in range(2000):
p = sig(X4 @ w_r)
g = X4.T @ (p - sep) / n4 + lam * np.concatenate([[0.0], w_r[1:]]) / n4
w_r -= 5.0 * g
eps = 0.05
t_sm = np.where(sep == 1, 1.0 - eps, eps)
w_s = np.zeros(3)
for _ in range(2000):
p = sig(X4 @ w_s)
g = X4.T @ (p - t_sm) / n4
w_s -= 5.0 * g
w_e = np.zeros(3)
for _ in range(50):
p = sig(X4 @ w_e)
g = X4.T @ (p - sep) / n4
w_e -= 5.0 * g
for nm, ww, ch in [("아무것도 안 함 400 걸음", w, "아니오"),
("릿지 벌점", w_r, "예"),
("라벨 평활", w_s, "예"),
("50 걸음에서 멈춤", w_e, "아니오")]:
gap = 1.0 - float(sig(X4 @ ww).max())
print(" %s %16.6f %20.4e %s"
% (pw(nm, 24), float(np.linalg.norm(ww)), gap, rw(ch, 22)))
print(" 첫 줄은 걸음을 더 주면 계수가 계속 커집니다. 붙잡은 것이 아닙니다")
print(" 릿지와 라벨 평활은 계수를 4.91 과 3.77 에서 멈춰 세웁니다")
print(" 1 빼기 최대 확률이 첫 줄에서는 0 으로 뭉개지고 둘에서는 살아 있습니다")
print(" 릿지와 라벨 평활은 목적함수를 바꾸고 조기 종료는 안 바꿉니다")
print(" 205강 문제 5 의 조기 종료가 여기서도 정규화처럼 작동합니다")
print(" 표본이 적고 변수가 많으면 자주 일어납니다")
print(" %s %s %s %s"
% (pw("표본", 10), rw("변수", 10), rw("완전 분리 비율", 20),
rw("판정", 14)))
for n, p in [(50, 2), (50, 10), (50, 30), (50, 49)]:
cnt = 0
for _ in range(300):
Xr = rng.normal(0, 1, (n, p))
yr = (rng.random(n) < 0.5).astype(float)
A = np.concatenate([np.ones((n, 1)), Xr], axis=1)
wq = np.zeros(p + 1)
for _ in range(300):
pq = sig(A @ wq)
wq -= 2.0 * (A.T @ (pq - yr)) / n
pr = sig(A @ wq)
if np.all((pr > 0.5) == (yr > 0.5)):
cnt += 1
print(" %s %10d %20.4f %s"
% (pw("%d" % n, 10), p, cnt / 300.0,
rw("흔함" if cnt / 300.0 > 0.5 else "드묾", 14)))
print(" 라벨이 무작위인데도 변수가 늘면 완전히 나뉩니다")
print(" 표본 50 에 변수 49 면 거의 언제나 그렇습니다")
print(" 213강의 차원의 저주가 분류에서 나타난 모습입니다")
# --- 문제 5: 실무에서 확인할 것 -----------------------------------------
print(" 실무에서 로지스틱 회귀를 쓸 때 확인할 것을 정리합니다")
print(" %s %s"
% (pw("무엇", 26), rw("왜", 30)))
for a, b in [("수렴했는가", "기울기 크기를 봅니다"),
("계수가 지나치게 큰가", "완전 분리를 의심합니다"),
("변수를 표준화했는가", "정규화와 수렴에 영향"),
("확률이 보정됐는가", "206강 문제 5"),
("표본 대 변수 비", "완전 분리와 과적합")]:
print(" %s %s" % (pw(a, 26), rw(b, 30)))
print(" 첫째 줄을 안 보고 결과를 읽는 일이 흔합니다")
print(" 수렴 판정을 어떻게 하는지 봅니다")
print(" %s %s %s %s"
% (pw("몇 걸음", 12), rw("기울기 크기", 20), rw("목적함수 변화", 20),
rw("계수 변화", 18)))
w = np.zeros(3)
prev_f = nll(X1, y1, w)
prev_w = w.copy()
for t in range(1, 601):
g = X1.T @ (sig(X1 @ w) - y1) / n1
w = w - 1.0 * g
f = nll(X1, y1, w)
if t in [10, 50, 200, 600]:
print(" %s %20.4e %20.4e %18.4e"
% (pw("%d" % t, 12), float(np.linalg.norm(g)),
abs(prev_f - f), float(np.linalg.norm(w - prev_w))))
prev_f = f
prev_w = w.copy()
print(" 기울기 크기가 가장 정직한 기준입니다")
print(" 목적함수 변화는 평탄한 자리에서 작아져 일찍 멈추게 합니다")
print(" 205강 문제 5 의 멈추는 기준과 같은 이야기입니다")
print(" 표준화가 수렴에 얼마나 영향을 주는지 봅니다")
n5 = 3000
z5 = rng.normal(0, 1, (n5, 3))
Xs = np.stack([z5[:, 0], z5[:, 1] * 50.0, z5[:, 2] * 0.02], axis=1)
w5 = np.array([-0.3, 1.0, 0.02, 50.0])
A_raw = np.concatenate([np.ones((n5, 1)), Xs], axis=1)
y5 = (rng.random(n5) < sig(A_raw @ w5)).astype(float)
Xn = (Xs - Xs.mean(axis=0)) / Xs.std(axis=0)
A_std = np.concatenate([np.ones((n5, 1)), Xn], axis=1)
print(" 세 변수의 눈금이 이천 배 차이 납니다")
print(" %s %s %s %s"
% (pw("무엇으로", 22), rw("설계행렬 조건수", 20),
rw("300 걸음 뒤 기울기", 22), rw("판정", 14)))
for nm, A in [("원자료", A_raw), ("표준화한 뒤", A_std)]:
ww = np.zeros(4)
for _ in range(300):
gg = A.T @ (sig(A @ ww) - y5) / n5
ww -= 0.5 * gg
gn = float(np.linalg.norm(A.T @ (sig(A @ ww) - y5) / n5))
print(" %s %20.4e %22.4e %s"
% (pw(nm, 22), float(np.linalg.cond(A)), gn,
rw("안 됨" if gn > 1e-3 else "됨", 14)))
print(" 원자료로는 300 걸음에도 수렴하지 않습니다")
print(" 표준화하면 같은 걸음 수로 훨씬 가까워집니다")
print(" 207강 문제 5 의 조건수 이야기가 반복법에서 수렴 속도로 나타납니다")
print(" 뉴턴은 눈금에 안 걸립니다")
print(" %s %s %s"
% (pw("무엇으로", 22), rw("뉴턴 8 걸음 뒤 기울기", 26), rw("판정", 14)))
for nm, A in [("원자료", A_raw), ("표준화한 뒤", A_std)]:
ww, _ = newton(A, y5, 8)
gn = float(np.linalg.norm(A.T @ (sig(A @ ww) - y5) / n5))
print(" %s %26.4e %s"
% (pw(nm, 22), gn, rw("됨" if gn < 1e-8 else "안 됨", 14)))
print(" 뉴턴은 헤세로 나누므로 눈금이 저절로 보정됩니다")
print(" 그래서 변수가 적으면 뉴턴을 쓰는 것이 마음 편합니다")
print(" 208강은 로지스틱을 풀었습니다. 209강은 여러 갈래로 넓힙니다")
# 207강의 정규방정식 같은 공식이 로지스틱에는 없습니다
# 기울기를 0 으로 둔 식이 w 에 대해 안 풀립니다
# 기울기는 (예측 확률 빼기 관측) 곱하기 x 의 평균입니다
# 예측 확률 안에 w 가 시그모이드로 들어가 있어 분리가 안 됩니다
# 무엇 값 판정
# w 가 0 일 때 기울기 크기 0.29377908 0 아님
# 참 w 에서 기울기 크기 0.01533185 0 아님
# 참 w 에서도 기울기가 정확히 0 이 아닙니다. 표본이 유한하기 때문입니다
# 최대우도 해는 참 w 가 아니라 이 표본에서 기울기가 0 인 자리입니다
# 목적함수가 볼록한지 확인합니다
# 헤세 행렬은 X 전치 D X 이고 D 는 p(1-p) 의 대각행렬입니다
# p(1-p) 가 언제나 양수이므로 양반정부호입니다
# 어느 자리에서 가장 작은 고유값 판정
# 0 에서 0.2283594818 양수
# 참 w 에서 0.0656798637 양수
# 멀리서 0.0008939446 양수
# 어디서든 양수입니다. 그래서 국소 최소가 곧 전역 최소입니다
# 205강 문제 2 에서 교차엔트로피가 시작점에 안 걸렸던 이유입니다
# 멀리서는 헤세가 아주 작아집니다
# 계수를 몇 배로 가장 작은 고유값 0 에서 대비
# 1 0.0656798637 0.287616
# 3 0.0059283668 0.025961
# 10 0.0002098791 0.000919
# 30 0.0000083975 0.000037
# 계수를 키우면 확률이 0 이나 1 에 붙어 p(1-p) 가 0 으로 갑니다
# 곡률이 사라지므로 경사하강이 아주 느려집니다
# 이것이 완전 분리에서 계수가 발산하는 자리와 이어집니다
# 풀 수 있는 방법이 여럿입니다
# 방법 한 걸음에 무엇 걸음당 비용 몇 걸음
# 경사하강 기울기 방향으로 n p 많음
# 뉴턴 헤세로 나눠 n p 제곱 더하기 p 세제곱 적음
# IRLS 가중 최소제곱 한 번 뉴턴과 같음 적음
# 확률적 경사하강 일부만 보고 배치 크기 p 아주 많음
# 둘째와 셋째가 같은 방법입니다. 209강에서 왜 같은지 봅니다
# 두 방법으로 같은 문제를 풉니다
# 몇 걸음 경사하강의 최적과의 차 뉴턴의 최적과의 차
# 1 1.4051e-01 2.1161e-02
# 2 9.6785e-02 1.2482e-03
# 4 5.2277e-02 3.0953e-10
# 8 2.0144e-02 0.0000e+00
# 12 9.2482e-03 0.0000e+00
# 뉴턴은 여덟 걸음에 기계 정밀도까지 갑니다
# 경사하강은 열두 걸음에 아직 멀리 있습니다
# 뉴턴이 이차 수렴이라 자릿수가 걸음마다 두 배로 늡니다
# 경사하강이 몇 걸음 걸리는지 봅니다
# 몇 걸음 최적과의 차 계수와 최적의 거리
# 10 1.3454e-02 0.593611
# 100 4.6597e-08 0.001208
# 1000 0.0000e+00 0.000000
# 3000 0.0000e+00 0.000000
# 1000 걸음이면 경사하강도 같은 자리에 옵니다
# 뉴턴의 여덟 걸음과 견주면 100 배 넘게 걸린 셈입니다
# 대신 걸음당 비용이 훨씬 쌉니다. 변수가 많으면 이야기가 달라집니다
# 변수 개수에 따라 어느 쪽이 나은지 봅니다
# 변수 개수 뉴턴 한 걸음 비용 경사하강 한 걸음 비율
# 10 1.0010e+06 1.0000e+05 10.0
# 100 1.0100e+08 1.0000e+06 101.0
# 1000 1.1000e+10 1.0000e+07 1100.0
# 10000 2.0000e+12 1.0000e+08 20000.0
# 변수가 만 개면 뉴턴 한 걸음이 경사하강의 이만 배입니다
# 그래서 큰 문제에서는 헤세를 안 만듭니다. S10 에서 다시 봅니다
# 뉴턴 한 걸음이 가중 최소제곱 한 번과 같습니다
# 갱신식을 정리하면 z = Xw 더하기 (y 빼기 p) 나누기 p(1-p) 입니다
# 그 z 를 가중치 p(1-p) 로 회귀하면 다음 w 가 나옵니다
# 몇 걸음 뉴턴의 값 IRLS 의 값 차이
# 1 0.4981513682 0.4981513682 0.0000e+00
# 2 0.4782383313 0.4782383313 5.5511e-17
# 4 0.4769901707 0.4769901707 0.0000e+00
# 8 0.4769901704 0.4769901704 0.0000e+00
# 12 0.4769901704 0.4769901704 0.0000e+00
# 완전히 같습니다. 이름만 다른 하나의 방법입니다
# 207강의 가중 최소제곱을 걸음마다 가중치를 바꿔 가며 반복하는 것입니다
# 가중치가 무엇을 뜻하는지 봅니다
# 예측 확률 구간 표본 수 평균 가중치
# 0.0 에서 0.1 355 0.045223
# 0.1 에서 0.3 488 0.150316
# 0.3 에서 0.7 730 0.237279
# 0.7 에서 0.9 297 0.153031
# 0.9 에서 1.0 130 0.051898
# 확률이 0.5 근처인 표본의 가중치가 가장 큽니다
# 이미 확실한 표본은 거의 기여하지 않습니다
# 경계 근처의 표본이 계수를 정합니다. 220강의 서포트 벡터와 닮았습니다
# 표준오차도 여기서 나옵니다
# 계수 추정값 표준오차 참값
# 0 -0.538740 0.058161 -0.5
# 1 1.467037 0.077409 1.5
# 2 -1.092271 0.069930 -1.0
# 헤세의 역행렬이 공분산 추정입니다. 152강의 피셔 정보입니다
# IRLS 를 풀면 계수와 표준오차가 함께 나옵니다
# 자료가 선형으로 완전히 나뉘면 계수가 발산합니다
# 정확히 나뉘는 자료를 만들었습니다
# 몇 걸음 계수의 크기 음의 로그우도 가장 작은 고유값
# 10 4.311109 0.15477233 1.1735e-02
# 50 7.752460 0.09127856 2.5201e-03
# 200 12.810334 0.05499710 6.4700e-04
# 400 16.429320 0.04169090 3.2844e-04
# 계수가 계속 커지고 우도가 0 으로 갑니다. 멈추지 않습니다
# 헤세의 고유값이 0 으로 가서 뉴턴도 못 씁니다
# 206강 심화 4 의 완전 분리입니다
# 세 가지 대응을 견줍니다
# 무엇을 하나 계수의 크기 1 빼기 최대 확률 목적함수를 바꾸나
# 아무것도 안 함 400 걸음 16.429320 0.0000e+00 아니오
# 릿지 벌점 4.913266 3.1368e-06 예
# 라벨 평활 3.768929 5.9146e-05 예
# 50 걸음에서 멈춤 7.752460 2.0849e-09 아니오
# 첫 줄은 걸음을 더 주면 계수가 계속 커집니다. 붙잡은 것이 아닙니다
# 릿지와 라벨 평활은 계수를 4.91 과 3.77 에서 멈춰 세웁니다
# 1 빼기 최대 확률이 첫 줄에서는 0 으로 뭉개지고 둘에서는 살아 있습니다
# 릿지와 라벨 평활은 목적함수를 바꾸고 조기 종료는 안 바꿉니다
# 205강 문제 5 의 조기 종료가 여기서도 정규화처럼 작동합니다
# 표본이 적고 변수가 많으면 자주 일어납니다
# 표본 변수 완전 분리 비율 판정
# 50 2 0.0000 드묾
# 50 10 0.0000 드묾
# 50 30 0.6967 흔함
# 50 49 1.0000 흔함
# 라벨이 무작위인데도 변수가 늘면 완전히 나뉩니다
# 표본 50 에 변수 49 면 거의 언제나 그렇습니다
# 213강의 차원의 저주가 분류에서 나타난 모습입니다
# 실무에서 로지스틱 회귀를 쓸 때 확인할 것을 정리합니다
# 무엇 왜
# 수렴했는가 기울기 크기를 봅니다
# 계수가 지나치게 큰가 완전 분리를 의심합니다
# 변수를 표준화했는가 정규화와 수렴에 영향
# 확률이 보정됐는가 206강 문제 5
# 표본 대 변수 비 완전 분리와 과적합
# 첫째 줄을 안 보고 결과를 읽는 일이 흔합니다
# 수렴 판정을 어떻게 하는지 봅니다
# 몇 걸음 기울기 크기 목적함수 변화 계수 변화
# 10 5.5786e-02 2.9391e-03 5.5786e-02
# 50 2.2956e-03 5.0966e-06 2.2956e-03
# 200 1.1267e-07 1.2268e-14 1.1267e-07
# 600 1.5164e-16 0.0000e+00 0.0000e+00
# 기울기 크기가 가장 정직한 기준입니다
# 목적함수 변화는 평탄한 자리에서 작아져 일찍 멈추게 합니다
# 205강 문제 5 의 멈추는 기준과 같은 이야기입니다
# 표준화가 수렴에 얼마나 영향을 주는지 봅니다
# 세 변수의 눈금이 이천 배 차이 납니다
# 무엇으로 설계행렬 조건수 300 걸음 뒤 기울기 판정
# 원자료 2.5315e+03 2.7597e+01 안 됨
# 표준화한 뒤 1.0339e+00 3.4750e-07 됨
# 원자료로는 300 걸음에도 수렴하지 않습니다
# 표준화하면 같은 걸음 수로 훨씬 가까워집니다
# 207강 문제 5 의 조건수 이야기가 반복법에서 수렴 속도로 나타납니다
# 뉴턴은 눈금에 안 걸립니다
# 무엇으로 뉴턴 8 걸음 뒤 기울기 판정
# 원자료 1.5168e-16 됨
# 표준화한 뒤 6.8344e-18 됨
# 뉴턴은 헤세로 나누므로 눈금이 저절로 보정됩니다
# 그래서 변수가 적으면 뉴턴을 쓰는 것이 마음 편합니다
# 208강은 로지스틱을 풀었습니다. 209강은 여러 갈래로 넓힙니다