110강에서 경사하강법의 한계를 정확히 쟀습니다.
그리고 심화 5에서 일차 방법의 하한이 그보다 낮다고 했습니다.
아직 여지가 있다는 뜻입니다. 기울기만 쓰면서도 더 잘할 수 있습니다.
이 강의가 그 여지를 채웁니다. 방법은 놀랄 만큼 단순합니다.
과거 방향을 누적할 뿐인데 걸음 수가 에서 로 줄어듭니다. 이면 걸음이 걸음이 됩니다.
왜 통하는지는 109강 심화 2에서 이미 진단했습니다. 정확한 직선탐색은 연속한 두 기울기를 직교하게 만들어 지그재그를 낳는데, 과거 방향을 섞으면 그 제약이 풀립니다.
그리고 이 강의는 다른 길도 봅니다. Adam은 성분마다 척도를 다르게 주어 유효 조건수 자체를 줄이며, 96강 심화 3의 대각 노름에 해당합니다.
문제. 에 를 씁니다.
(1) 경사하강법의 성분을 일곱 걸음 적으세요.
(2) 인 모멘텀의 성분을 적으세요.
(3) 두 방법의 성분을 비교하세요.
생각의 실마리. 109강 문제 2에서 의 곱수가 라 매 걸음 부호가 뒤집혔습니다. 과거 방향을 더하면 그 뒤집힘이 상쇄될 것입니다.
풀이. 검산에서
| GD y_ | 모멘텀 y_ | GD x_ | 모멘텀 x_ | |
|---|---|---|---|---|
에서 두 가지가 보입니다. 경사하강법은 매 걸음 부호가 뒤집히는데, 모멘텀은 같은 부호를 두 걸음씩 유지합니다. 진동의 주기가 늘어나 실질적인 왕복 횟수가 줄어듭니다.
에서는 차이가 더 큽니다. 여섯 걸음 뒤 경사하강법은 인데 모멘텀은 입니다.
이 문제에서 배우는 것: 모멘텀.
모멘텀(무거운 공) 방법.
이며 을 모멘텀 계수라 합니다. 이면 경사하강법입니다.
두 성분이 반대로 다뤄집니다.
| 성분 | 기울기의 부호 | 누적 효과 |
|---|---|---|
| 방향 | 매번 같습니다 | 쌓여서 커집니다 |
| 방향 | 매번 뒤집힙니다 | 상쇄되어 작아집니다 |
이름의 유래가 물리에 있습니다. 마찰이 있는 비탈에서 공을 굴리면
이고 이를 이산화하면 위 갱신식이 나옵니다. 가 관성이고 가 마찰입니다. 119강에서 이 대응을 정식으로 다룹니다.
동등한 표기가 하나 더 있습니다.
**"이전 걸음의 배를 더한다"**는 형태이며, 위 식을 전개하면 같습니다.
바로 확인 1.
확인 1-1. 모멘텀의 갱신식을 쓰세요.
답. 이고 입니다.
확인 1-2. 두 성분에 미치는 효과를 쓰세요.
답. 일관된 방향은 가속되고 진동하는 방향은 상쇄됩니다.
확인 1-3. 이면 무엇이 됩니까?
답. 경사하강법입니다.
문제. 인 같은 함수를 봅니다.
(1) 최적 를 구하세요.
(2) 경사하강법과 모멘텀의 이론 수렴률을 비교하세요.
(3) 걸음 뒤의 를 비교하세요.
생각의 실마리. 110강에서 경사하강법의 최적 수렴률이 이었습니다. 모멘텀에서는 자리에 가 들어갈 것입니다.
풀이. (1) 검산에서 이고
(2) 검산에서
| 방법 | 수렴률 |
|---|---|
| 경사하강법 | |
| 모멘텀 |
(3) 검산에서
| 방법 | 걸음 뒤 |
|---|---|
| 경사하강법(최적 ) | 1.693635\times10^ |
| 모멘텀 | 9.176251\times10^ |
자릿수 차이입니다.
이 문제에서 배우는 것: 가속.
무거운 공 방법의 수렴률. 이차함수에서 과 을 쓰면 수렴률이
입니다.
110강의 식에서 가 로 바뀌었습니다.
가 크면
지수가 절반이 됩니다. 걸음 수로 옮기면
110강 심화 5의 하한과 일치합니다. 일차 방법 중 최적이며 더 나은 것은 없습니다.
가 에 의존한다는 점이 실무의 문제입니다. 이면 이고 이면 입니다. 를 모르면 를 정할 수 없습니다.
그래서 나 를 관행적으로 씁니다. 문제 5에서 이 선택의 위험을 봅니다.
네스테로프 가속은 조금 다른 형태입니다.
기울기를 현재점이 아니라 "미리 가 본 점"에서 잽니다. 무거운 공은 이차함수에서만 가 증명되지만, 네스테로프는 일반 강볼록 함수에서도 증명됩니다.
바로 확인 2.
확인 2-1. 모멘텀의 수렴률을 쓰세요.
답. 입니다.
확인 2-2. 걸음 수의 차수를 쓰세요.
답. 입니다.
확인 2-3. 네스테로프 가속이 무거운 공과 다른 점을 쓰세요.
답. 기울기를 미리 가 본 점에서 잽니다.
문제. 에서 까지의 걸음 수를 세세요.
(1) 경사하강법의 걸음 수를 구하세요.
(2) 모멘텀의 걸음 수를 구하세요.
(3) 각각의 증가 양상을 판정하세요.
생각의 실마리. 가 열 배가 될 때 경사하강법은 열 배, 모멘텀은 배가 되어야 합니다.
풀이. 검산에서
| GD 걸음 | 모멘텀 걸음 | 비율 | ||
|---|---|---|---|---|
| 10^ |
(3) 증가 양상이 정확합니다.
| 방법 | 열 배당 걸음 증가 |
|---|---|
| 경사하강법 | , 정확히 배 |
| 모멘텀 | , 약 배 |
이므로 모멘텀이 에 비례합니다.
이 문제에서 배우는 것: 차수의 차이는 상수의 차이와 다릅니다.
110강 문제 2에서 최적 학습률이 약 두 배 빠르다고 했습니다. 그것은 상수 배 개선이었습니다.
| GD | 모멘텀 | 배율 | |
|---|---|---|---|
| 10^ | |||
| 10^ | |||
| 10^ | \approx4.6\times10^ |
가 커질수록 이득이 커집니다. 상수 배 개선은 언제나 두 배지만, 차수 개선은 문제가 어려울수록 크게 갚습니다.
비율이 보다 조금 작은 것도 설명됩니다. 모멘텀의 상수가 경사하강법보다 크기 때문이며, 처럼 작으면 이득이 배에 그칩니다.
실무의 판단을 정리합니다.
| 상황 | 판단 |
|---|---|
| 가 작습니다 | 모멘텀의 이득이 적습니다 |
| 가 큽니다 | 반드시 씁니다 |
| 를 모릅니다 | 써서 손해 볼 일은 드뭅니다 |
셋째 줄이 딥러닝의 관행입니다. 를 기본으로 두는 것이 표준이며, 최적이 아니어도 대개 이득입니다.
바로 확인 3.
확인 3-1. 가 열 배면 경사하강법의 걸음은 몇 배입니까?
답. 열 배입니다.
확인 3-2. 모멘텀은 몇 배입니까?
답. 약 배로 입니다.
확인 3-3. 가 작으면 모멘텀의 이득은 어떻습니까?
답. 적습니다.
문제. Adam을 씁니다.
(1) 기울기의 성분별 크기와 실제 걸음을 비교하세요.
(2) 걸음 뒤의 를 경사하강법과 비교하세요.
(3) 학습률에 따른 차이를 보세요.
생각의 실마리. 문제는 와 의 기울기 크기가 배 차이 난다는 데 있었습니다. 각 성분을 자기 크기로 나누면 그 차이가 사라질 것입니다.
풀이. (1) 검산에서
| 기울기 | 걸음 | |
|---|---|---|
기울기가 배 차이 나는데 걸음은 같습니다.
(2)와 (3) 검산에서
| 방법 | 걸음 뒤 |
|---|---|
| GD(최적 ) | 1.693635\times10^ |
| Adam() | 2.631006\times10^ |
| Adam() | 1.224636\times10^ |
이 문제에서 배우는 것: 적응적 학습률.
Adam. 기울기의 일차와 이차 모멘트를 추정하고
편향을 보정한 뒤
로 갱신합니다. 은 성분별 제곱입니다.
핵심이 나눗셈에 있습니다. 는 각 성분의 크기를 자기 크기로 나눈 것이라 대략 규모가 됩니다. 그래서 실제 걸음이 근처로 고정됩니다.
96강 심화 3의 틀에서 보면 대각 노름의 최급강하입니다.
대각행렬로 헤세를 근사한 셈이며, 112강의 뉴턴법이 전체 헤세를 쓰는 것과 대비됩니다.
| 방법 | 쓰는 | 비용 |
|---|---|---|
| 경사하강법 | ||
| Adam | 대각 | |
| 뉴턴법 | 헤세 |
대각 근사가 공짜에 가깝습니다. 저장이 이고 계산도 성분별이라, 파라미터가 수십억이어도 쓸 수 있습니다.
편향 보정이 필요한 이유도 짚어 둡니다. 에서 시작하므로 초기에는 이 참값보다 작습니다. 걸음 뒤 기댓값이 배이므로 그것으로 나눠 보정합니다.
보정이 없으면 초기 걸음이 지나치게 작습니다. 검산의 에서 걸음이 정확히 인 것이 보정 덕분입니다.
이 나쁜 것도 볼 만합니다. Adam의 걸음이 규모로 고정되므로 가 곧 걸음 크기입니다. 경사하강법처럼 기울기 크기에 비례하지 않으니 선택이 더 직접적입니다.
바로 확인 4.
확인 4-1. Adam의 갱신식에서 핵심 연산을 쓰세요.
답. 일차 모멘트를 이차 모멘트의 제곱근으로 나눕니다.
확인 4-2. 그 결과 걸음의 크기는 어떻게 됩니까?
답. 성분에 무관하게 근처로 고정됩니다.
확인 4-3. 편향 보정이 왜 필요합니까?
답. 모멘트를 에서 시작해 초기에 과소평가되기 때문입니다.
문제. 를 고정하고 를 바꿉니다.
(1) 에서 , , 걸음의 를 구하세요.
(2) 최선의 를 찾으세요.
(3) 가 발산인지 확인하세요.
생각의 실마리. 가 크면 관성이 커집니다. 너무 크면 목적지를 지나칩니다.
풀이. 검산에서
| 걸음 | 걸음 | 걸음 | |
|---|---|---|---|
| 5.0162\times10^ | 1.0889\times10^ | 5.1643\times10^ | |
| 1.5862\times10^ | 4.0803\times10^ | 2.2619\times10^ | |
| 9.3720\times10^ | 8.7843\times10^ | 2.6719\times10^ | |
| 1.2543\times10^ | 4.7545\times10^ | 6.9138\times10^ | |
| 4.4068\times10^ | 3.1878\times10^ | 7.5858\times10^ |
(2) 가 최선입니다.
(3) 발산이 아닙니다. 도 결국 수렴하며, 걸음에서 입니다. 다만 가 같은 걸음에서 이라 비교가 안 됩니다.
이 문제에서 배우는 것: 에는 최적점이 있습니다.
안정 조건부터 확인합니다.
검산에서
| 의 상한 | |
|---|---|
는 모든 경우에 안정 조건을 만족합니다. 그런데도 가 나쁩니다.
이유는 유효 걸음에 있습니다. 정상상태에서 가 기울기의 배로 쌓이므로
| 유효 | |
|---|---|
의 유효 학습률이 의 배입니다. 관성이 없다면 진작 발산했을 값이며, 관성이 그것을 진동으로 바꿔 겨우 붙들고 있습니다.
실무의 규칙을 정리합니다.
| 상황 | 대응 |
|---|---|
| 를 키웁니다 | 를 배로 줄입니다 |
| 가 기본입니다 | 유효 학습률이 입니다 |
| 와 를 따로 조율합니다 | 서로 얽혀 있어 비효율적입니다 |
첫째 줄이 중요합니다. 많은 구현이 로 정규화해 이 결합을 끊습니다. 그러면 유효 학습률이 로 고정되어 를 바꿔도 걸음 크기가 변하지 않습니다.
최적 가 에 의존한다는 점도 다시 봅니다. 문제 2에서 의 최적 였는데, 검산에서 가 더 나았습니다. 를 최적값이 아닌 로 고정했기 때문이며, 와 는 함께 정해야 합니다.
바로 확인 5.
확인 5-1. 모멘텀의 안정 조건을 쓰세요.
답. 이고 입니다.
확인 5-2. 유효 학습률을 쓰세요.
답. 대략 입니다.
확인 5-3. 를 키우면 를 어떻게 해야 합니까?
답. 배로 줄여야 유효 걸음이 유지됩니다.
| 방법 | 갱신식 |
|---|---|
| 경사하강법 | \mathbf{x}-\eta\mathbf |
| 모멘텀 | , \mathbf{x}\leftarrow\mathbf{x}-\eta\mathbf |
| 네스테로프 | 미리 간 점에서 기울기를 잽니다 |
| Adam |
| 방법 | 걸음 수 | 비용 |
|---|---|---|
| 경사하강법 | ||
| 모멘텀 | ||
| 하한 |
| 파라미터 | 값 |
|---|---|
| \beta^ | \bigl(\frac{\sqrt\kappa-1}{\sqrt\kappa+1}\bigr)^ |
| 안정 조건 | |
| 유효 학습률 | |
| 관행 | , Adam은 |
| 자주 하는 실수 | 바로잡기 |
|---|---|
| 만 키웁니다 | 를 함께 줄입니다 |
| 가 클수록 좋다고 봅니다 | 최적점이 있습니다 |
| Adam의 를 GD처럼 봅니다 | 걸음이 규모로 고정됩니다 |
| 편향 보정을 뺍니다 | 초기 걸음이 너무 작아집니다 |
문제 6. 모멘텀의 갱신식을 쓰세요.
답. , 입니다.
문제 7. 동등한 이전 걸음 형태를 쓰세요.
답. 입니다.
문제 8. 모멘텀의 수렴률을 쓰세요.
답. 입니다.
문제 9. 의 최적 를 구하세요.
답. 이므로 입니다.
문제 10. 가 백 배면 모멘텀의 걸음은 몇 배입니까?
답. 열 배입니다.
문제 11. 일차 방법의 하한을 쓰고 모멘텀과 비교하세요.
답. 이며 모멘텀이 이를 달성합니다.
문제 12. 모멘텀의 안정 조건을 쓰세요.
답. 입니다.
문제 13. 일 때 유효 학습률을 쓰세요.
답. 약 입니다.
문제 14. Adam에서 걸음의 크기가 무엇으로 정해집니까?
답. 기울기 크기와 무관하게 근처입니다.
문제 15. Adam이 근사하는 것을 96강의 언어로 쓰세요.
답. 대각행렬을 노름으로 삼는 최급강하입니다.
문제 16. Adam의 편향 보정 인자를 쓰세요.
답. 와 로 나눕니다.
문제 17. 네스테로프 가속의 특징을 쓰세요.
답. 기울기를 현재점이 아니라 미리 간 점에서 잽니다.
문제 18. 모멘텀의 물리적 해석을 쓰세요.
답. 마찰이 있는 비탈에서 굴러가는 공이며 가 관성입니다.
심화 1. 이차함수에서 모멘텀의 수렴률을 유도하세요.
에서 고유방향마다 분리되므로 한 성분만 봅니다. 가 그 고유값이면
두 식을 합쳐 이차 점화식으로 만듭니다. 이고 이므로
32강의 선형 점화식입니다. 특성방정식을 세우면
두 근의 곱이 이므로 이고, 판별식이 음수면 두 근이 켤레복소수라 크기가 각각 입니다.
모든 에서 복소근이 되도록 를 잡으면 수렴률이 로 균일해집니다. 판별식 조건은
이며, 와 에서 등호가 되도록 잡으면
이때 수렴률이
입니다.
핵심이 복소근에 있습니다. 경사하강법은 실근 하나라 가 에 따라 크게 달라지는데, 모멘텀은 복소근의 크기가 로 모든 에서 같습니다.
32강의 피보나치가 여기서 되돌아옵니다. 그때 특성방정식의 근이 수열의 성장률을 정했는데, 여기서는 감소율을 정합니다. 85강에서 그 특성방정식이 고유값 방정식이라 했고, 이제 최적화의 수렴률이 됐습니다.
심화 2. 네스테로프 가속을 소개하고 무거운 공과 비교하세요.
무거운 공은 이차함수에서만 가 증명됩니다. 일반 강볼록 함수에서는 반례가 있습니다.
네스테로프 가속은 다릅니다.
차이가 한 곳에 있습니다. 기울기를 어디서 재느냐입니다.
| 방법 | 기울기 평가점 |
|---|---|
| 무거운 공 | (현재) |
| 네스테로프 | (관성으로 미리 간 점) |
**"먼저 굴러가 보고 거기서 기울기를 잰다"**는 뜻이며, 지나칠 것 같으면 미리 제동이 걸립니다.
일반 강볼록 함수에서 증명됩니다.
볼록이지만 강볼록이 아닌 경우에도 개선이 있습니다.
| 가정 | 경사하강법 | 네스테로프 |
|---|---|---|
| 강볼록 + 매끄러움 | ||
| 볼록 + 매끄러움 |
둘째 줄도 차수 개선입니다. 110강 문제 3에서 였던 것이 가 됩니다.
두 방법이 실무에서 비슷하게 작동합니다. 딥러닝 프레임워크는 대개 무거운 공을 쓰고 네스테로프를 선택지로 둡니다. 손실이 비볼록이라 이론적 우위가 그대로 나타나지는 않기 때문입니다.
를 걸음마다 바꾸는 형태도 있습니다.
를 몰라도 되는 일정이며, 볼록 경우의 를 줍니다. 를 추정할 수 없는 실무에서 유용합니다.
심화 3. Adam 계열의 변형들을 정리하세요.
Adam은 여러 아이디어가 쌓인 결과입니다. 하나씩 분해합니다.
AdaGrad가 출발점입니다.
누적 제곱합으로 나눕니다. 자주 큰 기울기를 받은 성분은 학습률이 줄어들고, 드물게 나타나는 성분은 큰 걸음을 유지합니다. 희소 특징에 강합니다.
문제는 가 단조 증가한다는 점입니다. 학습률이 계속 줄어 결국 멈춥니다.
RMSProp이 이를 고칩니다.
누적 대신 지수이동평균을 씁니다. 최근 기울기만 반영하므로 학습률이 죽지 않습니다.
Adam은 여기에 모멘텀을 더합니다.
| 방법 | 일차 모멘트 | 이차 모멘트 |
|---|---|---|
| AdaGrad | 없음 | 누적합 |
| RMSProp | 없음 | 지수평균 |
| Adam | 지수평균 | 지수평균 |
| AdamW | 지수평균 | 지수평균, 감쇠 분리 |
넷째 줄이 현재의 표준입니다. 정규화를 손실에 넣는 대신 갱신식에서 직접 빼는데, 이유가 미묘합니다.
손실에 넣으면 정규화 항도 로 나뉘어 성분마다 다른 강도가 됩니다. 의도한 바가 아니므로 분리합니다. 116강에서 정규화를 다룰 때 이 구별이 왜 중요한지 봅니다.
Adam의 약점도 알려져 있습니다.
| 문제 | 내용 |
|---|---|
| 수렴 실패 | 볼록 문제에서도 수렴 안 하는 예가 있습니다 |
| 일반화 | SGD보다 검증 성능이 나쁠 때가 있습니다 |
| 초기 불안정 | 워밍업이 필요합니다 |
둘째 줄이 실무의 논쟁거리입니다. 최적화가 빠른 것과 일반화가 좋은 것이 다르며, 214강에서 다룹니다.
심화 4. 모멘텀을 미분방정식으로 보세요.
문제 1에서 물리적 해석을 언급했습니다. 정식으로 봅니다.
무거운 공의 갱신식을 다시 씁니다.
왼쪽이 이계 차분입니다. 걸음 크기를 라 두고 로 보면
정리하면
감쇠 진동 방정식입니다.
| 항 | 물리 | 최적화 |
|---|---|---|
| 가속도 | 관성 | |
| 마찰 | 감쇠 | |
| 힘 | 기울기 |
이면 마찰이 사라져 영원히 진동합니다. 문제 5에서 가 느렸던 이유가 이것입니다.
경사하강법은 마찰이 무한대인 극한입니다. 이면 관성이 없어
119강의 경사흐름이며, 그 강의에서 이 관점을 정면으로 다룹니다.
최적 감쇠가 물리에서도 알려져 있습니다. 임계감쇠일 때 가장 빨리 정지하며, 심화 1에서 판별식이 이 되는 조건이 그것입니다.
미분방정식 관점의 이득은 새 알고리즘을 설계할 수 있다는 점입니다. 다른 ODE를 이산화하면 다른 방법이 나오고, 고차 이산화를 쓰면 더 나은 방법이 될 수 있습니다. 120강의 룽게쿠타가 그 도구입니다.
심화 5. 확률적 경우에 모멘텀이 어떻게 작용하는지 논하세요.
109강 심화 3에서 미니배치 기울기를 봤습니다. 잡음이 섞이면 모멘텀의 역할이 하나 더 생깁니다.
가 독립이고 분산이 이면, 누적된 의 잡음 분산은
신호는 배로 쌓이고 잡음은 배로 쌓입니다. 신호 대 잡음비가
이면 배 개선됩니다.
이것이 확률적 환경에서 모멘텀이 널리 쓰이는 이유입니다. 가속 효과보다 이 평활화 효과가 더 클 수도 있습니다.
대가는 지연입니다. 과거를 평균 내므로 지형이 급격히 바뀌면 반응이 늦습니다.
| 상황 | |
|---|---|
| 잡음이 큽니다 | 크게 |
| 지형이 급변합니다 | 작게 |
| 배치가 큽니다 | 작아도 됩니다 |
셋째 줄이 실무의 관찰입니다. 배치를 키우면 기울기 추정이 정확해져 모멘텀의 평활화가 덜 필요합니다. 237강에서 배치 크기와 학습률의 관계를 다룹니다.
**Adam의 **도 같은 발상입니다. 이차 모멘트를 훨씬 긴 창으로 평균 내어 척도 추정을 안정시킵니다.
심화 6. 112강으로 어떻게 이어지는지 정리하세요.
이 강의에서 기울기만 쓰면서 할 수 있는 최선에 도달했습니다.
110강 심화 5의 하한과 일치하므로 일차 방법으로는 더 나아갈 수 없습니다.
112강이 헤세를 씁니다.
96강 심화 3에서 이미 봤습니다. 헤세 노름의 최급강하 방향이 최소점을 정확히 가리켰고, 각도 오차가 도였습니다.
| 방법 | 정답 방향과의 각 |
|---|---|
| 최급강하 | 44.4271^ |
| 헤세 노름 최급강하 | 0.0000^ |
이차함수에서 한 걸음에 끝나고 일반 함수에서도 최소 근처에서 이차 수렴합니다.
유효 자릿수가 매 걸음 두 배가 되며, 선형 수렴과는 차원이 다릅니다.
대가는 비용입니다.
| 방법 | 걸음 수 | 한 걸음 비용 |
|---|---|---|
| 경사하강법 | ||
| 모멘텀 | ||
| 뉴턴법 |
이 크면 셋째 줄이 불가능합니다. 그래서 112강은 절충안도 다룹니다.
| 방법 | 절충 |
|---|---|
| 준뉴턴법(BFGS) | 헤세를 갱신하며 근사, |
| L-BFGS | 최근 몇 걸음만 저장, |
| 절단 뉴턴법 | 로 선형계를 반복법으로 |
| 가우스-뉴턴 | 최소제곱 구조를 이용 |
셋째 줄이 99강 심화 4의 기법입니다. 헤세를 만들지 않고 만 계산해 켤레기울기법으로 를 풉니다.
112강이 04단원을 닫습니다. 그리고 05단원에서 제약이 있는 최적화로 넘어가며, 113강의 라그랑주 승수법이 95강 문제 4의 기하에서 두 줄로 나옵니다.
import numpy as np
H = np.array([[1.0, 0.0], [0.0, 100.0]]); mu, L = 1.0, 100.0
f = lambda x: 0.5*(x @ H @ x); gf = lambda x: H @ x
kap = L/mu
# --- 문제 1: 모멘텀이 진동을 상쇄한다 -----------------------------------
print(" 경사하강 vs 모멘텀 (eta=0.019, beta=0.9), 시작 (1,1)")
print(" k GD y_k 모멘텀 y_k GD x_k 모멘텀 x_k")
xg = np.array([1.0, 1.0]); xm = np.array([1.0, 1.0]); v = np.zeros(2)
e, b = 0.019, 0.9
rows = []
for k in range(7):
rows.append((k, xg[1], xm[1], xg[0], xm[0]))
xg = xg - e*gf(xg)
v = b*v + gf(xm); xm = xm - e*v
for r in rows:
print(" %4d %+9.4f %+9.4f %+9.4f %+9.4f" % r)
# 경사하강 vs 모멘텀 (eta=0.019, beta=0.9), 시작 (1,1)
# k GD y_k 모멘텀 y_k GD x_k 모멘텀 x_k
# 0 +1.0000 +1.0000 +1.0000 +1.0000
# 1 -0.9000 -0.9000 +0.9810 +0.9810
# 2 +0.8100 -0.9000 +0.9624 +0.9453
# 3 -0.7290 +0.8100 +0.9441 +0.8951
# 4 +0.6561 +0.8100 +0.9261 +0.8330
# 5 -0.5905 -0.7290 +0.9085 +0.7613
# 6 +0.5314 -0.7290 +0.8913 +0.6823
# 모멘텀은 같은 부호를 두 걸음씩 유지하고 x 방향은 훨씬 빨리 줄어듭니다.
# --- 문제 2: 무거운 공 방법의 수렴률 ------------------------------------
print(" 최적 파라미터: beta* = ((sqrt(kappa)-1)/(sqrt(kappa)+1))^2, eta* = (1+beta*)/L 근처")
sk = np.sqrt(kap)
bst = ((sk-1)/(sk+1))**2
print(" kappa = %.0f, sqrt(kappa) = %.4f, beta* = %.6f" % (kap, sk, bst))
print(" GD 최적 수렴률 (kappa-1)/(kappa+1) = %.6f" % ((kap-1)/(kap+1)))
print(" 모멘텀 수렴률 (sqrt(k)-1)/(sqrt(k)+1) = %.6f" % ((sk-1)/(sk+1)))
print(" 방법 200걸음 뒤 f")
xg = np.array([1.0, 1.0])
for _ in range(200): xg = xg - (2/(mu+L))*gf(xg)
print(" GD(최적 eta) %14.6e" % f(xg))
xm = np.array([1.0, 1.0]); v = np.zeros(2); em = 4.0/(np.sqrt(L)+np.sqrt(mu))**2
for _ in range(200):
v = bst*v + gf(xm); xm = xm - em*v
print(" 모멘텀 %14.6e" % f(xm))
# 최적 파라미터: beta* = ((sqrt(kappa)-1)/(sqrt(kappa)+1))^2, eta* = (1+beta*)/L 근처
# kappa = 100, sqrt(kappa) = 10.0000, beta* = 0.669421
# GD 최적 수렴률 (kappa-1)/(kappa+1) = 0.980198
# 모멘텀 수렴률 (sqrt(k)-1)/(sqrt(k)+1) = 0.818182
# 방법 200걸음 뒤 f
# GD(최적 eta) 1.693635e-02
# 모멘텀 9.176251e-29
# 200 걸음에서 27 자릿수 차이입니다.
# --- 문제 3: 걸음 수가 sqrt(kappa) 로 준다 ------------------------------
print(" kappa GD 걸음 모멘텀 걸음 비율 sqrt(kappa)")
for kk in [10.0, 100.0, 1000.0, 10000.0]:
Hk = np.diag([1.0, kk]); g = lambda x: Hk @ x
fv = lambda x: 0.5*(x @ Hk @ x)
x0 = np.array([1.0, 1.0]); f0 = fv(x0)
x = x0.copy(); eg = 2.0/(1.0+kk); n1 = 0
while fv(x) > 1e-8*f0 and n1 < 3000000: x = x - eg*g(x); n1 += 1
s = np.sqrt(kk); bb = ((s-1)/(s+1))**2; ee = 4.0/(np.sqrt(kk)+1.0)**2
x = x0.copy(); v = np.zeros(2); n2 = 0
while fv(x) > 1e-8*f0 and n2 < 3000000:
v = bb*v + g(x); x = x - ee*v; n2 += 1
print(" %8.0f %8d %11d %6.1f %10.1f" % (kk, n1, n2, n1/max(n2,1), s))
# kappa GD 걸음 모멘텀 걸음 비율 sqrt(kappa)
# 10 46 20 2.3 3.2
# 100 461 71 6.5 10.0
# 1000 4606 243 19.0 31.6
# 10000 46052 831 55.4 100.0
# GD 는 kappa 열 배당 열 배, 모멘텀은 약 3.4 배로 sqrt(10) 입니다.
# --- 문제 4: 성분마다 척도를 다르게 -------------------------------------
print(" Adam 류: 성분별 이차 모멘트로 나눕니다")
def adam(x0, steps, lr=0.1, b1=0.9, b2=0.999, eps=1e-8):
x = x0.copy(); m = np.zeros(2); vv = np.zeros(2)
for t in range(1, steps+1):
g = gf(x)
m = b1*m + (1-b1)*g; vv = b2*vv + (1-b2)*g*g
mh = m/(1-b1**t); vh = vv/(1-b2**t)
x = x - lr*mh/(np.sqrt(vh)+eps)
return x
print(" 방법 200걸음 뒤 f")
xg = np.array([1.0, 1.0])
for _ in range(200): xg = xg - (2/(mu+L))*gf(xg)
print(" GD(최적 eta) %14.6e" % f(xg))
print(" Adam(lr=0.1) %14.6e" % f(adam(np.array([1.0,1.0]), 200, 0.1)))
print(" Adam(lr=0.01) %14.6e" % f(adam(np.array([1.0,1.0]), 200, 0.01)))
print(" Adam 의 유효 걸음은 성분 크기에 무관하게 lr 근처입니다")
x = np.array([1.0, 1.0]); m = np.zeros(2); vv = np.zeros(2)
for t in range(1, 4):
g = gf(x); m = 0.9*m + 0.1*g; vv = 0.999*vv + 0.001*g*g
mh = m/(1-0.9**t); vh = vv/(1-0.999**t)
step = 0.1*mh/(np.sqrt(vh)+1e-8)
print(" t=%d 기울기 %s 걸음 %s" % (t, np.round(g,2), np.round(step,6)))
x = x - step
# Adam 류: 성분별 이차 모멘트로 나눕니다
# 방법 200걸음 뒤 f
# GD(최적 eta) 1.693635e-02
# Adam(lr=0.1) 2.631006e-09
# Adam(lr=0.01) 1.224636e-02
# Adam 의 유효 걸음은 성분 크기에 무관하게 lr 근처입니다
# t=1 기울기 [ 1. 100.] 걸음 [0.1 0.1]
# t=2 기울기 [ 0.9 90. ] 걸음 [0.099588 0.099588]
# t=3 기울기 [ 0.8 80.04] 걸음 [0.098826 0.098826]
# 기울기가 100 배 차이 나는데 걸음은 같습니다.
# --- 문제 5: beta 를 너무 키우면 ----------------------------------------
print(" beta 별 수렴 (kappa=100, eta=0.019)")
print(" beta 300걸음 1000걸음 3000걸음")
for bb in [0.0, 0.5, 0.9, 0.95, 0.99]:
out = []
for N in [300, 1000, 3000]:
x = np.array([1.0, 1.0]); v = np.zeros(2)
for _ in range(N):
v = bb*v + gf(x); x = x - 0.019*v
out.append(f(x))
print(" %7.2f %12.4e %12.4e %12.4e" % (bb, out[0], out[1], out[2]))
print(" beta=0.99 는 발산이 아니라 느린 진동입니다. 안정 조건은 eta < 2(1+beta)/L 입니다")
for bb in [0.0, 0.9, 0.99]:
print(" beta=%.2f 이면 eta < %.4f (쓴 값 0.019)" % (bb, 2*(1+bb)/L))
# beta 별 수렴 (kappa=100, eta=0.019)
# beta 300걸음 1000걸음 3000걸음
# 0.00 5.0162e-06 1.0889e-17 5.1643e-51
# 0.50 1.5862e-11 4.0803e-36 2.2619e-106
# 0.90 9.3720e-13 8.7843e-45 2.6719e-136
# 0.95 1.2543e-05 4.7545e-21 6.9138e-66
# 0.99 4.4068e+00 3.1878e-03 7.5858e-12
# beta=0.99 는 발산이 아니라 느린 진동입니다. 안정 조건은 eta < 2(1+beta)/L 입니다
# beta=0.00 이면 eta < 0.0200 (쓴 값 0.019)
# beta=0.90 이면 eta < 0.0380 (쓴 값 0.019)
# beta=0.99 이면 eta < 0.0398 (쓴 값 0.019)
# 안정 조건을 만족해도 beta 가 크면 유효 학습률 eta/(1-beta) 가 커져 느려집니다.
문제 3의 표가 이 강의의 요지입니다. 조건수가 열 배가 될 때 경사하강법은 걸음이 열 배 늘고 모멘텀은 배만 늡니다.
112강에서 헤세를 써서 의존성 자체를 없앱니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 모멘텀 계수 | 과거 방향의 유지 비율입니다 | |
| \mathbf | 속도 | 누적된 기울기입니다 |
| 유효 학습률 | 정상상태의 걸음 크기입니다 | |
| 무거운 공 | heavy ball | 폴랴크의 모멘텀입니다 |
| 네스테로프 가속 | Nesterov acceleration | 미리 간 점에서 기울기를 잽니다 |
| 편향 보정 모멘트 | 로 나눕니다 | |
| AdaGrad | 누적 제곱합 | 학습률이 단조 감소합니다 |
| RMSProp | 지수이동평균 | 학습률이 죽지 않습니다 |
| AdamW | 감쇠 분리 | 정규화를 갱신식에서 뺍니다 |
다음 112강에서는 뉴턴법과 이차 방법을 다룹니다. 이 강의가 일차 방법의 한계에 도달했으므로, 헤세를 써서 그 한계를 넘습니다. 96강 심화 3에서 본 대로 헤세 노름의 최급강하가 최소점을 정확히 가리키며, 조건수 의존성이 사라집니다. 대가인 비용을 줄이는 준뉴턴법과 절단 뉴턴법도 함께 봅니다. 이것으로 04단원이 끝납니다.