01단원에서 일차 근사를 세웠습니다.
그런데 이 근사가 아무 말도 하지 않는 자리가 있습니다. 최소나 최대를 찾으려면 인 점을 봐야 하는데, 바로 그곳에서 일차항이 사라집니다.
"근처에서 값이 안 변한다"는 말밖에 못 합니다. 93강 문제 5에서 과 이 원점에서 모두 이런 상태였는데 하나는 최소이고 하나는 안장이었습니다.
그래서 한 차수를 올립니다. 2계 편미분을 모으면 행렬이 되고, 94강의 클레로 정리에 의해 대칭행렬입니다. 대칭행렬이면 86강 스펙트럼 정리가 전부 적용되고, 87강의 양정치성 판정이 그대로 극값 판정이 됩니다.
S4의 06단원이 여기서 통째로 쓰입니다. 그때 만든 도구가 무엇을 위한 것이었는지가 이 단원에서 드러납니다.
문제. 을 봅니다.
(1) 를 구하세요.
(2) 네 개의 2계 편미분을 구하세요.
(3) 에서 행렬로 배열하고 수치로 확인하세요.
생각의 실마리. 94강에서 2계 편미분을 이미 계산했습니다. 새로 하는 일은 배열뿐입니다.
풀이. (1) 각 변수로 미분하면
검산에서 입니다.
(2) 한 번 더 미분하면
(3) 에서 , , 이므로
검산의 수치 헤세가 같은 값을 냅니다.
이 문제에서 배우는 것: 헤세 행렬.
헤세 행렬. 의 2계 편미분을 모은 행렬
을 헤세 행렬이라 합니다.
미분의 결과가 차수마다 자라는 모습을 정리합니다.
| 차수 | 결과 | 크기 |
|---|---|---|
| 함숫값 | 수 | |
| 기울기 | ||
| 헤세 | ||
| 3계 텐서 |
넷째 줄이 실무에서 쓰이지 않는 이유가 크기에 있습니다. 이면 헤세만 해도 성분이 개라 저장할 수 없습니다. 심화 4에서 이 문제를 다룹니다.
계산 순서에 요령이 있습니다. 를 먼저 다 구한 뒤 각 성분을 미분하면, 같은 식을 두 번 계산하지 않습니다. 그리고 클레로 정리 덕분에 개만 구하면 됩니다.
바로 확인 1.
확인 1-1. 헤세 행렬의 정의를 쓰세요.
답. 2계 편미분을 모은 행렬입니다.
확인 1-2. 의 헤세를 구하세요.
답. 입니다.
확인 1-3. 변수에서 실제로 계산할 성분은 몇 개입니까?
답. 대칭이므로 개입니다.
문제. 문제 1의 를 봅니다.
(1) 가 대칭인지 확인하세요.
(2) 고유값을 구하세요.
(3) 고유벡터를 구하고 서로 직교하는지 확인하세요.
생각의 실마리. 86강에서 대칭행렬의 성질을 정리했습니다. 여기에 그 정리를 적용하기만 하면 됩니다.
풀이. (1) 이므로 대칭입니다. 검산에서 확인됩니다.
(2) 검산에서
특성방정식으로도 확인할 수 있습니다. 이고 이므로
이라 과 입니다.
(3) 검산에서 고유벡터가
이고 내적이 정확히 입니다.
이 문제에서 배우는 것: 스펙트럼 정리가 그대로 적용됩니다.
86강 스펙트럼 정리. 실대칭행렬은 실수 고유값을 가지며 직교하는 고유벡터의 정규직교기저로 대각화됩니다.
클레로 정리가 이 모든 것의 입장권입니다. 가 아니었다면 고유값이 복소수일 수도 있었고, 고유벡터가 직교하지 않았을 수도 있었습니다.
94강 문제 4의 반례가 여기서 다시 의미를 얻습니다. 혼합편미분이 다른 함수에서는 헤세가 대칭이 아니라 이 사슬이 끊어집니다. 다행히 실무의 함수는 거의 모두 라 대칭이 보장됩니다.
고유벡터가 뜻하는 것은 다음 문제에서 봅니다. 미리 말하면 곡률이 극단이 되는 방향입니다.
바로 확인 2.
확인 2-1. 헤세가 대칭인 근거를 쓰세요.
답. 클레로 정리에 의해 이기 때문입니다.
확인 2-2. 대칭행렬의 고유값은 어떤 수입니까?
답. 항상 실수입니다.
확인 2-3. 서로 다른 고유값의 고유벡터는 어떤 관계입니까?
답. 직교합니다.
문제. 문제 1의 와 단위벡터들을 봅니다.
(1) , , 에 대해 를 구하세요.
(2) 모든 단위벡터에 대해 이 값의 최소와 최대를 구하세요.
(3) 고유값과 비교하세요.
생각의 실마리. 87강에서 이차형식을 다뤘고 86강 심화 1에서 레일리 몫을 봤습니다. 같은 계산입니다.
풀이. (1) 검산에서
| 방향 | \mathbf{u}^{\top}H\mathbf |
|---|---|
**첫 값이 이고 셋째 값이 **입니다. 둘째는 입니다.
(2) 검산에서 각도를 개로 훑으면 최소 , 최대 입니다.
(3) 고유값과 정확히 같습니다.
이 문제에서 배우는 것: 헤세는 방향별 곡률을 담습니다.
이차 방향도함수. 가 이면 단위벡터 에 대해
입니다.
96강에서 가 방향별 기울기였듯, 는 방향별 휘어짐입니다. 심화 2에서 증명하고 검산으로 확인합니다.
86강 레일리 몫. 대칭행렬 에 대해
이며 등호는 해당 고유벡터 방향에서 성립합니다.
두 사실을 합치면 고유값과 고유벡터의 뜻이 나옵니다.
| 대상 | 뜻 |
|---|---|
| \lambda_ | 가장 심하게 위로 휘는 정도 |
| \lambda_ | 가장 심하게 아래로 휘는 정도 |
| 고유벡터 | 그 극단이 일어나는 방향 |
96강과 나란히 놓으면 구조가 분명합니다.
| 차수 | 도구 | 방향별 값 | 극단 |
|---|---|---|---|
| \nabla f\cdot\mathbf | |||
| \mathbf{u}^{\top}H\mathbf | \lambda_{\min},\lambda_ |
일차는 코시-슈바르츠가, 이차는 레일리 몫이 극단을 줍니다. 이 점에서 이므로 어떤 방향으로는 위로 휘고 어떤 방향으로는 아래로 휩니다. 다만 이 점은 이라 임계점이 아니므로 안장이라 부르지는 않습니다.
바로 확인 3.
확인 3-1. 의 뜻을 쓰세요.
답. 방향의 이차 변화율, 즉 휘어짐입니다.
확인 3-2. 이 값의 최대와 최소는 무엇입니까?
답. 의 최대 고유값과 최소 고유값입니다.
확인 3-3. 은 무엇입니까?
답. 입니다.
문제. 다음 네 함수의 원점에서의 헤세와 고유값을 구하고, 원점의 성격을 판정하세요.
(1)
(2)
(3)
(4) x^
생각의 실마리. 문제 3에서 가 방향별 휘어짐이라 했습니다. 모든 방향에서 위로 휘면 최소일 것입니다.
풀이. 검산에서
| 함수 | 고유값 | 판정 |
|---|---|---|
| x^{2}+y^ | 양정치, 최소 | |
| 음정치, 최대 | ||
| x^{2}-y^ | 부정, 안장 | |
| x^ | 준정치, 판정 보류 |
넷째가 중요합니다. 은 축 전체가 최솟값 자리라 최소이기는 하되 유일하지 않습니다. 그런데 도 같은 헤세를 갖고 원점이 최소이며, 도 같은 헤세인데 원점이 안장입니다. 고유값이 을 포함하면 헤세만으로 결정되지 않습니다.
이 문제에서 배우는 것: 판정의 뼈대.
판정 예고. 일 때 의 고유값 부호로 다음과 같이 분류합니다.
| 고유값 | 이차형식 | 임계점 |
|---|---|---|
| 모두 양수 | 양정치 | 극소 |
| 모두 음수 | 음정치 | 극대 |
| 부호가 섞임 | 부정 | 안장 |
| 을 포함 | 준정치 | 판정 보류 |
87강에서 만든 분류가 그대로입니다. 그때는 이차형식 의 부호를 다뤘고, 여기서는 그 이차형식이 함수의 이차 근사입니다.
임계점에서 함수는 국소적으로 이차형식처럼 보입니다. 100강에서 이 근사를 정식화하고 101강에서 판정을 증명합니다.
93강 문제 5와 이어집니다. 그때 등고선으로 안장을 알아봤는데, 이제 계산으로 판정합니다.
| 방법 | 도구 | 강의 |
|---|---|---|
| 등고선이 교차하는지 봅니다 | 눈 | 93 |
| 고유값 부호를 셉니다 | 계산 | 99, 101 |
바로 확인 4.
확인 4-1. 고유값이 모두 양수이면 임계점은 무엇입니까?
답. 극소입니다.
확인 4-2. 부호가 섞이면 무엇입니까?
답. 안장입니다.
확인 4-3. 고유값에 이 있으면 어떻게 합니까?
답. 헤세만으로는 판정할 수 없어 더 높은 차수를 봐야 합니다.
문제. 를 하나의 벡터함수로 봅니다.
(1) 이 함수의 야코비 행렬 크기를 쓰세요.
(2) 그 성분을 의 편미분으로 표현하세요.
(3) 문제 1의 점에서 수치로 확인하세요.
생각의 실마리. 98강 문제 5에서 라 적어 두었습니다. 왜 그런지를 확인합니다.
풀이. (1) 입력이 개이고 출력이 개이므로 입니다.
(2) 이므로 야코비의 행 열은 번째 성분을 번째 변수로 미분한 것입니다.
(3) 검산에서 수치 야코비가 로 와 같습니다.
이 문제에서 배우는 것: 헤세는 기울기장의 야코비입니다.
이 관점이 여러 가지를 설명합니다.
첫째, 대칭성의 다른 이름입니다. 일반적인 벡터함수의 야코비는 대칭일 이유가 없습니다. 그런데 처럼 어떤 스칼라함수의 기울기인 벡터장은 야코비가 대칭입니다. 거꾸로도 성립합니다.
보존장 판정. 단순연결 영역에서 벡터장 가 어떤 의 기울기가 될 필요충분조건은 가 대칭인 것입니다.
이면 조건이 입니다. 물리에서 보존력의 조건이고, 이 사실이 미분형식과 스토크스 정리로 이어집니다.
둘째, 이차 근사가 일차 근사의 반복입니다. 에 98강의 선형근사를 적용하면
기울기가 어떻게 변하는지를 헤세가 말합니다. 이 식이 112강 뉴턴법의 출발점입니다. 기울기를 으로 만들고 싶으니
뉴턴법의 갱신식이 두 줄로 나옵니다. 96강 심화 3에서 이 방향이 헤세 노름의 최급강하라 했는데, 여기서는 "기울기의 선형근사를 풀었다"는 다른 설명을 얻습니다.
셋째, 계산 방법을 줍니다. 심화 4에서 헤세를 만들지 않고 만 얻는 방법이 이 관점에서 나옵니다.
바로 확인 5.
확인 5-1. 헤세를 야코비로 표현하세요.
답. 입니다.
확인 5-2. 기울기의 선형근사를 쓰세요.
답. 입니다.
확인 5-3. 이 식에서 뉴턴법의 방향을 유도하세요.
답. 기울기를 으로 두면 입니다.
| 개념 | 내용 |
|---|---|
| H_ | 2계 편미분의 행렬 |
| 대칭성 | 클레로 정리에서 옵니다 |
| H_{f}=J_ | 기울기장의 야코비입니다 |
| \mathbf{u}^{\top}H\mathbf | 방향별 이차 변화율 |
| 레일리 몫 | \lambda_{\min}\le\mathbf{u}^{\top}H\mathbf{u}\le\lambda_ |
| 고유값 | 이차형식 | 임계점 |
|---|---|---|
| 모두 양수 | 양정치 | 극소 |
| 모두 음수 | 음정치 | 극대 |
| 섞임 | 부정 | 안장 |
| 포함 | 준정치 | 보류 |
| 최적화와의 연결 | 내용 |
|---|---|
| \lambda_ | 학습률 상한 2/\lambda_ |
| \lambda_{\max}/\lambda_ | 조건수, 수렴 속도 |
| 뉴턴법의 방향 | |
| H\mathbf | 행렬 없이 계산 가능 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 헤세가 항상 대칭이라 여깁니다 | 클레로 조건이 필요합니다 |
| 고유값 자체가 좌표 무관이라 봅니다 | 부호 개수만 불변입니다 |
| 준정치에서 결론을 냅니다 | 더 높은 차수를 봐야 합니다 |
| 큰 문제에서 를 만듭니다 | 만 계산합니다 |
문제 6. 의 헤세를 구하세요.
답. 이며 상수행렬입니다.
문제 7. 문제 6의 고유값을 구하고 원점의 성격을 판정하세요.
답. 이므로 와 입니다. 부호가 섞여 안장입니다.
문제 8. 의 헤세를 구하세요.
답. 입니다.
문제 9. 문제 8의 헤세의 대각합을 구하고 뜻을 쓰세요.
답. 입니다. 고유값의 합이 이라 항상 안장이거나 퇴화입니다.
문제 10. 의 헤세를 구하세요.
답. 입니다.
문제 11. 문제 10의 원점의 성격을 판정하세요.
답. 고유값이 모두 양수라 양정치이고 극소입니다.
문제 12. 헤세에서 이면 무엇입니까?
답. 고유값의 곱이 음수라 부호가 섞이므로 안장입니다.
문제 13. 이고 이면 무엇입니까?
답. 두 고유값이 같은 부호이고 대각합이 양수 쪽이라 양정치, 극소입니다.
문제 14. 의 원점 헤세를 구하고 판정하세요.
답. 영행렬이라 준정치입니다. 헤세로는 판정할 수 없지만 실제로는 극소입니다.
문제 15. 과 과 의 원점 헤세를 비교하세요.
답. 셋 다 입니다. 그런데 성격은 각각 최소, 최소, 안장입니다.
문제 16. 가 에서 무엇입니까?
답. 입니다.
문제 17. 헤세의 대각합은 무엇의 합입니까?
답. 고유값의 합이며 입니다. 라플라시안이라 부릅니다.
문제 18. 일 때 헤세의 성분 수를 쓰고 저장 가능한지 말하세요.
답. 개이며 저장할 수 없습니다. 만 계산해야 합니다.
심화 1. 좌표를 바꾸면 헤세가 어떻게 변하는지 논하세요.
중요한 질문입니다. 고유값으로 임계점을 분류한다면, 좌표계를 바꿔 고유값이 달라지면 분류도 달라지는 것 아닌지 확인해야 합니다.
로 좌표를 바꾸면 이차형식이
가 되므로 새 헤세는 입니다.
이것은 닮음변환이 아니라 합동변환입니다. 77강에서 다룬 닮음은 였습니다. 가 직교행렬이면 이라 둘이 같지만, 일반적으로는 다릅니다.
검산에서 확인합니다.
| 변환 | 고유값 | 부호 |
|---|---|---|
| 원래 | 양 , 음 | |
| 양 , 음 | ||
| 양 , 음 | ||
| 전단 | 양 , 음 |
고유값은 에서 까지 요동치는데 부호 개수는 언제나 입니다.
이 현상에 이름이 있습니다.
실베스터 관성법칙. 실대칭행렬 와 가역행렬 에 대해 의 양수 고유값 개수, 음수 고유값 개수, 고유값 개수는 의 것과 같습니다. 이 세 수를 부호수라 합니다.
여기서 결론이 나옵니다.
| 진술 | 좌표에 의존하는가 |
|---|---|
| "이다" | 의존합니다 |
| "양정치이다" | 의존하지 않습니다 |
| "안장이다" | 의존하지 않습니다 |
| "조건수가 이다" | 의존합니다 |
둘째와 셋째 줄이 판정을 정당화합니다. 극소인지 안장인지는 함수의 성질이지 좌표계의 성질이 아니어야 하는데, 관성법칙이 그것을 보장합니다.
넷째 줄이 최적화에서 뜻하는 바가 큽니다. 조건수가 좌표 의존적이므로 좌표를 잘 고르면 조건수를 줄일 수 있습니다. 이것이 전처리이고, 뉴턴법은 를 고르는 것과 같아 조건수를 로 만듭니다. 111강과 112강에서 다룹니다.
비선형 좌표변환에서도 같은 일이 생깁니다. 임계점에서 좌표를 로 바꾸면 새 헤세가 가 되며(는 의 야코비), 덕분에 의 2계 항이 기여하지 않습니다. 임계점에서만 이 식이 깔끔한 것이며, 그래서 헤세 판정이 임계점 전용입니다.
심화 2. 가 이차 방향도함수임을 증명하세요.
로 두고 두 번 미분합니다.
첫 번째 미분. 97강의 연쇄법칙으로
두 번째 미분. 오른쪽은 라는 벡터함수와 상수벡터 의 내적입니다. 성분으로 쓰면
각 항에 다시 연쇄법칙을 적용하면
에서 결론이 나옵니다.
검산에서 확인합니다.
| 방향 | 2계 도함수 | \mathbf{u}^{\top}H\mathbf |
|---|---|---|
증명의 구조가 96강과 같습니다. 그때는 한 번 미분해 를 얻었고 여기서는 한 번 더 미분해 를 얻습니다.
이 세 값이 100강 테일러 근사의 계수가 됩니다. 다변수 함수를 직선 위로 제한해 한 변수 함수로 만들고, 54강의 한 변수 테일러를 적용한 뒤 다시 다변수 언어로 옮기는 것이 100강의 전략입니다.
심화 3. 헤세의 대각합과 행렬식이 각각 무엇을 뜻하는지 논하세요.
대각합부터 봅니다.
이 양을 라플라시안이라 하며 또는 로 씁니다. 84강에서 대각합이 고유값의 합이라 했으므로
모든 방향의 휘어짐을 합친 값입니다. 더 정확히는 평균 곡률에 비례하며, 다음 해석이 성립합니다.
라플라시안의 뜻. 는 주변 작은 구면 위의 평균이 보다 얼마나 큰지에 비례합니다.
| 뜻 | |
|---|---|
| 양수 | 주변 평균이 자기보다 큽니다, 골짜기입니다 |
| 음수 | 주변 평균이 자기보다 작습니다, 봉우리입니다 |
| 주변 평균과 같습니다, 조화함수입니다 |
셋째 줄이 조화함수이며 을 라플라스 방정식이라 합니다. 문제 9의 가 조화함수이고, 조화함수는 내부에 극값을 가질 수 없습니다. 대각합이 이면 고유값의 부호가 반드시 섞이기 때문입니다.
라플라시안은 열방정식 와 확산에서 핵심이며, 156강의 확산과 266강의 확산모형에서 다시 만납니다.
행렬식을 봅니다.
변수에서 특히 유용합니다. 고유값이 둘뿐이라 곱의 부호가 많은 것을 말해 줍니다.
| 뜻 | |
|---|---|
| 음수 | 부호가 섞여 안장입니다 |
| 양수 | 같은 부호이며 로 방향을 정합니다 |
| 판정 보류입니다 |
이것이 101강에서 배울 이변수 판정법입니다. 고유값을 직접 구하지 않고 와 만으로 분류합니다. 계산이 훨씬 쌉니다.
는 기하적으로도 뜻이 있습니다. 98강에서 야코비 행렬식이 부피 배율이었고 이므로, 는 기울기장이 부피를 늘이는 비율입니다. 102강의 가우스 곡률과 연결됩니다.
심화 4. 헤세 행렬을 만들지 않고 쓰는 방법을 설명하세요.
이면 헤세 성분이 개라 저장이 불가능합니다. 98강 심화 5의 발상을 여기에 적용합니다.
필요한 것은 대개 행렬이 아니라 ****입니다. 문제 5에서 본 관계를 쓰면
기울기를 두 점에서 구해 빼면 됩니다. 검산에서 확인합니다.
| 방법 | 결과 |
|---|---|
| 직접 | |
| 유한차분 | |
| 최대 오차 | 4.281\times10^ |
다만 유한차분은 94강 심화 5의 문제를 안습니다. 절단오차와 반올림오차의 균형을 맞춰야 하고 정확하지 않습니다. 정확한 방법이 따로 있습니다.
가 상수이므로 는 스칼라함수이고, 그것을 다시 미분하면 됩니다. 자동미분을 두 번 적용하면 절단오차 없이 정확한 값이 나오며, 비용은 기울기 계산의 몇 배 수준입니다.
| 방식 | 비용 | 정확도 |
|---|---|---|
| 전체 구성 | 번의 기울기 계산 | 정확 |
| 유한차분 H\mathbf | 기울기 번 | 근사 |
| 자동미분 H\mathbf | 기울기 몇 배 | 정확 |
이 기법이 있어야 큰 문제에서 이차 정보를 쓸 수 있습니다.
| 알고리즘 | 의 쓰임 |
|---|---|
| 절단 뉴턴법 | 켤레기울기법으로 를 풉니다 |
| 신뢰영역법 | 부분공간에서 이차 모형을 최소화합니다 |
| 스펙트럼 추정 | 멱반복으로 를 잽니다 |
| 곡률 진단 | 손실 지형의 평탄함을 잽니다 |
첫째 줄이 112강의 실용적인 뉴턴법입니다. 을 구하는 대신 선형계 를 반복법으로 풀며, 그 반복법에 필요한 것이 뿐입니다.
셋째 줄은 심화 5로 이어집니다. 를 알면 안전한 학습률을 정할 수 있습니다.
심화 5. 최대 고유값이 학습률의 상한을 정함을 보이세요.
이차함수에서 정확히 분석할 수 있습니다. 이면 이므로 경사하강법은
선형 점화식이며, 85강에서 다룬 형태입니다. 로 대각화하고 로 두면 성분마다 분리됩니다.
모든 성분이 으로 가려면
이면 이 조건은 이고, 모든 에서 성립해야 하므로 가장 엄한 것이 입니다.
검산에서 이라 상한이 입니다.
| 회 뒤 | |
|---|---|
| 7.402610\times10^ | |
| 3.163351\times10^ | |
| 3.044818\times10^ |
는 수렴하고 은 발산합니다. 경계 가 정확히 예측한 대로입니다.
에서 무슨 일이 일어나는지 보면, 이라 성분이 매회 배씩 커집니다. 이며 검산의 과 맞습니다.
여기서 최적화의 근본적인 긴장이 보입니다.
| 성분 | 수렴 인자 |
|---|---|
| 방향 | , 발산을 막아야 합니다 |
| 방향 | , 에 가까워 느립니다 |
큰 고유값이 학습률의 상한을 정하는데, 작은 고유값 방향의 수렴 속도가 그 학습률에 매입니다. 최적 를 고르면 수렴 인자가
이 되어 조건수가 클수록 에 가까워집니다. 93강 심화 5에서 예고한 식이며 110강에서 정식으로 유도합니다.
실무에서 를 어떻게 아는지가 남습니다. 심화 4의 와 멱반복을 쓰면 헤세를 만들지 않고 추정할 수 있으며, 이것이 학습률 탐색의 이론적 근거입니다.
심화 6. 100강과 101강으로 어떻게 이어지는지 정리하세요.
이 강의에서 헤세를 세우고 그 고유값이 무엇을 뜻하는지 봤습니다. 아직 증명하지 않은 것이 둘 있습니다.
첫째, 이차 근사가 정말 좋은 근사인지입니다. 문제 4에서
라 썼는데, 나머지가 얼마나 작은지 말하지 않았습니다. 100강이 이를 정식화합니다. 심화 2에서 본 를 써서 54강의 한 변수 테일러 정리를 옮기면
이고 는 선분 위의 어떤 점입니다. 오차가 이며 계수가 곡률입니다. 95강 심화 3에서 예고한 그대로입니다.
둘째, 고유값 부호가 정말 극값을 결정하는지입니다. 문제 4에서 표만 제시했고 증명하지 않았습니다. 101강이 이를 증명합니다. 증명의 뼈대는 100강의 나머지항과 레일리 몫입니다. 가 양정치이면 근방에서도 양정치이므로
이라 극소입니다.
02단원의 구조를 정리합니다.
| 강의 | 하는 일 |
|---|---|
| 99 | 헤세를 세우고 고유값의 뜻을 밝힙니다 |
| 100 | 이차 근사를 정식화하고 오차를 잽니다 |
| 101 | 고유값 부호로 극값을 판정하고 증명합니다 |
| 102 | 곡률로 기하적 뜻을 완성합니다 |
101강이 목표이고 100강이 도구입니다. 그리고 102강이 이 단원을 기하로 마무리하며, 63강의 벡터기하와 88강의 특이값이 곡률로 되살아납니다.
04단원이 이 단원의 결과를 씁니다. 최소를 찾는 알고리즘을 만들려면 무엇이 최소인지 먼저 알아야 하고, 얼마나 빨리 찾을 수 있는지는 심화 5에서 본 대로 헤세의 고유값이 정합니다.
import numpy as np
# --- 문제 1: 헤세 행렬 세우기 -------------------------------------------
# f = x^3 y + 2x y^2 - y^3
fx = lambda x, y: 3*x**2*y + 2*y**2
fy = lambda x, y: x**3 + 4*x*y - 3*y**2
fxx = lambda x, y: 6*x*y
fxy = lambda x, y: 3*x**2 + 4*y
fyy = lambda x, y: 4*x - 6*y
f = lambda x, y: x**3*y + 2*x*y**2 - y**3
p = (1.0, 2.0)
H = np.array([[fxx(*p), fxy(*p)], [fxy(*p), fyy(*p)]])
print(" grad f(1,2) = (%.0f, %.0f)" % (fx(*p), fy(*p)))
print(" H(1,2) =\n", H)
e = 1e-4
num = np.array([[ (f(p[0]+e,p[1])-2*f(*p)+f(p[0]-e,p[1]))/e**2,
(f(p[0]+e,p[1]+e)-f(p[0]+e,p[1]-e)-f(p[0]-e,p[1]+e)+f(p[0]-e,p[1]-e))/(4*e**2)],
[ 0.0, (f(p[0],p[1]+e)-2*f(*p)+f(p[0],p[1]-e))/e**2]])
num[1,0] = num[0,1]
print(" 수치 헤세 =\n", np.round(num, 4))
# grad f(1,2) = (14, -3)
# H(1,2) =
# [[12. 11.]
# [11. -8.]]
# 수치 헤세 =
# [[12. 11.]
# [11. -8.]]
# --- 문제 2: 대칭성과 스펙트럼 정리 -------------------------------------
print(" H 가 대칭인가:", bool(np.allclose(H, H.T)))
lam, V = np.linalg.eigh(H)
print(" 고유값 %s" % np.round(lam, 6))
print(" 고유벡터(열) =\n", np.round(V, 6))
print(" 고유벡터 직교 확인 v1.v2 = %+.3e" % (V[:,0] @ V[:,1]))
# H 가 대칭인가: True
# 고유값 [-12.866069 16.866069]
# 고유벡터(열) =
# [[ 0.404554 -0.914514]
# [-0.914514 -0.404554]]
# 고유벡터 직교 확인 v1.v2 = +0.000e+00
# --- 문제 3: 이차형식으로 읽기 ------------------------------------------
print(" 방향 h^T H h")
for th in [0.0, np.pi/4, np.pi/2]:
u = np.array([np.cos(th), np.sin(th)])
print(" (%+.4f,%+.4f) %+12.6f" % (u[0], u[1], u @ H @ u))
print(" 레일리 몫의 최소 %.6f, 최대 %.6f" % (lam[0], lam[-1]))
ths = np.linspace(0, 2*np.pi, 200000)
U = np.stack([np.cos(ths), np.sin(ths)], 1)
q = np.einsum('ij,jk,ik->i', U, H, U)
print(" 각도를 훑어본 최소 %.6f, 최대 %.6f" % (q.min(), q.max()))
# 방향 h^T H h
# (+1.0000,+0.0000) +12.000000
# (+0.7071,+0.7071) +13.000000
# (+0.0000,+1.0000) -8.000000
# 레일리 몫의 최소 -12.866069, 최대 16.866069
# 각도를 훑어본 최소 -12.866069, 최대 16.866069
# 20만 개 방향을 훑어도 고유값 밖으로 나가지 못합니다.
# --- 문제 4: 세 가지 대표 헤세 ------------------------------------------
for name, M in [("x^2+y^2 ", np.array([[2.,0.],[0.,2.]])),
("-(x^2+y^2)", np.array([[-2.,0.],[0.,-2.]])),
("x^2-y^2 ", np.array([[2.,0.],[0.,-2.]])),
("x^2 ", np.array([[2.,0.],[0.,0.]]))]:
w = np.linalg.eigvalsh(M)
if (w > 0).all(): kind = "양정치, 최소"
elif (w < 0).all(): kind = "음정치, 최대"
elif (w > 0).any() and (w < 0).any(): kind = "부정, 안장"
else: kind = "준정치, 판정 보류"
print(" %s 고유값 %s -> %s" % (name, np.round(w, 1), kind))
# x^2+y^2 고유값 [2. 2.] -> 양정치, 최소
# -(x^2+y^2) 고유값 [-2. -2.] -> 음정치, 최대
# x^2-y^2 고유값 [-2. 2.] -> 부정, 안장
# x^2 고유값 [0. 2.] -> 준정치, 판정 보류
# --- 문제 5: 헤세는 grad 의 야코비 --------------------------------------
g = lambda v: np.array([fx(v[0], v[1]), fy(v[0], v[1])])
a = np.array(p); e2 = 1e-6
Jg = np.array([(g(a + e2*np.array([1.,0.])) - g(a - e2*np.array([1.,0.])))/(2*e2),
(g(a + e2*np.array([0.,1.])) - g(a - e2*np.array([0.,1.])))/(2*e2)]).T
print(" grad 의 야코비 =\n", np.round(Jg, 4))
print(" H 와 같은가:", bool(np.allclose(Jg, H, atol=1e-4)))
# grad 의 야코비 =
# [[12. 11.]
# [11. -8.]]
# H 와 같은가: True
# --- 심화 4: 헤세-벡터 곱은 행렬 없이 -----------------------------------
v = np.array([0.6, 0.8])
print(" H @ v =", np.round(H @ v, 6))
d = 1e-6
hv = (g(a + d*v) - g(a - d*v))/(2*d)
print(" 유한차분 Hv =", np.round(hv, 6))
print(" 최대 오차 %.3e" % np.abs(hv - H @ v).max())
# H @ v = [16. 0.2]
# 유한차분 Hv = [16. 0.2]
# 최대 오차 4.281e-10
# --- 심화 1: 좌표를 바꾸면 고유값은 변해도 부호 개수는 남는다 -----------
print(" 원래 H 고유값 %s" % np.round(np.linalg.eigvalsh(H), 4))
for name, P in [("P=diag(2,1)", np.array([[2.,0.],[0.,1.]])),
("P=diag(1,5)", np.array([[1.,0.],[0.,5.]])),
("P=전단 ", np.array([[1.,3.],[0.,1.]]))]:
Hc = P.T @ H @ P
w = np.linalg.eigvalsh(Hc)
print(" %s 후 고유값 %s 부호 (양 %d, 음 %d)" % (name, np.round(w, 4), (w > 0).sum(), (w < 0).sum()))
# 원래 H 고유값 [-12.8661 16.8661]
# P=diag(2,1) 후 고유값 [-15.609 55.609] 부호 (양 1, 음 1)
# P=diag(1,5) 후 고유값 [-213.4194 25.4194] 부호 (양 1, 음 1)
# P=전단 후 고유값 [ -1.2109 179.2109] 부호 (양 1, 음 1)
# 고유값은 -213 에서 179 까지 요동치는데 부호 개수는 언제나 (1,1) 입니다.
# --- 심화 2: 방향별 이차 변화율 -----------------------------------------
print(" 방향 2계 도함수 u^T H u")
for th in [0.0, np.pi/4, np.pi/2]:
u = np.array([np.cos(th), np.sin(th)])
s = 1e-4
d2 = (f(*(a + s*u)) - 2*f(*a) + f(*(a - s*u)))/s**2
print(" (%+.4f,%+.4f) %+12.6f %+12.6f" % (u[0], u[1], d2, u @ H @ u))
# 방향 2계 도함수 u^T H u
# (+1.0000,+0.0000) +12.000000 +12.000000
# (+0.7071,+0.7071) +13.000000 +13.000000
# (+0.0000,+1.0000) -8.000000 -8.000000
# --- 심화 5: 최대 고유값이 학습률 상한을 정한다 -------------------------
Hq = np.array([[1.0, 0.0], [0.0, 100.0]])
lam_q = np.linalg.eigvalsh(Hq)
print(" f=(x^2+100y^2)/2 의 고유값 %s" % lam_q)
print(" 안정 학습률 상한 2/lambda_max = %.4f" % (2/lam_q[-1]))
for eta in [0.005, 0.019, 0.021]:
x = np.array([1.0, 1.0])
for _ in range(60):
x = x - eta*(Hq @ x)
print(" eta=%.3f -> 60회 뒤 ||x|| = %.6e" % (eta, np.linalg.norm(x)))
# f=(x^2+100y^2)/2 의 고유값 [ 1. 100.]
# 안정 학습률 상한 2/lambda_max = 0.0200
# eta=0.005 -> 60회 뒤 ||x|| = 7.402610e-01
# eta=0.019 -> 60회 뒤 ||x|| = 3.163351e-01
# eta=0.021 -> 60회 뒤 ||x|| = 3.044818e+02
# 경계 0.02 를 넘는 순간 발산합니다. 1.1^60 = 304 와 맞습니다.
두 결과가 이 강의의 요지입니다. 좌표를 바꾸면 고유값은 요동쳐도 부호 개수는 남고, 최대 고유값이 학습률의 상한을 정확히 정합니다.
100강에서 이차 근사를 정식화합니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| H_ | 헤세 행렬 | 2계 편미분의 대칭행렬입니다 |
| \mathbf{u}^{\top}H\mathbf | 이차형식 | 방향별 휘어짐입니다 |
| \lambda_{\max},\lambda_ | 최대·최소 고유값 | 휘어짐의 극단입니다 |
| 라플라시안 | 모든 방향의 휘어짐 합입니다 | |
| 행렬식 | 고유값의 곱입니다 | |
| 합동변환 | 좌표변환 뒤의 헤세입니다 | |
| 부호수 | signature | 양·음·영 고유값의 개수입니다 |
| 실베스터 관성법칙 | Sylvester | 부호수가 합동에 불변입니다 |
| H\mathbf | 헤세-벡터 곱 | 행렬을 만들지 않고 계산합니다 |
다음 100강에서는 다변수 테일러 근사를 다룹니다. 심화 2에서 본 를 써서 54강의 한 변수 테일러 정리를 다변수로 옮기고, 나머지항의 크기를 헤세의 노름으로 잽니다. 그 결과가 101강의 판정 증명과 110강의 수렴 해석에 그대로 쓰입니다.