119강에서 경사하강법이 전진 오일러라고 했습니다. 그리고 전진 오일러의 오차가 라고 했습니다.
자연스러운 질문이 나옵니다. 더 정확한 방법이 있다면 최적화도 더 좋아지지 않겠습니까.
미분방정식 수치해법에는 150년 넘게 쌓인 방법들이 있습니다. 대표가 룽게쿠타법이며, 표준인 RK4는 정확도를 냅니다. 같은 계산량으로 오차가 10만 배 줄어듭니다.
그런데 이 강의의 결론은 반대 방향입니다. 최적화에 RK4를 쓰면 오히려 느려집니다. 이유를 알아내는 것이 이번 강의의 목적이며, 그 과정에서 정확도와 안정성이 서로 다른 요구라는 것이 드러납니다.
| 무엇을 원하는가 | 무엇이 중요한가 |
|---|---|
| 궤적을 정확히 재현합니다 | 정확도 차수가 중요합니다 |
| 최소점에 도달합니다 | 비용당 안정 시간이 중요합니다 |
91강의 수치적분과 100강의 테일러 전개가 다시 도구가 됩니다. 이 강의로 06단원과 S5가 마무리됩니다.
문제. , 의 정확해는 입니다.
(1) 정확해가 맞는지 확인하세요.
(2) 에서 오일러법의 오차를 를 절반씩 줄이며 재세요.
(3) 오차의 비로 수렴 차수를 판정하세요.
생각의 실마리. 119강에서 전체 오차가 라고 주장했습니다. 주장을 수치로 확인하는 표준 절차가 를 절반으로 줄이며 오차 비를 보는 것입니다.
풀이. (1) 를 미분하면 이고, 한편
이라 같습니다. 도 맞습니다.
(2) 정확해는 입니다. 검산 결과입니다.
| 오일러 | 오차 | 앞 줄 오차와의 비 | |
|---|---|---|---|
| 4.396874\times10^ | 없습니다 | ||
| 2.419719\times10^ | |||
| 1.274657\times10^ | |||
| 6.549505\times10^ | |||
| 3.320765\times10^ |
(3) 비가 로 수렴합니다. 를 절반으로 줄이면 오차가 절반이 되므로 오차가 에 비례하며, 1차 정확도입니다.
이 문제에서 배우는 것: 국소 오차와 전역 오차.
국소 절단 오차. 한 걸음에서 생기는 오차이며 오일러법은 입니다.
전역 오차. 고정 시각 까지 누적된 오차이며 오일러법은 입니다.
차수가 하나 떨어지는 이유가 걸음 수 때문입니다. 100강의 테일러 전개에서
이고 오일러법은 까지만 쓰므로 한 걸음 오차가 입니다. 그런데 까지 가려면 번 걸어야 하므로
가 됩니다. 차 국소 오차는 차 전역 오차를 줍니다.
차수 판정법. 를 절반으로 줄일 때 오차 비가 에 가까우면 차 방법입니다.
이 절차는 어떤 수치 방법에도 쓸 수 있는 진단 도구입니다. 구현이 틀렸으면 차수가 나오지 않으므로 검증 수단도 됩니다.
표의 비가 에서 로 천천히 올라가는 것은 고차 항이 아직 남아 있기 때문이며, 를 더 줄이면 에 더 가까워집니다.
바로 확인 1.
확인 1-1. 오일러법의 국소 오차와 전역 오차 차수를 쓰세요.
답. 국소가 이고 전역이 입니다.
확인 1-2. 차수가 하나 떨어지는 이유를 쓰세요.
답. 번 누적되기 때문입니다.
확인 1-3. 를 절반으로 줄여 오차 비가 면 몇 차입니까?
답. 이므로 2차입니다.
문제. 중점법 , , 를 봅니다.
(1) 테일러 전개로 국소 오차 차수를 구하세요.
(2) 같은 시험 문제에서 오차와 비를 재세요.
(3) 왜 중간점을 쓰는 것이 이득인지 설명하세요.
생각의 실마리. 오일러법은 구간 시작점의 기울기로 구간 전체를 대표시킵니다. 91강의 수치적분에서 좌끝점 규칙이 나빴던 것과 같은 구조입니다. 중점 규칙이 좋았던 이유가 여기서도 통합니다.
풀이. (1) 정확한 한 걸음은 다음과 같습니다.
한편 이고 97강의 연쇄법칙으로 입니다. 중점법의 를 2변수 테일러로 펴면
이므로
입니다. 항까지 정확히 맞습니다. 따라서 국소 오차가 이고 전역 오차가 입니다.
(2) 검산 결과입니다.
| 중점법 | 오차 | 앞 줄 오차와의 비 | |
|---|---|---|---|
| 1.510249\times10^ | 없습니다 | ||
| 3.747074\times10^ | |||
| 9.277142\times10^ | |||
| 2.304037\times10^ | |||
| 5.738410\times10^ |
비가 이므로 2차입니다. 에서 오일러법의 오차 와 비교하면 약 배 작습니다.
(3) 오일러법은 기울기가 구간 내내 시작값이라고 가정합니다. 중점법은 구간 중앙의 기울기를 추정해서 씁니다. 91강에서 중점 규칙이 사다리꼴 규칙과 같은 2차였던 것과 정확히 같은 이유입니다.
이 문제에서 배우는 것: 룽게쿠타의 기본 발상.
명시적 룽게쿠타법. 한 걸음 안에서 를 여러 번 평가해 그 가중평균으로 나아갑니다.
계수 , , 를 잘 고르면 테일러 전개가 높은 차수까지 맞습니다. 중점법은 단 방법이고, 계수는 , , 입니다.
2단 방법은 중점법 하나가 아닙니다.
| 이름 | c_ | 차수 | |
|---|---|---|---|
| 중점법 | |||
| 호인법 | |||
| 랄스톤법 |
2차 조건은 이고 입니다. 자유도가 남으므로 방법이 하나로 정해지지 않습니다. 심화 2에서 4단의 경우를 봅니다.
바로 확인 2.
확인 2-1. 중점법의 전역 오차 차수를 쓰세요.
답. 입니다.
확인 2-2. 2단 룽게쿠타의 2차 조건을 쓰세요.
답. 이고 입니다.
확인 2-3. 중점법이 오일러법보다 이득인 이유를 한 줄로 쓰세요.
답. 구간 중앙의 기울기를 써서 항까지 맞추기 때문입니다.
문제. 표준 RK4를 봅니다.
(1) 시험 문제에서 오차와 비를 재어 차수를 확인하세요.
(2) 호출 수를 같게 맞춰 세 방법을 비교하세요.
(3) 결과가 뜻하는 바를 쓰세요.
생각의 실마리. RK4는 한 걸음에 를 네 번 부릅니다. 따라서 같은 로 비교하면 불공평하며, 호출 수를 같게 맞춰야 합니다.
풀이. (1) 검산 결과입니다.
| RK4 | 오차 | 비 | 호출 수 | |
|---|---|---|---|---|
| 1.089498\times10^ | 없습니다 | |||
| 6.990307\times10^ | ||||
| 4.421339\times10^ | ||||
| 2.778990\times10^ | ||||
| 1.741620\times10^ |
비가 이므로 4차입니다.
(2) 호출 수를 으로 맞추면 이렇게 됩니다.
| 방법 | 호출 수 | 오차 | |
|---|---|---|---|
| 오일러 | 3.320765\times10^ | ||
| 중점법 | 2.304037\times10^ | ||
| RK4 | 4.421339\times10^ |
(3) 같은 비용으로 오차가 배 차이납니다. 오일러법 대비 RK4가 약 배 정확합니다. 정확한 궤적이 목표라면 고차 방법을 쓰지 않을 이유가 없습니다.
이 문제에서 배우는 것: 고전 RK4.
RK4.
가중치 이 눈에 익습니다. 91강의 심프슨 공식 가중치 과 같은 구조이며, 가 에만 의존하면 RK4는 정확히 심프슨 공식이 됩니다. 실제로 이면 이므로
입니다. 룽게쿠타법은 수치적분의 일반화입니다.
차수와 단수의 관계에 한계가 있습니다.
| 단수 | 도달 가능한 최대 차수 |
|---|---|
까지는 차수가 단수와 같지만 그 뒤로는 뒤처집니다. 5단으로 5차를 만들 수 없다는 것이 부처의 장벽이며, RK4가 표준으로 자리 잡은 이유입니다. 비용 대비 효율의 정점입니다.
바로 확인 3.
확인 3-1. RK4의 전역 오차 차수를 쓰세요.
답. 입니다.
확인 3-2. RK4가 심프슨 공식과 같아지는 조건을 쓰세요.
답. 가 에 의존하지 않고 에만 의존할 때입니다.
확인 3-3. 5단으로 5차를 만들 수 있습니까?
답. 만들 수 없으며 이를 부처의 장벽이라 부릅니다.
문제. 에 각 방법을 적용하면 꼴이 됩니다.
(1) 세 방법의 증폭 함수 를 구하세요.
(2) 실수축에서 인 구간을 구하세요.
(3) 호출 수로 나눈 값을 비교하세요.
생각의 실마리. 119강 문제 3에서 오일러법이 에서만 안정하다고 했습니다. 같은 분석을 고차 방법에 하는 것입니다.
풀이. (1) 로 두면 각 방법의 갱신이 다음과 같습니다.
| 방법 | |
|---|---|
| 오일러 | |
| 중점법 | 1+z+\dfrac{z^{2}} |
| RK4 | 1+z+\dfrac{z^{2}}{2}+\dfrac{z^{3}}{6}+\dfrac{z^{4}} |
차 방법의 는 의 테일러 다항식 차까지와 일치합니다. 정확해가 이므로 당연합니다.
(2) 검산에서 이렇게 나옵니다.
| 방법 | 안정 구간 의 | 걸음당 호출 수 | 호출 수 |
|---|---|---|---|
| 오일러 | |||
| 중점법 | |||
| RK4 |
(3) 정확도 순위가 뒤집힙니다. RK4의 안정 구간이 가장 넓지만 비용으로 나누면 가장 나쁩니다. 인 뻣뻣한 계에서 확인됩니다.
| 방법 | 허용 | 까지 걸음 수 | 호출 수 |
|---|---|---|---|
| 오일러 | |||
| 중점법 | |||
| RK4 |
오일러법이 가장 적게 부릅니다.
이 문제에서 배우는 것: 정확도와 안정성은 다른 요구다.
안정성 영역. 이며 이 안에 가 들어가야 발산하지 않습니다.
두 개념을 혼동하면 안 됩니다.
| 묻는 것 | 결정하는 것 | |
|---|---|---|
| 정확도 | 궤적을 얼마나 잘 따라가는가 | 차수 |
| 안정성 | 발산하지 않는가 | 영역의 크기 |
고차 방법은 정확도를 크게 개선하지만 안정 영역은 조금만 넓힙니다. 오일러의 에서 RK4의 로 배 늘 뿐인데 비용은 배입니다.
언제 무엇이 중요한지가 갈립니다.
| 상황 | 지배하는 요구 | 유리한 방법 |
|---|---|---|
| 매끄러운 궤적을 정밀히 재현합니다 | 정확도 | 고차 방법 |
| 뻣뻣한 계에서 발산만 막습니다 | 안정성 | 저차 또는 암시적 방법 |
| 평형점에 도달하기만 하면 됩니다 | 안정성 | 저차 방법 |
세 번째 줄이 최적화입니다. 문제 5에서 확인합니다.
바로 확인 4.
확인 4-1. 오일러법의 실수축 안정 구간을 쓰세요.
답. 입니다.
확인 4-2. 차 방법의 가 무엇과 일치합니까?
답. 의 차 테일러 다항식과 일치합니다.
확인 4-3. 비용당 안정 구간이 가장 넓은 방법을 쓰세요.
답. 오일러법이며 호출 수가 입니다.
문제. 경사흐름 , , 에서 까지 갑니다.
(1) 세 방법의 안정 한계 를 구하세요.
(2) 한계의 를 써서 기울기 호출 수를 세세요.
(3) 최적화에 고차 방법이 유리하지 않은 이유를 정리하세요.
생각의 실마리. 우리가 원하는 것은 궤적이 아니라 종점입니다. 궤적을 얼마나 정확히 따라가든 상관없고 최소점에 닿기만 하면 됩니다.
풀이. (1) 이므로 문제 4의 를 로 나눕니다.
(2) 검산 결과입니다.
| 방법 | 안정 한계 | 쓴 | 걸음 수 | 기울기 호출 수 |
|---|---|---|---|---|
| 오일러 | ||||
| 중점법 | ||||
| RK4 |
RK4가 걸음 수는 가장 적지만 호출 수는 거의 세 배입니다.
(3) 기울기 한 번당 나아가는 시간을 보면 즉시 설명됩니다.
| 방법 | 기울기 한 번당 나아가는 시간 |
|---|---|
| 오일러 | |
| 중점법 | |
| RK4 |
오일러법이 가장 효율적입니다.
이 문제에서 배우는 것: 최적화는 궤적이 아니라 종점을 원한다.
핵심 대비. 미분방정식을 푸는 것은 모든 시각의 값이 목표이고, 최적화는 의 값 하나가 목표입니다.
이 차이가 방법 선택을 뒤집습니다.
| 미분방정식 풀이 | 최적화 |
|---|---|
| 중간 궤적이 결과물입니다 | 중간 궤적은 버립니다 |
| 정확도가 품질을 정합니다 | 정확도는 필요 없습니다 |
| 고차 방법이 유리합니다 | 비용당 안정 시간이 유리합니다 |
실무에서 이 결론이 더 강해지는 이유가 세 가지 더 있습니다.
첫째로 기울기 평가가 압도적으로 비쌉니다. 신경망에서 한 번은 역전파 한 번이며, 걸음 수보다 호출 수가 실제 시간을 정합니다.
둘째로 기울기에 잡음이 있습니다. 119강 심화 5에서 본 미니배치 잡음이 크기인데 RK4가 잡는 것은 항입니다. 잡음에 묻힐 정밀도를 비싸게 사는 셈입니다.
셋째로 궤적을 정확히 따라가는 것이 오히려 손해일 수 있습니다. 119강 심화 5에서 잡음이 얕은 극소를 탈출시킨다고 했습니다. 정확한 흐름은 처음 만난 극소에 그대로 갇힙니다.
그러면 최적화의 개선은 어디에서 옵니까. 119강이 답을 줬습니다. 더 정확한 이산화가 아니라 더 좋은 흐름입니다.
| 개선 방향 | 무엇을 바꾸는가 | 해당 강의 |
|---|---|---|
| 고차 이산화 | 같은 흐름을 정밀히 따릅니다 | 이득이 적습니다 |
| 2계 흐름 | 모멘텀을 더합니다 | 111강, 119강 문제 4 |
| 전처리 흐름 | 노름을 바꿉니다 | 112강, 119강 문제 5 |
| 암시적 이산화 | 안정 영역을 무한대로 넓힙니다 | 119강 심화 2 |
바로 확인 5.
확인 5-1. 최적화에서 목표가 무엇입니까?
답. 중간 궤적이 아니라 의 종점입니다.
확인 5-2. RK4가 최적화에서 불리한 직접적인 이유를 쓰세요.
답. 기울기 한 번당 나아가는 시간이 오일러법보다 짧기 때문입니다.
확인 5-3. 기울기 잡음이 있으면 고차 방법의 이점이 어떻게 됩니까?
답. 정밀도가 잡음에 묻혀 사라집니다.
| 개념 | 내용 |
|---|---|
| 국소 오차 | 한 걸음의 오차입니다 |
| 전역 오차 | 국소보다 차수가 하나 낮습니다 |
| 차수 판정 | 절반에 오차 비 입니다 |
| 룽게쿠타 | 한 걸음에 를 여러 번 평가합니다 |
| 증폭 함수 | 이며 의 차 절단입니다 |
| 안정성 영역 | 인 집합입니다 |
| 방법 | 전역 차수 | 호출 | 실수축 |
|---|---|---|---|
| 오일러 | |||
| 중점법 | |||
| RK4 |
| 목표 | 유리한 선택 |
|---|---|
| 궤적 재현 | 고차 방법 |
| 뻣뻣한 계 | 암시적 방법 |
| 최적화 | 저차 방법과 더 좋은 흐름 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 같은 로 방법을 비교합니다 | 호출 수를 맞춰 비교합니다 |
| 고차면 안정 영역도 넓다고 봅니다 | 조금만 넓고 비용은 배로 듭니다 |
| 최적화에 RK4를 씁니다 | 호출당 진행 시간이 짧아 손해입니다 |
| 국소 차수를 전역 차수로 씁니다 | 하나 낮습니다 |
문제 6. 오일러법의 국소 오차 차수를 쓰세요.
답. 입니다.
문제 7. 전역 오차가 국소보다 한 차수 낮은 이유를 쓰세요.
답. 번 누적되기 때문입니다.
문제 8. 를 절반으로 줄여 오차가 이 되면 몇 차입니까?
답. 이므로 4차입니다.
문제 9. 중점법의 두 단계를 쓰세요.
답. , 이고 입니다.
문제 10. 2단 룽게쿠타의 2차 조건을 쓰세요.
답. 이고 입니다.
문제 11. RK4의 가중치를 쓰세요.
답. 입니다.
문제 12. RK4가 심프슨 공식이 되는 조건을 쓰세요.
답. 가 에만 의존할 때입니다.
문제 13. 부처의 장벽을 한 줄로 쓰세요.
답. 5단으로는 5차를 만들 수 없다는 제한입니다.
문제 14. 차 방법의 증폭 함수를 쓰세요.
답. 의 차 테일러 다항식입니다.
문제 15. 오일러법의 실수축 안정 구간을 쓰세요.
답. 입니다.
문제 16. RK4의 실수축 안정 한계를 소수 셋째 자리까지 쓰세요.
답. 입니다.
문제 17. 비용당 안정 구간이 가장 넓은 방법을 쓰세요.
답. 오일러법입니다.
문제 18. 최적화에 고차 방법이 불리한 이유를 한 줄로 쓰세요.
답. 기울기 호출당 나아가는 시간이 짧고 정확도는 필요 없기 때문입니다.
심화 1. 수렴 차수 검증을 실무 도구로 정리하세요.
문제 1의 절차는 구현 검증에 그대로 쓰입니다.
| 단계 | 할 일 |
|---|---|
| 1 | 정확해를 아는 시험 문제를 고릅니다 |
| 2 | 를 절반씩 줄이며 오차를 잽니다 |
| 3 | 연속한 오차의 비를 봅니다 |
| 4 | 비가 면 차가 확인됩니다 |
비가 이론값보다 낮으면 구현에 버그가 있습니다. 예를 들어 RK4를 짰는데 비가 이면 어딘가에서 3차로 떨어진 것이며, 대개 의 인자나 가중치를 틀린 경우입니다.
비가 이론값보다 높으면 가 너무 커서 아직 점근 영역이 아닙니다. 표에서 오일러법의 비가 에서 시작한 것이 이 현상의 반대편이며, 를 줄이면 이론값으로 수렴합니다.
한계도 알아둡니다. 를 지나치게 줄이면 반올림 오차가 지배해서 오차가 다시 커집니다. 60강에서 본 수치 미분의 최적 와 같은 구조이며, 절단 오차 와 반올림 오차 의 균형점이 존재합니다.
심화 2. RK4의 계수가 어떻게 정해지는지 개관하세요.
단 방법의 계수는 차수 조건이라는 연립방정식을 만족해야 합니다. 테일러 전개를 차까지 맞추면 조건이 나옵니다.
| 차수 | 조건 |
|---|---|
| , | |
| 네 개가 더 붙어 모두 여덟 개입니다 |
미지수는 단에서 넷, 셋, 여섯으로 열셋인데 조건이 여덟 개이므로 해가 여럿입니다. 고전 RK4는 이라는 대칭적 선택으로 얻어집니다.
차수 조건의 개수가 급격히 늘어납니다.
| 차수 | 조건 개수 |
|---|---|
5차에서 조건이 열일곱 개인데 5단의 자유도로는 부족합니다. 이것이 부처의 장벽의 정체이며, 조건 개수는 뿌리 달린 나무의 개수와 같다는 부처의 정리로 셉니다.
심화 3. 적응적 시간 간격을 설명하세요.
지금까지 를 고정했습니다. 실제로는 해가 급변하는 구간에서는 잘게, 완만한 구간에서는 성기게 하는 것이 효율적입니다.
문제는 오차를 어떻게 아느냐입니다. 정확해를 모르니까요. 해법이 임베디드 방법입니다.
임베디드 룽게쿠타. 같은 를 재사용해 차 해 와 차 해 을 동시에 만들고, 그 차이를 오차 추정치로 씁니다.
추가 비용이 거의 없다는 것이 핵심입니다. 두 해가 같은 기울기 평가를 공유하기 때문입니다.
갱신 규칙은 오차의 차수에서 나옵니다. 이므로 목표 허용오차 에 대해
로 잡습니다. 계수 는 다시 거부당하지 않으려는 안전 여유입니다.
| 방법 | 차수 쌍 | 단수 |
|---|---|---|
| 룽게쿠타펠베르크 | 와 | |
| 도르만프린스 | 와 | |
| 보가키샴핀 | 과 |
도르만프린스가 오늘날의 표준이며 대부분의 수치 라이브러리에서 기본값입니다.
최적화에서 이 발상이 어떻게 나타나는지가 흥미롭습니다. 110강의 학습률 스케줄과 111강의 적응적 학습률이 같은 문제에 대한 다른 답입니다. 다만 최적화에서는 오차 추정 대신 기울기 크기의 이력을 씁니다.
심화 4. 심플렉틱 적분과 에너지 보존을 설명하세요.
119강 문제 4의 모멘텀 방정식에서 마찰을 없애면 이렇게 됩니다.
이것은 마찰 없는 역학계이며 에너지가 보존됩니다.
그런데 전진 오일러로 풀면 에너지가 계속 늘어납니다. 118강에서 순허수 고유값이 닫힌 궤도를 준다고 했는데, 에서 이므로 나선이 밖으로 벌어집니다. RK4로 바꿔도 오차가 작아질 뿐 장시간에는 결국 어긋납니다.
해법은 차수를 올리는 것이 아니라 구조를 지키는 것입니다.
심플렉틱 오일러. 속도를 먼저 갱신하고 그 새 속도로 위치를 갱신합니다.
1차 방법인데도 에너지가 장기간 유계로 유지됩니다. 정확한 에너지가 아니라 약간 변형된 에너지를 정확히 보존하기 때문이며, 이를 후방 오차 해석이라 부릅니다.
두 순서의 차이가 전부입니다.
| 순서 | 결과 |
|---|---|
| 옛 속도로 위치를 먼저 갱신합니다 | 에너지가 늘어납니다 |
| 새 속도로 위치를 갱신합니다 | 에너지가 유계로 유지됩니다 |
기계학습에서 이것이 쓰이는 자리가 해밀턴 몬테카를로입니다. 사후분포에서 표본을 뽑을 때 심플렉틱 적분기를 쓰며, 에너지 보존이 채택률을 높입니다. S6 확률과 통계에서 다시 만납니다.
111강의 모멘텀 갱신 순서가 왜 그 모양인지도 여기서 설명됩니다. 속도를 먼저 갱신하고 그것으로 위치를 옮기는 형태가 표준인데, 이것이 정확히 심플렉틱 오일러입니다.
심화 5. 뻣뻣한 계에서 암시적 방법이 이기는 지점을 정량화하세요.
인 경사흐름을 봅니다. 119강 심화 2에서 후진 오일러가 무조건 안정이라고 했습니다.
| 방법 | 걸음당 비용 | 허용 | 까지 비용 |
|---|---|---|---|
| 전진 오일러 | 기울기 한 번 | 번 | |
| 후진 오일러 | 선형계 한 번 | 제한 없음 | 몇 번 |
후진 오일러는 걸음 수가 조건수와 무관합니다. 대신 매 걸음 를 풀어야 하며, 81강의 소거법으로 입니다.
손익분기가 계산됩니다. 차원에서
| 총 비용 | |
|---|---|
| 전진 오일러 | |
| 후진 오일러 |
이므로 이면 암시적 방법이 이깁니다.
기계학습에서 이 수억이므로 거의 언제나 명시적 방법이 이깁니다. 파라미터 개수가 조건수보다 훨씬 크기 때문입니다. 반면 물리 시뮬레이션은 이 작고 가 을 넘기도 해서 암시적 방법이 표준입니다.
112강의 뉴턴법이 왜 대규모 학습에 안 쓰이는지가 같은 계산입니다. 을 만드는 비용이 이며, 이것이 준뉴턴법과 대각 근사가 등장한 이유입니다.
심화 6. S5 전체를 흐름의 관점에서 되짚으세요.
S5는 여섯 단원이었고, 마지막 단원이 앞의 다섯을 하나로 묶었습니다.
| 단원 | 무엇을 세웠는가 | 06단원에서 어떻게 쓰였는가 |
|---|---|---|
| 01 다변수 미분 | 와 야코비를 세웠습니다 | 흐름의 오른쪽 변이 되었습니다 |
| 02 이차 근사 | 헤세와 임계점 분류를 세웠습니다 | 안정성 판정이 되었습니다 |
| 03 다변수 적분 | 이중적분과 변수변환을 세웠습니다 | 소산 항등식의 적분형이 되었습니다 |
| 04 볼록성과 경사법 | 알고리즘과 수렴률을 세웠습니다 | 흐름의 이산화로 재해석되었습니다 |
| 05 제약 최적화 | 라그랑주와 KKT를 세웠습니다 | 제약 흐름의 평형 조건이 됩니다 |
| 06 미분방정식과 흐름 | 시간을 도입했습니다 | 앞의 다섯을 하나로 묶었습니다 |
가장 큰 수확은 관점의 전환입니다. 101강에서 헤세 행렬로 임계점을 분류한 것이 118강에서 평형점의 안정성 분류가 되었고, 109강에서 학습률 상한이었던 가 119강에서 이산화 안정 조건이 되었으며, 96강 심화 3의 노름 선택이 119강 문제 5에서 흐름 선택이 되었습니다.
그리고 열린 질문도 남았습니다. 119강 심화 5의 확률적 경사하강법은 잡음이 있는 흐름인데, 이를 제대로 다루려면 확률변수와 분포가 필요합니다. S6 확률과 통계가 그 도구를 세웁니다.
import numpy as np
# 표준 시험 문제: y' = y - t^2 + 1, y(0) = 0.5, 정확해 y = (t+1)^2 - 0.5 e^t
F = lambda t, y: y - t*t + 1.0
sol = lambda t: (t+1.0)**2 - 0.5*np.exp(t)
T0, T1, Y0 = 0.0, 2.0, 0.5
EX = sol(T1)
def euler(h):
n = int(round((T1-T0)/h)); t, y = T0, Y0
for _ in range(n):
y = y + h*F(t, y); t += h
return y
def rk2(h): # 중점법
n = int(round((T1-T0)/h)); t, y = T0, Y0
for _ in range(n):
k1 = F(t, y); k2 = F(t + h/2, y + h/2*k1)
y = y + h*k2; t += h
return y
def rk4(h):
n = int(round((T1-T0)/h)); t, y = T0, Y0
for _ in range(n):
k1 = F(t, y)
k2 = F(t + h/2, y + h/2*k1)
k3 = F(t + h/2, y + h/2*k2)
k4 = F(t + h, y + h*k3)
y = y + h/6*(k1 + 2*k2 + 2*k3 + k4); t += h
return y
# --- 문제 1: 오일러법의 오차는 h 에 비례한다 ----------------------------
print(" y' = y - t^2 + 1, y(0) = 0.5, t = 2 에서 정확해 %.10f" % EX)
print(" h 오일러 y(2) 오차 앞 줄 오차와의 비")
prev = None
for h in [0.2, 0.1, 0.05, 0.025, 0.0125]:
v = euler(h); err = abs(v - EX)
r = ("%8.4f" % (prev/err)) if prev else " -"
print(" %8.4f %14.10f %.6e %s" % (h, v, err, r))
prev = err
print(" h 를 절반으로 줄이면 오차도 절반이 되므로 1차 정확도입니다")
# y' = y - t^2 + 1, y(0) = 0.5, t = 2 에서 정확해 5.3054719505
# h 오일러 y(2) 오차 앞 줄 오차와의 비
# 0.2000 4.8657845043 4.396874e-01 -
# 0.1000 5.0635000304 2.419719e-01 1.8171
# 0.0500 5.1780062083 1.274657e-01 1.8983
# 0.0250 5.2399768965 6.549505e-02 1.9462
# 0.0125 5.2722642964 3.320765e-02 1.9723
# h 를 절반으로 줄이면 오차도 절반이 되므로 1차 정확도입니다
# --- 문제 2: 중점법은 h^2 에 비례한다 -----------------------------------
print(" 중점법 k1 = F(t,y), k2 = F(t+h/2, y+h/2*k1), y <- y + h*k2")
print(" h 중점법 y(2) 오차 앞 줄 오차와의 비")
prev = None
for h in [0.2, 0.1, 0.05, 0.025, 0.0125]:
v = rk2(h); err = abs(v - EX)
r = ("%8.4f" % (prev/err)) if prev else " -"
print(" %8.4f %14.10f %.6e %s" % (h, v, err, r))
prev = err
print(" 비가 4 에 가까우므로 2차 정확도입니다")
# 중점법 k1 = F(t,y), k2 = F(t+h/2, y+h/2*k1), y <- y + h*k2
# h 중점법 y(2) 오차 앞 줄 오차와의 비
# 0.2000 5.2903694612 1.510249e-02 -
# 0.1000 5.3017248770 3.747074e-03 4.0305
# 0.0500 5.3045442363 9.277142e-04 4.0390
# 0.0250 5.3052415469 2.304037e-04 4.0265
# 0.0125 5.3054145664 5.738410e-05 4.0151
# 비가 4 에 가까우므로 2차 정확도입니다
# --- 문제 3: RK4 는 h^4 에 비례한다 -------------------------------------
print(" RK4 는 한 걸음에 F 를 네 번 부릅니다")
print(" h RK4 y(2) 오차 비 F 호출 수")
prev = None
for h in [0.2, 0.1, 0.05, 0.025, 0.0125]:
v = rk4(h); err = abs(v - EX)
r = ("%8.4f" % (prev/err)) if prev else " -"
print(" %8.4f %14.10f %.6e %s %8d" % (h, v, err, r, 4*int(round(2.0/h))))
prev = err
print(" 비가 16 에 가까우므로 4차 정확도입니다")
print(" 같은 F 호출 수로 비교하면 이렇습니다")
print(" 방법 h F 호출 수 오차")
for nm, fn, h, c in [("오일러", euler, 0.0125, 1), ("중점법", rk2, 0.025, 2), ("RK4 ", rk4, 0.05, 4)]:
print(" %s %7.4f %10d %.6e" % (nm, h, c*int(round(2.0/h)), abs(fn(h)-EX)))
# RK4 는 한 걸음에 F 를 네 번 부릅니다
# h RK4 y(2) 오차 비 F 호출 수
# 0.2000 5.3053630007 1.089498e-04 - 40
# 0.1000 5.3054649602 6.990307e-06 15.5858 80
# 0.0500 5.3054715084 4.421339e-07 15.8104 160
# 0.0250 5.3054719227 2.778990e-08 15.9099 320
# 0.0125 5.3054719488 1.741620e-09 15.9563 640
# 비가 16 에 가까우므로 4차 정확도입니다
# 같은 F 호출 수로 비교하면 이렇습니다
# 방법 h F 호출 수 오차
# 오일러 0.0125 160 3.320765e-02
# 중점법 0.0250 160 2.304037e-04
# RK4 0.0500 160 4.421339e-07
# --- 문제 4: 정확도와 안정성은 다른 문제다 ------------------------------
print(" y' = lam*y 에 각 방법을 쓰면 y_{k+1} = R(h*lam) y_k 입니다")
R = {"오일러": lambda z: 1+z,
"중점법": lambda z: 1+z+z*z/2,
"RK4 ": lambda z: 1+z+z*z/2+z**3/6+z**4/24}
def limit(f):
lo, hi = 0.0, 5.0
for _ in range(200):
m = (lo+hi)/2
if abs(f(-m)) < 1.0: lo = m
else: hi = m
return lo
print(" 방법 실수축 안정 구간 (-a, 0) 의 a F 호출 수/걸음 a / 호출 수")
for nm, f in R.items():
a = limit(f); c = {"오일러":1, "중점법":2, "RK4 ":4}[nm]
print(" %s %14.6f %6d %10.6f" % (nm, a, c, a/c))
print(" lam = -50 인 뻣뻣한 계에서 허용 h 를 봅니다")
print(" 방법 허용 h t=1 까지 걸음 수 F 호출 수")
for nm, f in R.items():
a = limit(f); h = a/50.0; c = {"오일러":1, "중점법":2, "RK4 ":4}[nm]
n = int(np.ceil(1.0/h))
print(" %s %10.6f %14d %11d" % (nm, h, n, c*n))
# y' = lam*y 에 각 방법을 쓰면 y_{k+1} = R(h*lam) y_k 입니다
# 방법 실수축 안정 구간 (-a, 0) 의 a F 호출 수/걸음 a / 호출 수
# 오일러 2.000000 1 2.000000
# 중점법 2.000000 2 1.000000
# RK4 2.785294 4 0.696323
# lam = -50 인 뻣뻣한 계에서 허용 h 를 봅니다
# 방법 허용 h t=1 까지 걸음 수 F 호출 수
# 오일러 0.040000 26 26
# 중점법 0.040000 26 52
# RK4 0.055706 18 72
# --- 문제 5: 최적화에서는 고차 방법이 왜 안 쓰이는가 --------------------
print(" 경사흐름 dx/dt = -H x, H = diag(1, 100), x0 = (1, 1)")
H = np.array([[1.0, 0.0], [0.0, 100.0]]); L = 100.0
g = lambda x: H @ x
f = lambda x: 0.5*(x @ H @ x)
x0 = np.array([1.0, 1.0]); f0 = f(x0)
def run(kind, h, tol=1e-10):
x = x0.copy(); n = 0
while f(x) > tol*f0 and n < 2000000:
if kind == 1:
x = x - h*g(x)
elif kind == 2:
k1 = -g(x); k2 = -g(x + h/2*k1); x = x + h*k2
else:
k1 = -g(x); k2 = -g(x + h/2*k1)
k3 = -g(x + h/2*k2); k4 = -g(x + h*k3)
x = x + h/6*(k1 + 2*k2 + 2*k3 + k4)
n += 1
return n
print(" 방법 안정 한계 h 쓴 h 걸음 수 grad 호출 수")
for nm, kind, c in [("오일러", 1, 1), ("중점법", 2, 2), ("RK4 ", 3, 4)]:
a = limit(R[nm]); hmax = a/L; h = 0.9*hmax
n = run(kind, h)
print(" %s %11.6f %9.6f %10d %13d" % (nm, hmax, h, n, c*n))
print(" 기울기 한 번당 나아가는 시간이 정확도가 아니라 비용을 정합니다")
for nm in R:
a = limit(R[nm]); c = {"오일러":1, "중점법":2, "RK4 ":4}[nm]
print(" %s 한 번당 %10.6f 만큼 나아갑니다" % (nm, (a/L)/c))
# 경사흐름 dx/dt = -H x, H = diag(1, 100), x0 = (1, 1)
# 방법 안정 한계 h 쓴 h 걸음 수 grad 호출 수
# 오일러 0.020000 0.018000 507 507
# 중점법 0.020000 0.018000 512 1024
# RK4 0.027853 0.025068 368 1472
# 기울기 한 번당 나아가는 시간이 정확도가 아니라 비용을 정합니다
# 오일러 한 번당 0.020000 만큼 나아갑니다
# 중점법 한 번당 0.010000 만큼 나아갑니다
# RK4 한 번당 0.006963 만큼 나아갑니다
문제 3과 문제 5를 나란히 보는 것이 이 강의의 전부입니다. 같은 세 방법인데 순위가 완전히 뒤집힙니다.
| 판정 기준 | 1등 | 꼴찌 |
|---|---|---|
| 정확도 (같은 비용) | RK4가 배 앞섭니다 | 오일러 |
| 최적화 (같은 목표) | 오일러가 배 앞섭니다 | RK4 |
방법의 우열은 문제가 무엇을 요구하느냐로 정해집니다. 이것이 06단원, 나아가 S5 전체가 반복해서 보여준 교훈입니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 시간 간격 | 최적화의 학습률에 해당합니다 | |
| 국소 절단 오차 | local truncation error | 한 걸음의 오차입니다 |
| 전역 오차 | global error | 고정 시각까지 누적된 오차입니다 |
| k_ | 단계 기울기 | 한 걸음 안의 기울기 평가입니다 |
| 증폭 함수 | 의 절단 다항식입니다 | |
| 안정성 영역 | stability region | 인 집합입니다 |
| 부처의 장벽 | Butcher barrier | 단수 대비 차수의 한계입니다 |
| 임베디드 | embedded | 두 차수를 함께 계산합니다 |
| 도르만프린스 | Dormand-Prince | 오늘날의 표준 적응 방법입니다 |
| 심플렉틱 | symplectic | 구조를 보존하는 적분기입니다 |
| 무조건 안정 | unconditionally stable | 모든 에서 발산하지 않습니다 |
| 뻣뻣한 계 | stiff system | 시간 척도가 크게 다릅니다 |
여기서 S5 다변수 미적분과 최적화가 끝납니다. 01단원의 편미분에서 시작해 06단원의 흐름까지, 스물여덟 강이 하나의 이야기였습니다. 함수의 지형을 재는 법을 배우고, 그 지형에서 내려가는 법을 배우고, 내려가는 과정 자체를 시간의 흐름으로 다시 읽었습니다.
다음 121강부터 S6 확률과 통계가 시작됩니다. 119강 심화 5에서 남긴 질문, 곧 잡음이 있는 흐름을 어떻게 다루느냐가 그곳의 출발점입니다. 확률변수와 분포를 세우고, 기댓값과 분산을 정의하고, 그 위에 추정과 검정을 올립니다. S4의 선형대수와 S5의 미적분이 모두 도구로 동원됩니다.