강 문제 에서 고정 학습률로는 최적점에 안 닿는다는 것을 봤습니다. 최적점 둘레의 한 영역까지만 가고 거기서 맴돕니다.
너무 천천히 줄이면 잡음이 안 사라지고, 너무 빨리 줄이면 도착하기 전에 멈춥니다. 이 강의는 그 경계를 두 조건으로 적습니다.
그리고 이 조건이 무한 걸음에 대한 것이라 정해진 예산에서는 조건을 만족하는 감소식이 오히려 질 수 있다는 것을 수치로 보입니다.
문제. 떨림의 크기를 잽니다.
() 두 힘을 정리하세요.
() 고정 학습률에서 균형점을 재세요.
() 배치 크기도 같은 자리에 들어오는지 보세요.
생각의 실마리. 걸음마다 최적점 쪽으로 끌어당기는 힘과 잡음이 밀어내는 힘이 함께 작용합니다. 둘이 같아지는 자리에서 멈춥니다.
풀이. () 정리합니다.
| 무엇 | 무엇인가 | 학습률과의 관계 |
|---|---|---|
| 끌어당기는 힘 | 그래디언트가 최적점 쪽으로 | 학습률에 비례 |
| 밀어내는 힘 | 잡음이 아무 방향으로 | 학습률의 제곱에 비례 |
| 균형점 | 둘이 같아지는 자리 | 학습률에 비례 |
| 학습률을 줄이면 | 둘 다 줄지만 잡음이 더 | 균형점이 최적점으로 |
둘째 줄이 핵심입니다. 잡음의 기여가 학습률의 제곱으로 들어옵니다. 그래서 학습률을 반으로 줄이면 떨림은 네 배가 아니라 절반이 됩니다.
() 고정 학습률에서 균형점을 잽니다. 배치 , 마지막 걸음 평균입니다.
| 학습률 | 평균 초과손실 | 학습률 대비 | 절반으로 줄인 비 |
|---|---|---|---|
| 기준 | |||
넷째 열이 에 가까워집니다. 학습률을 절반으로 줄일 때마다 초과손실도 절반이 됩니다.
으로 보내지 않으면 에 안 닿습니다.
() 배치 크기도 봅니다. 학습률 고정입니다.
| 배치 크기 | 평균 초과손실 | 배치 곱하기 초과손실 |
|---|---|---|
셋째 열이 에서 사이로 거의 같습니다. 초과손실이 배치 크기에 반비례합니다.
학습률 나누기 배치 크기가 떨림의 크기를 정합니다. 강 문제 의 선형 스케일링이 여기서 다시 나옵니다. 둘을 같은 배수로 바꾸면 이 비가 안 변합니다.
이 문제에서 배우는 것. 확률적 경사하강의 정상 상태는 한 점이 아니라 한 영역이고, 그 크기가 로 정확히 정해집니다. 그래서 수렴을 원하면 를 으로 보내는 수밖에 없습니다.
확인 1-1. 떨림의 크기를 정하는 두 손잡이를 쓰세요.
답. 학습률과 배치 크기이고 그 비가 정합니다.
확인 1-2. 검산에서 학습률 과 의 평균 초과손실을 쓰세요.
답. 과 입니다.
확인 1-3. 검산에서 배치 와 의 배치 곱하기 초과손실을 쓰세요.
답. 와 입니다.
문제. 조건을 적습니다.
() 두 조건을 적으세요.
() 여러 감소식이 조건을 만족하는지 세세요.
() 조건을 어기면 정말 안 되는지 확인하세요.
() 에 상수를 붙여 보세요.
생각의 실마리. 학습률이 너무 빨리 줄면 아직 멀리 있는데 걸음이 멈춥니다. 너무 천천히 줄면 잡음이 안 사라집니다. 그 사이가 조건입니다.
풀이. () 두 조건을 적습니다.
| 무엇 | 무엇을 말하나 | 왜 필요한가 |
|---|---|---|
| 첫째 조건 | 학습률의 합이 무한 | 아무리 멀어도 갈 수 있음 |
| 둘째 조건 | 학습률 제곱의 합이 유한 | 잡음이 결국 사라짐 |
| 둘 다 필요 | 하나만으로는 안 됨 | 문제 에서 확인 |
() 여러 감소식을 셉니다.
| 감소식 | 가 일 때 합 | 가 일 때 합 | 제곱합 |
|---|---|---|---|
| 고정 | |||
| 1/\sqrt | |||
| 1/t^ |
만 합은 발산하고 제곱합은 수렴합니다. 합이 에서 로 천천히 커지는데 제곱합은 에 멈춥니다.
은 합이 에 멈춰 첫째 조건을 어깁니다. 입니다.
() 조건을 어기면 정말 안 되는지 확인합니다. 기본 학습률 에 곱해 걸음 갑니다.
| 감소식 | 첫째 조건 | 둘째 조건 | 초과손실 |
|---|---|---|---|
| 고정 | 만족 | 어김 | |
| 만족 | 만족 | ||
| 1/\sqrt | 만족 | 어김 | |
| 어김 | 만족 | ||
| 1/t^ | 만족 | 어김 |
뜻밖의 결과입니다. 조건을 다 만족하는 가 거의 꼴찌입니다.
은 첫째 조건을 어겨 아예 도착을 못 합니다. 이것은 예상대로입니다.
그런데 가 가장 좋습니다. 조건은 무한 걸음에 대한 것이기 때문입니다.
걸음에서 는 이미 학습률이 로 사실상 멈췄습니다. 조건을 만족하는지와 정해진 예산 안에서 좋은지는 다른 물음입니다.
() 그러면 가 나쁜 감소식일까요. 앞에 붙는 상수를 바꿔 봅니다.
| 앞에 붙인 상수 | 첫 걸음 학습률 | 마지막 학습률 | 초과손실 |
|---|---|---|---|
상수를 에서 로 키우니 초과손실이 에서 으로 다섯 자릿수 좋아집니다.
같은 감소식인데 상수 하나로 결과가 자릿수 단위로 달라집니다. 그리고 에서는 다시 나빠지므로 최적 상수가 가운데 있습니다.
로빈스와 먼로의 조건은 상수를 정해 주지 않습니다. 그것이 실무의 몫입니다.
이 문제에서 배우는 것. 조건은 필요조건에 가깝지 충분한 지침이 아닙니다. 어떤 감소식이 쓸 만한지는 조건이 아니라 예산과 상수가 정합니다.
확인 2-1. 로빈스와 먼로의 두 조건을 쓰세요.
답. 학습률의 합이 무한이고 제곱합이 유한이어야 합니다.
확인 2-2. 검산에서 와 의 초과손실을 쓰세요.
답. 과 입니다.
확인 2-3. 검산에서 상수 를 붙였을 때의 초과손실을 쓰세요.
답. 입니다.
문제. 얼마나 빨리 가는지 봅니다.
() 세 가정과 속도를 정리하세요.
() 강볼록에서 속도를 확인하세요.
() 잡음이 없으면 얼마나 빠른지 견주세요.
() 안 볼록한 경우를 보세요.
생각의 실마리. 조건은 닿는다고만 말합니다. 얼마나 빨리 닿는지는 손실면의 모양이 정합니다.
풀이. () 정리합니다.
| 가정 | 속도 | 덧붙임 |
|---|---|---|
| 볼록 | 1/\sqrt | 가장 약한 가정 |
| 강볼록 | 골이 확실히 둥금 | |
| 잡음이 없으면 | 지수적으로 | 전체 배치 경사하강 |
이 자료의 헤세 고윳값은 최소 최대 입니다. 최소가 보다 크므로 강볼록이고 조건수는 입니다.
() 강볼록에서 속도를 확인합니다. 학습률을 로 두고 시드 개를 평균 냅니다.
| 걸음 수 | 최적점과의 거리 제곱 | 걸음 수 곱하기 거리 제곱 |
|---|---|---|
셋째 열이 에서 사이에 머뭅니다. 거리 제곱이 배 줄었는데 이 곱은 거의 안 움직입니다.
거리 제곱이 대략 로 줍니다. 학습률에 상한을 씌운 것은 앞쪽에서 가 너무 크기 때문이고, 수렴이 보장되는 상한은 입니다.
() 잡음이 없으면 얼마나 빠른지 견줍니다. 전체 배치, 학습률 입니다.
| 걸음 수 | 초과손실 | 이론이 말하는 비율 |
|---|---|---|
초과손실이 지수적으로 줄어듭니다. 걸음에서 걸음 사이에 에서 로 갑니다.
걸음에서 기계 정밀도에 닿아 더 안 내려갑니다. 걸음의 값이 같은 이유입니다.
걸음 만에 확률적 방법의 걸음보다 훨씬 낮은 값에 닿습니다. 다만 한 걸음이 배 비쌉니다. 강 문제 의 맞바꿈입니다.
() 안 볼록한 경우를 봅니다. 골이 둘인 차 함수이고 깊은 골은 얕은 골은 근처입니다. 시작점은 입니다.
| 잡음 크기 | 깊은 골에 간 비율 | 얕은 골에 간 비율 | 멀리 달아난 비율 |
|---|---|---|---|
잡음이 이면 시작점이 얕은 골 쪽이라 언제나 얕은 골로 갑니다.
잡음 에서 퍼센트가 깊은 골로 넘어갑니다.
잡음 에서는 퍼센트로 다시 내려갑니다. 너무 크면 어느 골에도 안 머무릅니다.
강 문제 에서 국소 최소가 문제라 했는데 잡음이 그것을 어느 정도 풉니다. 확률적 방법이 결정적 방법보다 나은 자리를 찾을 수 있는 이유입니다.
이 문제에서 배우는 것. 잡음은 비용이자 자산입니다. 볼록한 문제에서는 순수한 손해이지만, 골이 여럿인 문제에서는 더 나은 골로 넘어가게 해 줍니다. 다만 그 크기에 적정 구간이 있습니다.
확인 3-1. 강볼록에서 거리 제곱이 어떻게 주는지 쓰세요.
답. 걸음 수의 역수로 줍니다.
확인 3-2. 검산에서 잡음이 없을 때 걸음과 걸음의 초과손실을 쓰세요.
답. 와 입니다.
확인 3-3. 검산에서 잡음 일 때 깊은 골에 간 비율을 쓰세요.
답. 입니다.
문제. 실제로 무엇을 쓰는지 봅니다.
() 흔한 감소식을 정리하세요.
() 같은 예산에서 견주세요.
() 준비 구간을 보세요.
() 학습률과 판 수를 함께 정하세요.
생각의 실마리. 문제 에서 가 유한 예산에서 졌습니다. 그러면 실무는 무엇을 쓸까요.
풀이. () 정리합니다.
| 무엇 | 어떻게 | 언제 쓰나 |
|---|---|---|
| 계단식 | 몇 판마다 분의 | 가장 오래 쓰임 |
| 코사인 | 부드럽게 까지 | 요즘 기본 |
| 선형 | 곧게 까지 | 언어모형에서 흔함 |
| 준비 구간 | 처음에 에서 올림 | 앞에서 터지는 것을 막음 |
| 이론이 말하는 것 | 실무에서는 잘 안 씀 |
() 같은 예산에서 견줍니다. 기본 학습률 에 걸음입니다.
| 감소식 | 마지막 학습률 비 | 초과손실 |
|---|---|---|
| 고정 | ||
| 계단식 | ||
| 코사인 | ||
| 선형 | ||
끝에서 학습률이 에 가까워지는 셋이 크게 낫습니다. 코사인이 로 가장 좋습니다.
는 조건을 만족하지만 너무 일찍 작아져 뒤처집니다.
실무의 감소식은 이론 조건이 아니라 정해진 예산 안에서 최선을 노립니다. 마지막에 이 되므로 제곱합이 유한하다는 조건 자체는 논의 대상이 아닙니다. 걸음이 유한하기 때문입니다.
() 준비 구간을 봅니다. 먼저 시작점의 그래디언트를 잽니다.
| 어디서 | 전체 그래디언트 노름 | 배치 의 평균 노름 |
|---|---|---|
| 시작점 | ||
| 최적점 근처 |
시작점에서 그래디언트가 열 배 큽니다. 그래서 같은 학습률이라도 첫 걸음이 가장 위험합니다.
그런데 선형 회귀에서는 준비 구간을 넣어도 결과가 똑같습니다. 걸음이 쌓이면 시작점 의존이 완전히 사라지기 때문입니다.
그래서 문제 의 차 함수로 옮깁니다. 시작점은 이고 잡음은 입니다. 값은 발산한 비율입니다.
| 학습률 | 준비 구간 없음 | 걸음 | 걸음 | 걸음 |
|---|---|---|---|---|
학습률 에서 준비 구간이 없으면 번 모두 터집니다. 걸음만 넣어도 한 번도 안 터집니다.
다만 에서는 준비 구간이 있어도 거의 다 터집니다.
준비 구간은 시작점이 나쁠 때를 넘겨 주는 것이지 상한을 올리지는 않습니다.
() 학습률과 판 수를 함께 정합니다. 코사인 감소식으로 예산을 바꿔 가며 기본 학습률을 고릅니다.
| 걸음 예산 | 가장 좋은 기본 학습률 | 그때 초과손실 |
|---|---|---|
예산 에서는 가 가장 좋고 부터는 가 가장 좋습니다.
짧은 예산에서는 큰 걸음으로 빨리 가야 하고, 긴 예산에서는 작은 걸음으로 정확히 가는 편이 낫습니다.
그래서 학습률과 판 수를 따로 고르면 안 됩니다. 판 수를 두 배로 늘리면 학습률도 다시 골라야 합니다.
이 문제에서 배우는 것. 실무의 감소식은 이론 조건을 만족시키려는 것이 아닙니다. 유한 예산에서 최선을 노리는 설계이고, 그래서 끝에서 정확히 이 되는 코사인과 선형이 표준이 됐습니다.
확인 4-1. 실무의 감소식이 이론과 다른 이유를 쓰세요.
답. 예산이 유한하고 그 안에서 최선을 노리기 때문입니다.
확인 4-2. 검산에서 코사인과 의 초과손실을 쓰세요.
답. 과 입니다.
확인 4-3. 검산에서 학습률 일 때 준비 구간 없음과 걸음의 발산 비율을 쓰세요.
답. 과 입니다.
문제. 문제를 진단합니다.
() 무엇을 확인해야 하는지 정리하세요.
() 학습률이 크면 어떻게 보이는지 보세요.
() 이론과 실무가 갈라지는 자리를 정리하세요.
() 이 강의를 한 장으로 모으세요.
생각의 실마리. 학습이 안 될 때 가장 흔한 원인이 학습률입니다. 그리고 그것은 처음 몇십 걸음에서 드러납니다.
풀이. () 정리합니다.
| 증상 | 무엇을 봅니다 |
|---|---|
| 손실이 안 줄면 | 학습률이 너무 큰지 먼저 |
| 발산하면 | 준비 구간을 넣습니다 |
| 일찍 멈추면 | 학습률이 너무 빨리 줄었는지 |
| 끝에서 떨리면 | 학습률을 더 줄입니다 |
| 판 수를 바꾸면 | 학습률도 다시 고릅니다 |
() 학습률이 크면 어떻게 보이는지 봅니다. 처음 걸음입니다.
| 학습률 | 걸음 | 걸음 | 무엇으로 보이나 |
|---|---|---|---|
| 내려감 | |||
| 되올라감 | |||
| 터짐 | 터짐 | 발산 | |
| 터짐 | 터짐 | 발산 |
학습률 은 걸음에서 까지 잘 내려갔다가 걸음에서 로 되올라갑니다.
이것이 가장 헷갈리는 경우입니다. 발산이 아니라 떨림이 커서 못 내려가는 것이고, 오래 돌려도 안 좋아집니다.
학습률이 크면 처음 몇십 걸음 안에 드러납니다. 그래서 짧게 돌려 보고 고르는 것이 가장 쌉니다.
() 이론과 실무가 갈라지는 자리를 정리합니다.
| 무엇 | 어떻게 | 무엇 | 어떻게 |
|---|---|---|---|
| 이론 | 무한 걸음 | 실무 | 정해진 예산 |
| 이론 | 실무 | 코사인이나 선형 | |
| 이론 | 볼록 가정 | 실무 | 안 볼록 |
| 이론 | 최적점에 닿음 | 실무 | 쓸 만한 자리면 됨 |
이론은 무엇이 가능한지 말하고 실무는 예산 안에서 최선을 찾습니다. 둘이 다른 것이 아니라 묻는 물음이 다릅니다.
() 이 강의를 한 장으로 모읍니다.
| 물음 | 한 줄로 |
|---|---|
| 왜 줄여야 하나 | 떨림이 학습률에 비례하기 때문입니다 |
| 얼마나 줄여야 하나 | 합은 발산하고 제곱합은 수렴해야 합니다 |
| 어느 감소식이 그런가 | 가 대표입니다 |
| 그런데 실무는 | 코사인이나 선형을 씁니다 |
| 왜 다른가 | 정해진 예산 안에서 최선을 노리기 때문입니다 |
| 준비 구간은 왜 | 시작점의 그래디언트가 가장 크기 때문입니다 |
| 판 수를 바꾸면 | 학습률도 다시 골라야 합니다 |
이 문제에서 배우는 것. 수렴 조건은 무엇이 가능한지를 말하고, 실무는 주어진 예산에서 어디까지 가는지를 묻습니다. 두 물음의 답이 다르므로 이론을 알고도 다른 것을 씁니다.
확인 5-1. 학습률이 너무 클 때 손실 곡선이 어떻게 보이는지 쓰세요.
답. 잘 내려가다가 되올라가거나 곧바로 터집니다.
확인 5-2. 검산에서 학습률 의 걸음과 걸음 손실을 쓰세요.
답. 과 입니다.
확인 5-3. 이론과 실무가 묻는 물음의 차이를 쓰세요.
답. 이론은 무한 걸음에서 무엇이 가능한지를 묻고 실무는 정해진 예산에서 어디까지 가는지를 묻습니다.
| 유형 | 무엇을 묻나 | 어디를 보나 |
|---|---|---|
| 떨림의 크기 | 학습률 나누기 배치 | 문제 |
| 두 조건 | 합은 발산 제곱합은 수렴 | 문제 |
| 조건과 예산 | 다른 물음 | 문제 |
| 상수의 힘 | 다섯 자릿수 차이 | 문제 |
| 강볼록 속도 | 문제 | |
| 잡음이 없으면 | 지수적 | 문제 |
| 골이 둘이면 | 잡음이 도움 | 문제 |
| 실무 감소식 | 코사인과 선형 | 문제 |
| 준비 구간 | 상한은 못 올림 | 문제 |
| 큰 학습률의 증상 | 되올라감 | 문제 |
감소식들을 한자리에 모읍니다.
| 감소식 | 첫째 조건 | 둘째 조건 | 실무에서 |
|---|---|---|---|
| 고정 | 만족 | 어김 | 떨림이 남음 |
| 만족 | 만족 | 너무 일찍 작아짐 | |
| 1/\sqrt | 만족 | 어김 | 유한 예산에서 좋음 |
| 어김 | 만족 | 도착 못 함 | |
| 코사인 | 유한 걸음이라 무의미 | 유한 걸음이라 무의미 | 표준 |
문제 6. 떨림의 크기를 정하는 두 손잡이를 쓰세요.
답. 학습률과 배치 크기이고 그 비가 정합니다.
문제 7. 검산에서 학습률 과 의 평균 초과손실을 쓰세요.
답. 과 입니다.
문제 8. 검산에서 배치 와 의 배치 곱하기 초과손실을 쓰세요.
답. 와 입니다.
문제 9. 로빈스와 먼로의 두 조건을 쓰세요.
답. 학습률의 합이 무한이고 제곱합이 유한이어야 합니다.
문제 10. 검산에서 와 의 초과손실을 쓰세요.
답. 과 입니다.
문제 11. 검산에서 상수 를 붙였을 때의 초과손실을 쓰세요.
답. 입니다.
문제 12. 강볼록에서 거리 제곱이 어떻게 주는지 쓰세요.
답. 걸음 수의 역수로 줍니다.
문제 13. 검산에서 잡음이 없을 때 걸음과 걸음의 초과손실을 쓰세요.
답. 와 입니다.
문제 14. 검산에서 잡음 일 때 깊은 골에 간 비율을 쓰세요.
답. 입니다.
문제 15. 검산에서 코사인과 의 초과손실을 쓰세요.
답. 과 입니다.
문제 16. 검산에서 학습률 일 때 준비 구간 없음과 걸음의 발산 비율을 쓰세요.
답. 과 입니다.
문제 17. 검산에서 학습률 의 걸음과 걸음 손실을 쓰세요.
답. 과 입니다.
문제 18. 실무의 감소식이 이론과 다른 이유를 쓰세요.
답. 예산이 유한하고 그 안에서 최선을 노리기 때문입니다.
심화 1. 고정 학습률의 정상 상태를 유도하세요.
이차형식 근처에서 입니다.
| 단계 | 무엇 |
|---|---|
| 첫째 | 양변의 공분산을 취합니다 |
| 둘째 | 정상 상태에서 좌우가 같다고 둡니다 |
| 셋째 | \Sigma\approx\dfrac{\eta}{2}\Sigma_{\xi}H^ |
셋째 줄이 문제 의 관측입니다. 공분산이 에 비례하고, 초과손실은 그 흔적의 절반이므로 역시 에 비례합니다.
가 에 비례하므로 가 나옵니다.
심화 2. 두 조건이 각각 무엇을 막는지 보이세요.
| 조건이 깨지면 | 무슨 일 |
|---|---|
| 합이 유한 | 총 이동거리가 유한해 멀면 못 감 |
| 제곱합이 무한 | 잡음의 누적이 안 사라짐 |
첫째 줄이 문제 의 입니다. 합이 이므로 학습률 를 곱하면 총 이동이 뿐입니다. 시작점에서 최적점까지가 그보다 멀면 원리적으로 못 갑니다.
심화 3. 폴략과 루퍼트 평균을 정리하세요.
| 무엇 | 어떻게 |
|---|---|
| 학습률 | 처럼 천천히 줄임 |
| 반환값 | 마지막이 아니라 평균 |
| 얻는 것 | 강볼록 없이도 최적 속도 |
떨림을 평균으로 지웁니다. 문제 에서 가 좋았던 것과 이어지고, 거기에 평균까지 취하면 이론적으로도 최적이 됩니다.
실무에서 지수이동평균 형태로 다시 나타납니다. 가중 평균을 따로 들고 다니는 것이 그것입니다.
심화 4. 학습률 상한이 어디서 오는지 미리 봅니다.
이차형식에서 이어야 수렴합니다.
| 무엇 | 값 |
|---|---|
| 이 자료의 | |
| 상한 | |
| 문제 의 관측 | 에서 발산하고 은 됨 |
관측과 이론이 맞습니다. 까지는 되고 은 안 됩니다.
강에서 이 상한과 배치 크기의 관계를 봅니다.
심화 5. 안 볼록한 문제의 수렴 기준을 정리하세요.
최적점에 닿는다는 보장을 못 하므로 다른 것을 봅니다.
| 무엇 | 무엇을 보장하나 |
|---|---|
| 그래디언트 노름 | 임계점 근처에 감 |
| 평균 그래디언트 노름 | 로 줄음 |
| 안장점 탈출 | 잡음이 있으면 됨 |
둘째 줄이 표준 결과입니다. 어느 걸음에서인가 그래디언트가 작아진다는 것만 말하고, 그 자리가 좋은 자리인지는 말하지 않습니다.
문제 의 ()에서 본 것이 그 한계입니다. 잡음이 깊은 골로 데려가 주기도 하지만 보장은 아닙니다.
심화 6. 이 강의가 다음 강의로 어떻게 이어지는지 정리하세요.
| 이 강의에서 | 다음에서 |
|---|---|
| 떨림이 | 강 배치와 학습률 |
| 학습률 상한 | 강 임계 배치 크기 |
| 잡음을 줄이고 싶음 | 강 분산 감소 |
| 준비 구간 | 강 아담 |
| 학습률을 좌표마다 | 강 적응형 |
강은 이 강의의 를 정면으로 다룹니다. 둘을 함께 키울 때 어디까지 되는지가 그 물음입니다.
정답.
| 기호 | 읽는 법 | 뜻 |
|---|---|---|
| 로빈스와 먼로 조건 | Robbins-Monro conditions | 학습률 합은 발산하고 제곱합은 수렴해야 합니다 |
| 초과손실 | excess loss | 현재 손실에서 최적 손실을 뺀 값입니다 |
| 정상 상태 | stationary distribution | 걸음이 오래 지나 도달하는 분포입니다 |
| 강볼록 | strongly convex | 헤세의 최소 고윳값이 보다 큽니다 |
| 조건수 | condition number | 최대 고윳값 나누기 최소 고윳값입니다 |
| 계단식 감소 | step decay | 몇 판마다 학습률을 나눕니다 |
| 코사인 감소 | cosine annealing | 코사인 곡선으로 까지 줄입니다 |
| 준비 구간 | warmup | 처음에 학습률을 에서 올립니다 |
| 폴략 평균 | Polyak averaging | 걸음들의 평균을 답으로 씁니다 |
| 안장점 | saddle point | 어느 방향은 오르고 어느 방향은 내리는 점입니다 |
다음은 237강 배치 크기와 학습률의 관계입니다. 이 강의에서 떨림이 로 정해진다는 것을 봤습니다. 다음 강의는 둘을 함께 키울 때 어디까지 되는지를 봅니다.
import numpy as np
def pw(s):
return sum(2 if ord(c) > 0x1100 else 1 for c in str(s))
def rw(s, w):
return str(s) + ' ' * max(0, w - pw(s))
def rl(s, w):
return ' ' * max(0, w - pw(s)) + str(s)
print("=" * 78)
print("236강 SGD의 수렴 조건 코드 검산")
print("=" * 78)
rng = np.random.default_rng(20236)
n, p = 3000, 8
X = rng.normal(0, 1, (n, p))
X[:, 0] *= 3.0
beta = rng.normal(0, 1, p)
y = X @ beta + rng.normal(0, 1.0, n)
H = X.T @ X / n
bstar = np.linalg.solve(H, X.T @ y / n)
ev = np.linalg.eigvalsh(H)
Lsm, mu = float(ev.max()), float(ev.min())
def loss(b):
r = X @ b - y
return float((r ** 2).mean() / 2)
opt = loss(bstar)
def grad_mb(b, idx):
Xi = X[idx]
return Xi.T @ (Xi @ b - y[idx]) / len(idx)
print()
print("문제 1. 왜 학습률을 줄여야 하는가")
print()
print(" (1) 두 힘을 정리합니다")
rows = [
("끌어당기는 힘", "그래디언트가 최적점 쪽으로", "학습률에 비례"),
("밀어내는 힘", "잡음이 아무 방향으로", "학습률의 제곱에 비례"),
("균형점", "둘이 같아지는 자리", "학습률에 비례"),
("학습률을 줄이면", "둘 다 줄지만 잡음이 더", "균형점이 최적점으로"),
]
w = [max(pw(r[i]) for r in rows + [("무엇", "무엇인가", "학습률과의 관계")]) for i in range(3)]
print(" " + rw("무엇", w[0]) + " " + rw("무엇인가", w[1]) + " " + "학습률과의 관계")
for r in rows:
print(" " + rw(r[0], w[0]) + " " + rw(r[1], w[1]) + " " + r[2])
print(" 둘째 줄이 핵심입니다. 잡음의 기여가 학습률의 제곱으로 들어옵니다")
print(" 그래서 학습률을 반으로 줄이면 떨림은 네 배가 아니라 절반이 됩니다")
print()
print(" (2) 고정 학습률에서 균형점을 잽니다")
def run_const(lr, B, steps, seed):
rr = np.random.default_rng(seed)
b = np.zeros(p)
tail = []
for t in range(steps):
idx = rr.integers(0, n, B)
b -= lr * grad_mb(b, idx)
if t >= steps - 2000:
tail.append(loss(b) - opt)
return b, float(np.mean(tail))
print(" 배치를 16 으로 두고 마지막 2000 걸음의 평균 초과손실을 봅니다")
print(" " + rl("학습률", 12) + " " + rl("평균 초과손실", 16) + " " + rl("학습률 대비", 16) + " " + rl("절반으로 줄인 비", 16))
prev = None
for lr in [0.08, 0.04, 0.02, 0.01]:
_, ex = run_const(lr, 16, 20000, 11)
ratio = (ex / prev) if prev is not None else float('nan')
rs = "%.6f" % ratio if ratio == ratio else "기준"
print(" " + rl("%.4f" % lr, 12) + " " + rl("%.8f" % ex, 16) + " " + rl("%.6f" % (ex / lr), 16) + " " + rl(rs, 16))
prev = ex
print(" 셋째 열이 거의 같습니다. 초과손실이 학습률에 비례합니다")
print(" 학습률을 절반으로 줄일 때마다 초과손실도 절반이 됩니다")
print(" 0 으로 보내지 않으면 0 에 안 닿습니다")
print()
print(" (3) 배치 크기도 같은 자리에 들어오는지 봅니다")
print(" 학습률을 0.04 로 고정하고 배치만 바꿉니다")
print(" " + rl("배치 크기", 12) + " " + rl("평균 초과손실", 16) + " " + rl("배치 곱하기 초과손실", 22))
for B in [4, 8, 16, 32, 64]:
_, ex = run_const(0.04, B, 20000, 12)
print(" " + rl("%d" % B, 12) + " " + rl("%.8f" % ex, 16) + " " + rl("%.6f" % (ex * B), 22))
print(" 셋째 열이 거의 같습니다. 초과손실이 배치 크기에 반비례합니다")
print(" 학습률 나누기 배치 크기가 떨림의 크기를 정합니다")
print(" 235강 문제 3 의 선형 스케일링이 여기서 다시 나옵니다")
print()
print("문제 2. 로빈스와 먼로의 조건")
print()
print(" (1) 두 조건을 적습니다")
rows = [
("첫째 조건", "학습률의 합이 무한", "아무리 멀어도 갈 수 있음"),
("둘째 조건", "학습률 제곱의 합이 유한", "잡음이 결국 사라짐"),
("둘 다 필요", "하나만으로는 안 됨", "문제 2 에서 확인"),
]
w = [max(pw(r[i]) for r in rows + [("무엇", "무엇을 말하나", "왜 필요한가")]) for i in range(3)]
print(" " + rw("무엇", w[0]) + " " + rw("무엇을 말하나", w[1]) + " " + "왜 필요한가")
for r in rows:
print(" " + rw(r[0], w[0]) + " " + rw(r[1], w[1]) + " " + r[2])
print()
print(" (2) 여러 감소식이 조건을 만족하는지 셉니다")
def sums(f, T):
v = np.array([f(t) for t in range(1, T + 1)])
return float(v.sum()), float((v ** 2).sum())
sched = [
("고정", lambda t: 1.0),
("1 나누기 t", lambda t: 1.0 / t),
("1 나누기 t 의 제곱근", lambda t: 1.0 / np.sqrt(t)),
("1 나누기 t 제곱", lambda t: 1.0 / (t ** 2)),
("1 나누기 t 의 0.7 제곱", lambda t: 1.0 / (t ** 0.7)),
]
w0 = max(pw(x[0]) for x in sched + [("감소식", 0)])
print(" T 를 키우며 두 합이 어떻게 되는지 봅니다")
print(" " + rw("감소식", w0) + " " + rl("T 가 1000 일 때 합", 20) + " " + rl("T 가 100000 일 때 합", 22) + " " + rl("제곱합 100000", 18))
for nm, f in sched:
s1, _ = sums(f, 1000)
s2, q2 = sums(f, 100000)
print(" " + rw(nm, w0) + " " + rl("%.4f" % s1, 20) + " " + rl("%.4f" % s2, 22) + " " + rl("%.6f" % q2, 18))
print(" 첫째 줄과 셋째 줄은 합이 계속 커집니다. 첫째 조건을 만족합니다")
print(" 그런데 제곱합도 함께 커져 둘째 조건을 어깁니다")
print(" 둘째 줄만 합은 발산하고 제곱합은 수렴합니다")
print(" 넷째 줄은 합이 1.6449 에 멈춰 첫째 조건을 어깁니다")
print()
print(" (3) 조건을 어기면 정말 안 되는지 확인합니다")
def run_sched(f, B, steps, seed, lr0=0.05):
rr = np.random.default_rng(seed)
b = np.zeros(p)
for t in range(1, steps + 1):
idx = rr.integers(0, n, B)
b -= lr0 * f(t) * grad_mb(b, idx)
return loss(b) - opt
print(" 기본 학습률 0.05 에 감소식을 곱해 40000 걸음 갑니다")
print(" " + rw("감소식", w0) + " " + rw("첫째 조건", 12) + " " + rw("둘째 조건", 12) + " " + rl("초과손실", 16))
flags = [("만족", "어김"), ("만족", "만족"), ("만족", "어김"), ("어김", "만족"), ("만족", "어김")]
for (nm, f), fl in zip(sched, flags):
ex = run_sched(f, 16, 40000, 21)
print(" " + rw(nm, w0) + " " + rw(fl[0], 12) + " " + rw(fl[1], 12) + " " + rl("%.10f" % ex, 16))
print(" 뜻밖의 결과입니다. 조건을 다 만족하는 1 나누기 t 가 거의 꼴찌입니다")
print(" 1 나누기 t 제곱은 첫째 조건을 어겨 아예 도착을 못 합니다. 이것은 예상대로입니다")
print(" 그런데 제곱근이 가장 좋습니다. 조건은 무한 걸음에 대한 것이기 때문입니다")
print(" 40000 걸음에서 1 나누기 t 는 이미 학습률이 %.8f 로 사실상 멈췄습니다" % (0.05 / 40000))
print(" 조건을 만족하는지와 정해진 예산 안에서 좋은지는 다른 물음입니다")
print()
print(" (4) 1 나누기 t 에 상수를 붙여 봅니다")
print(" 감소식이 나쁜 것이 아니라 상수가 안 맞은 것입니다")
print(" " + rl("앞에 붙인 상수", 16) + " " + rl("첫 걸음 학습률", 18) + " " + rl("마지막 학습률", 18) + " " + rl("초과손실", 16))
for c0 in [0.05, 0.5, 2.0, 8.0]:
rr = np.random.default_rng(23)
b = np.zeros(p)
T0 = 40000
for t in range(1, T0 + 1):
idx = rr.integers(0, n, 16)
b -= min(c0 / t, 0.05) * grad_mb(b, idx)
print(" " + rl("%.4f" % c0, 16) + " " + rl("%.8f" % min(c0, 0.05), 18) + " " + rl("%.8f" % min(c0 / T0, 0.05), 18) + " " + rl("%.10f" % (loss(b) - opt), 16))
print(" 상수를 키우면 크게 좋아집니다")
print(" 같은 감소식인데 상수 하나로 결과가 자릿수 단위로 달라집니다")
print(" 로빈스와 먼로의 조건은 상수를 정해 주지 않습니다. 그것이 실무의 몫입니다")
print()
print("문제 3. 볼록한 경우의 속도")
print()
print(" (1) 세 가정과 속도를 정리합니다")
rows = [
("볼록", "1 나누기 t 의 제곱근", "가장 약한 가정"),
("강볼록", "1 나누기 t", "골이 확실히 둥금"),
("잡음이 없으면", "지수적으로", "전체 배치 경사하강"),
]
w = [max(pw(r[i]) for r in rows + [("가정", "속도", "덧붙임")]) for i in range(3)]
print(" " + rw("가정", w[0]) + " " + rw("속도", w[1]) + " " + "덧붙임")
for r in rows:
print(" " + rw(r[0], w[0]) + " " + rw(r[1], w[1]) + " " + r[2])
print(" 이 자료의 헤세 고윳값은 최소 %.6f 최대 %.6f 입니다" % (mu, Lsm))
print(" 최소가 0 보다 크므로 강볼록입니다. 조건수는 %.6f 입니다" % (Lsm / mu))
print()
print(" (2) 강볼록에서 1 나누기 t 속도를 확인합니다")
print(" 학습률을 2 나누기 mu 곱하기 t 로 둡니다. 이론이 말하는 모양입니다")
c = 2.0 / mu
print(" 시드를 20 개 써서 평균 냅니다")
print(" " + rl("걸음 수", 12) + " " + rl("최적점과의 거리 제곱", 22) + " " + rl("걸음 수 곱하기 거리 제곱", 26))
for T in [1000, 4000, 16000, 64000]:
ds = []
for sd in range(20):
rr = np.random.default_rng(31 + sd)
b = np.zeros(p)
for t in range(1, T + 1):
idx = rr.integers(0, n, 16)
b -= min(c / t, 0.05) * grad_mb(b, idx)
ds.append(float(((b - bstar) ** 2).sum()))
d2 = float(np.mean(ds))
print(" " + rl("%d" % T, 12) + " " + rl("%.10f" % d2, 22) + " " + rl("%.6f" % (T * d2), 26))
print(" 셋째 열이 어느 정도 안정됩니다. 거리 제곱이 대략 1 나누기 T 로 줍니다")
print(" 학습률에 상한을 씌운 것은 앞쪽에서 c 나누기 t 가 너무 크기 때문입니다")
print(" 수렴이 보장되는 학습률 상한은 2 나누기 최대 고윳값인 %.6f 입니다" % (2.0 / Lsm))
print()
print(" (3) 잡음이 없으면 얼마나 빠른지 견줍니다")
print(" 전체 배치로 고정 학습률 경사하강을 돌립니다")
lr_gd = 1.0 / Lsm
print(" 학습률을 1 나누기 최대 고윳값인 %.6f 로 둡니다" % lr_gd)
print(" " + rl("걸음 수", 12) + " " + rl("초과손실", 20) + " " + rl("이론이 말하는 비율", 22))
b = np.zeros(p)
theory0 = loss(np.zeros(p)) - opt
for T in [50, 100, 200, 400]:
b = np.zeros(p)
for _ in range(T):
b -= lr_gd * (X.T @ (X @ b - y) / n)
rate = (1 - mu / Lsm) ** T
print(" " + rl("%d" % T, 12) + " " + rl("%.4e" % (loss(b) - opt), 20) + " " + rl("%.4e" % (theory0 * rate), 22))
print(" 잡음이 없으면 초과손실이 지수적으로 줄어듭니다")
print(" 400 걸음 만에 확률적 방법의 40000 걸음보다 훨씬 낮은 값에 닿습니다")
print(" 다만 한 걸음이 %d 배 비쌉니다. 235강 문제 3 의 맞바꿈입니다" % (n // 16))
print()
print(" (4) 안 볼록한 경우를 봅니다")
def f_nc(x):
return float(x ** 4 / 4 - x ** 2 / 2 + 0.1 * x)
def g_nc(x, noise, rr):
return x ** 3 - x + 0.1 + noise * rr.normal()
print(" 골이 둘인 함수에서 잡음이 무엇을 하는지 봅니다")
print(" 깊은 골은 %.6f 근처이고 얕은 골은 %.6f 근처입니다" % (-1.0466, 0.9512))
print(" 학습률 0.05 로 5000 걸음 가고 시작점은 0.9 입니다")
print(" " + rl("잡음 크기", 12) + " " + rl("깊은 골에 간 비율", 20) + " " + rl("얕은 골에 간 비율", 20) + " " + rl("멀리 달아난 비율", 20))
for noise in [0.0, 1.0, 2.0, 3.0, 8.0]:
deep = 0
away = 0
for sd in range(300):
rr = np.random.default_rng(1000 + sd)
x = 0.9
for t in range(1, 5001):
x -= (0.05 / (1 + 0.002 * t)) * g_nc(x, noise, rr)
if abs(x) > 5:
break
if abs(x) > 2:
away += 1
elif x < 0:
deep += 1
print(" " + rl("%.4f" % noise, 12) + " " + rl("%.6f" % (deep / 300.0), 20) + " " + rl("%.6f" % (1 - deep / 300.0 - away / 300.0), 20) + " " + rl("%.6f" % (away / 300.0), 20))
print(" 잡음이 0 이면 시작점이 얕은 골 쪽이라 언제나 얕은 골로 갑니다")
print(" 잡음 3 에서 73 퍼센트가 깊은 골로 넘어갑니다")
print(" 잡음 8 에서는 65 퍼센트로 다시 내려갑니다. 너무 크면 어느 골에도 안 머무릅니다")
print(" 209강 문제 5 에서 국소 최소가 문제라 했는데 잡음이 그것을 어느 정도 풉니다")
print()
print("문제 4. 실무에서 쓰는 감소식")
print()
print(" (1) 흔한 감소식을 정리합니다")
rows = [
("계단식", "몇 판마다 10 분의 1", "가장 오래 쓰임"),
("코사인", "부드럽게 0 까지", "요즘 기본"),
("선형", "곧게 0 까지", "언어모형에서 흔함"),
("준비 구간", "처음에 0 에서 올림", "앞에서 터지는 것을 막음"),
("1 나누기 t", "이론이 말하는 것", "실무에서는 잘 안 씀"),
]
w = [max(pw(r[i]) for r in rows + [("무엇", "어떻게", "언제 쓰나")]) for i in range(3)]
print(" " + rw("무엇", w[0]) + " " + rw("어떻게", w[1]) + " " + "언제 쓰나")
for r in rows:
print(" " + rw(r[0], w[0]) + " " + rw(r[1], w[1]) + " " + r[2])
print()
print(" (2) 네 감소식을 같은 예산에서 견줍니다")
T = 20000
lr0 = 0.06
scheds = [
("고정", lambda t: 1.0),
("계단식", lambda t: 0.1 ** (3 * t // T)),
("코사인", lambda t: 0.5 * (1 + np.cos(np.pi * t / T))),
("선형", lambda t: 1.0 - t / T),
("1 나누기 t", lambda t: 1.0 / t),
]
w0 = max(pw(x[0]) for x in scheds + [("감소식", 0)])
print(" 기본 학습률 %.4f 에 %d 걸음입니다" % (lr0, T))
print(" " + rw("감소식", w0) + " " + rl("마지막 학습률 비", 18) + " " + rl("초과손실", 16))
for nm, f in scheds:
rr = np.random.default_rng(41)
b = np.zeros(p)
for t in range(1, T + 1):
idx = rr.integers(0, n, 16)
b -= lr0 * f(t) * grad_mb(b, idx)
print(" " + rw(nm, w0) + " " + rl("%.8f" % f(T), 18) + " " + rl("%.10f" % (loss(b) - opt), 16))
print(" 끝에서 학습률이 0 에 가까워지는 셋이 크게 낫습니다")
print(" 1 나누기 t 는 조건을 만족하지만 너무 일찍 작아져 뒤처집니다")
print(" 실무의 감소식은 이론 조건이 아니라 정해진 예산 안에서 최선을 노립니다")
print()
print(" (3) 준비 구간이 왜 필요한지 봅니다")
print(" 처음 걸음에서 그래디언트가 얼마나 큰지 봅니다")
b_zero = np.zeros(p)
b_mid = bstar * 0.9
print(" " + rw("어디서", 20) + " " + rl("전체 그래디언트 노름", 22) + " " + rl("배치 16 의 평균 노름", 22))
for nm, bb in [("시작점", b_zero), ("최적점 근처", b_mid)]:
gf = float(np.linalg.norm(X.T @ (X @ bb - y) / n))
nr = []
for _ in range(500):
idx = rng.integers(0, n, 16)
nr.append(float(np.linalg.norm(grad_mb(bb, idx))))
print(" " + rw(nm, 20) + " " + rl("%.6f" % gf, 22) + " " + rl("%.6f" % float(np.mean(nr)), 22))
print(" 시작점에서 그래디언트가 훨씬 큽니다")
print(" 그래서 같은 학습률이라도 첫 걸음이 가장 위험합니다")
print(" 선형 회귀에서는 준비 구간을 넣어도 결과가 똑같습니다")
print(" 걸음이 쌓이면 시작점 의존이 완전히 사라지기 때문입니다")
print(" 그래서 문제 3 의 4 차 함수로 옮겨 봅니다. 시작점은 2.5 이고 잡음은 0.5 입니다")
print(" " + rl("학습률", 10) + " " + rl("준비 구간 없음", 18) + " " + rl("50 걸음", 14) + " " + rl("200 걸음", 14) + " " + rl("1000 걸음", 14))
old3 = np.seterr(over='ignore', invalid='ignore')
for lr_w in [0.3, 0.5, 0.7]:
cells = []
for wu in [0, 50, 200, 1000]:
far = 0
for sd in range(200):
rr = np.random.default_rng(2000 + sd)
x = 2.5
for t in range(1, 3001):
sc = min(1.0, t / wu) if wu > 0 else 1.0
x -= lr_w * sc * g_nc(x, 0.5, rr)
if not np.isfinite(x) or abs(x) > 1e3:
break
far += 0 if (np.isfinite(x) and abs(x) < 3) else 1
cells.append("%.6f" % (far / 200.0))
print(" " + rl("%.4f" % lr_w, 10) + " " + rl(cells[0], 18) + " " + rl(cells[1], 14) + " " + rl(cells[2], 14) + " " + rl(cells[3], 14))
np.seterr(**old3)
print(" 표의 값은 발산한 비율입니다")
print(" 학습률 0.5 에서 준비 구간이 없으면 200 번 모두 터집니다")
print(" 50 걸음만 넣어도 한 번도 안 터집니다")
print(" 다만 0.7 에서는 준비 구간이 있어도 거의 다 터집니다")
print(" 준비 구간은 시작점이 나쁠 때를 넘겨 주는 것이지 상한을 올리지는 않습니다")
print()
print(" (4) 학습률과 판 수를 함께 정하는 것을 봅니다")
print(" 코사인 감소식으로 예산을 바꿔 가며 기본 학습률을 고릅니다")
print(" " + rl("걸음 예산", 12) + " " + rl("가장 좋은 기본 학습률", 24) + " " + rl("그때 초과손실", 18))
for Tb in [2000, 8000, 32000]:
best = None
for lr in [0.02, 0.04, 0.08, 0.16]:
rr = np.random.default_rng(61)
b = np.zeros(p)
for t in range(1, Tb + 1):
idx = rr.integers(0, n, 16)
b -= lr * 0.5 * (1 + np.cos(np.pi * t / Tb)) * grad_mb(b, idx)
v = loss(b) - opt
if np.isfinite(v) and (best is None or v < best[1]):
best = (lr, v)
print(" " + rl("%d" % Tb, 12) + " " + rl("%.4f" % best[0], 24) + " " + rl("%.10f" % best[1], 18))
print(" 예산이 커지면 더 큰 기본 학습률이 유리해집니다")
print(" 멀리 갈 시간이 있으면 처음에 크게 움직여도 되기 때문입니다")
print(" 그래서 학습률과 판 수를 따로 고르면 안 됩니다")
print()
print("문제 5. 실무에서 쓰기")
print()
print(" (1) 무엇을 확인해야 하는지 정리합니다")
rows = [
("손실이 안 줄면", "학습률이 너무 큰지 먼저"),
("발산하면", "준비 구간을 넣습니다"),
("일찍 멈추면", "학습률이 너무 빨리 줄었는지"),
("끝에서 떨리면", "학습률을 더 줄입니다"),
("판 수를 바꾸면", "학습률도 다시 고릅니다"),
]
w = [max(pw(r[i]) for r in rows + [("증상", "무엇을 봅니다")]) for i in range(2)]
print(" " + rw("증상", w[0]) + " " + "무엇을 봅니다")
for r in rows:
print(" " + rw(r[0], w[0]) + " " + r[1])
print()
print(" (2) 학습률이 너무 크면 어떻게 보이는지 봅니다")
print(" 학습률을 올려 가며 처음 200 걸음의 손실을 봅니다")
print(" " + rl("학습률", 12) + " " + rl("50 걸음", 16) + " " + rl("200 걸음", 16) + " " + "무엇으로 보이나")
old = np.seterr(over='ignore', invalid='ignore')
for lr in [0.02, 0.1, 0.3, 0.6]:
rr = np.random.default_rng(71)
b = np.zeros(p)
v50 = None
for t in range(1, 201):
idx = rr.integers(0, n, 16)
b -= lr * grad_mb(b, idx)
if t == 50:
v50 = loss(b)
v200 = loss(b)
s50 = "%.6f" % v50 if np.isfinite(v50) and v50 < 1e6 else "터짐"
s200 = "%.6f" % v200 if np.isfinite(v200) and v200 < 1e6 else "터짐"
if not np.isfinite(v200) or v200 > 1e6:
txt = "발산"
elif v200 > v50:
txt = "되올라감"
else:
txt = "내려감"
print(" " + rl("%.4f" % lr, 12) + " " + rl(s50, 16) + " " + rl(s200, 16) + " " + txt)
np.seterr(**old)
print(" 학습률이 크면 처음 몇 십 걸음 안에 드러납니다")
print(" 그래서 짧게 돌려 보고 고르는 것이 가장 쌉니다")
print()
print(" (3) 이론과 실무가 갈라지는 자리를 정리합니다")
rows = [
("이론", "무한 걸음", "실무", "정해진 예산"),
("이론", "1 나누기 t", "실무", "코사인이나 선형"),
("이론", "볼록 가정", "실무", "안 볼록"),
("이론", "최적점에 닿음", "실무", "쓸 만한 자리면 됨"),
]
w = [max(pw(r[i]) for r in rows + [("무엇", "어떻게", "무엇", "어떻게")]) for i in range(4)]
print(" " + rw("무엇", w[0]) + " " + rw("어떻게", w[1]) + " " + rw("무엇", w[2]) + " " + "어떻게")
for r in rows:
print(" " + rw(r[0], w[0]) + " " + rw(r[1], w[1]) + " " + rw(r[2], w[2]) + " " + r[3])
print(" 이론은 무엇이 가능한지 말하고 실무는 예산 안에서 최선을 찾습니다")
print(" 둘이 다른 것이 아니라 묻는 물음이 다릅니다")
print()
print(" (4) 이 강의를 한 장으로 모읍니다")
rows = [
("왜 줄여야 하나", "떨림이 학습률에 비례하기 때문입니다"),
("얼마나 줄여야 하나", "합은 발산하고 제곱합은 수렴해야 합니다"),
("어느 감소식이 그런가", "1 나누기 t 가 대표입니다"),
("그런데 실무는", "코사인이나 선형을 씁니다"),
("왜 다른가", "정해진 예산 안에서 최선을 노리기 때문입니다"),
("준비 구간은 왜", "시작점의 그래디언트가 가장 크기 때문입니다"),
("판 수를 바꾸면", "학습률도 다시 골라야 합니다"),
]
w = [max(pw(r[i]) for r in rows + [("물음", "한 줄로")]) for i in range(2)]
print(" " + rw("물음", w[0]) + " " + "한 줄로")
for r in rows:
print(" " + rw(r[0], w[0]) + " " + r[1])
print(" 237강은 배치 크기와 학습률의 관계를 정면으로 다룹니다")
print()
print("=" * 78)
print("검산 끝")
print("=" * 78)
# ==============================================================================
# 236강 SGD의 수렴 조건 코드 검산
# ==============================================================================
#
# 문제 1. 왜 학습률을 줄여야 하는가
#
# (1) 두 힘을 정리합니다
# 무엇 무엇인가 학습률과의 관계
# 끌어당기는 힘 그래디언트가 최적점 쪽으로 학습률에 비례
# 밀어내는 힘 잡음이 아무 방향으로 학습률의 제곱에 비례
# 균형점 둘이 같아지는 자리 학습률에 비례
# 학습률을 줄이면 둘 다 줄지만 잡음이 더 균형점이 최적점으로
# 둘째 줄이 핵심입니다. 잡음의 기여가 학습률의 제곱으로 들어옵니다
# 그래서 학습률을 반으로 줄이면 떨림은 네 배가 아니라 절반이 됩니다
#
# (2) 고정 학습률에서 균형점을 잽니다
# 배치를 16 으로 두고 마지막 2000 걸음의 평균 초과손실을 봅니다
# 학습률 평균 초과손실 학습률 대비 절반으로 줄인 비
# 0.0800 0.02897920 0.362240 기준
# 0.0400 0.01195248 0.298812 0.412450
# 0.0200 0.00563450 0.281725 0.471408
# 0.0100 0.00280877 0.280877 0.498495
# 셋째 열이 거의 같습니다. 초과손실이 학습률에 비례합니다
# 학습률을 절반으로 줄일 때마다 초과손실도 절반이 됩니다
# 0 으로 보내지 않으면 0 에 안 닿습니다
#
# (3) 배치 크기도 같은 자리에 들어오는지 봅니다
# 학습률을 0.04 로 고정하고 배치만 바꿉니다
# 배치 크기 평균 초과손실 배치 곱하기 초과손실
# 4 0.05159470 0.206379
# 8 0.02583597 0.206688
# 16 0.01221812 0.195490
# 32 0.00602719 0.192870
# 64 0.00275221 0.176141
# 셋째 열이 거의 같습니다. 초과손실이 배치 크기에 반비례합니다
# 학습률 나누기 배치 크기가 떨림의 크기를 정합니다
# 235강 문제 3 의 선형 스케일링이 여기서 다시 나옵니다
#
# 문제 2. 로빈스와 먼로의 조건
#
# (1) 두 조건을 적습니다
# 무엇 무엇을 말하나 왜 필요한가
# 첫째 조건 학습률의 합이 무한 아무리 멀어도 갈 수 있음
# 둘째 조건 학습률 제곱의 합이 유한 잡음이 결국 사라짐
# 둘 다 필요 하나만으로는 안 됨 문제 2 에서 확인
#
# (2) 여러 감소식이 조건을 만족하는지 셉니다
# T 를 키우며 두 합이 어떻게 되는지 봅니다
# 감소식 T 가 1000 일 때 합 T 가 100000 일 때 합 제곱합 100000
# 고정 1000.0000 100000.0000 100000.000000
# 1 나누기 t 7.4855 12.0901 1.644924
# 1 나누기 t 의 제곱근 61.8010 630.9968 12.090146
# 1 나누기 t 제곱 1.6439 1.6449 1.082323
# 1 나누기 t 의 0.7 제곱 23.7032 102.6310 3.080547
# 첫째 줄과 셋째 줄은 합이 계속 커집니다. 첫째 조건을 만족합니다
# 그런데 제곱합도 함께 커져 둘째 조건을 어깁니다
# 둘째 줄만 합은 발산하고 제곱합은 수렴합니다
# 넷째 줄은 합이 1.6449 에 멈춰 첫째 조건을 어깁니다
#
# (3) 조건을 어기면 정말 안 되는지 확인합니다
# 기본 학습률 0.05 에 감소식을 곱해 40000 걸음 갑니다
# 감소식 첫째 조건 둘째 조건 초과손실
# 고정 만족 어김 0.0085939469
# 1 나누기 t 만족 만족 1.0678260713
# 1 나누기 t 의 제곱근 만족 어김 0.0000389622
# 1 나누기 t 제곱 어김 만족 3.2188588562
# 1 나누기 t 의 0.7 제곱 만족 어김 0.0013222698
# 뜻밖의 결과입니다. 조건을 다 만족하는 1 나누기 t 가 거의 꼴찌입니다
# 1 나누기 t 제곱은 첫째 조건을 어겨 아예 도착을 못 합니다. 이것은 예상대로입니다
# 그런데 제곱근이 가장 좋습니다. 조건은 무한 걸음에 대한 것이기 때문입니다
# 40000 걸음에서 1 나누기 t 는 이미 학습률이 0.00000125 로 사실상 멈췄습니다
# 조건을 만족하는지와 정해진 예산 안에서 좋은지는 다른 물음입니다
#
# (4) 1 나누기 t 에 상수를 붙여 봅니다
# 감소식이 나쁜 것이 아니라 상수가 안 맞은 것입니다
# 앞에 붙인 상수 첫 걸음 학습률 마지막 학습률 초과손실
# 0.0500 0.05000000 0.00000125 1.0191982310
# 0.5000 0.05000000 0.00001250 0.0001923195
# 2.0000 0.05000000 0.00005000 0.0000093610
# 8.0000 0.05000000 0.00020000 0.0000313323
# 상수를 키우면 크게 좋아집니다
# 같은 감소식인데 상수 하나로 결과가 자릿수 단위로 달라집니다
# 로빈스와 먼로의 조건은 상수를 정해 주지 않습니다. 그것이 실무의 몫입니다
#
# 문제 3. 볼록한 경우의 속도
#
# (1) 세 가정과 속도를 정리합니다
# 가정 속도 덧붙임
# 볼록 1 나누기 t 의 제곱근 가장 약한 가정
# 강볼록 1 나누기 t 골이 확실히 둥금
# 잡음이 없으면 지수적으로 전체 배치 경사하강
# 이 자료의 헤세 고윳값은 최소 0.922063 최대 9.274997 입니다
# 최소가 0 보다 크므로 강볼록입니다. 조건수는 10.058958 입니다
#
# (2) 강볼록에서 1 나누기 t 속도를 확인합니다
# 학습률을 2 나누기 mu 곱하기 t 로 둡니다. 이론이 말하는 모양입니다
# 시드를 20 개 써서 평균 냅니다
# 걸음 수 최적점과의 거리 제곱 걸음 수 곱하기 거리 제곱
# 1000 0.0007646263 0.764626
# 4000 0.0001405747 0.562299
# 16000 0.0000365771 0.585234
# 64000 0.0000108813 0.696403
# 셋째 열이 어느 정도 안정됩니다. 거리 제곱이 대략 1 나누기 T 로 줍니다
# 학습률에 상한을 씌운 것은 앞쪽에서 c 나누기 t 가 너무 크기 때문입니다
# 수렴이 보장되는 학습률 상한은 2 나누기 최대 고윳값인 0.215633 입니다
#
# (3) 잡음이 없으면 얼마나 빠른지 견줍니다
# 전체 배치로 고정 학습률 경사하강을 돌립니다
# 학습률을 1 나누기 최대 고윳값인 0.107817 로 둡니다
# 걸음 수 초과손실 이론이 말하는 비율
# 50 3.2132e-05 2.7140e-02
# 100 3.6663e-10 1.4450e-04
# 200 5.5511e-17 4.0963e-09
# 400 5.5511e-17 3.2919e-18
# 잡음이 없으면 초과손실이 지수적으로 줄어듭니다
# 400 걸음 만에 확률적 방법의 40000 걸음보다 훨씬 낮은 값에 닿습니다
# 다만 한 걸음이 187 배 비쌉니다. 235강 문제 3 의 맞바꿈입니다
#
# (4) 안 볼록한 경우를 봅니다
# 골이 둘인 함수에서 잡음이 무엇을 하는지 봅니다
# 깊은 골은 -1.046600 근처이고 얕은 골은 0.951200 근처입니다
# 학습률 0.05 로 5000 걸음 가고 시작점은 0.9 입니다
# 잡음 크기 깊은 골에 간 비율 얕은 골에 간 비율 멀리 달아난 비율
# 0.0000 0.000000 1.000000 0.000000
# 1.0000 0.006667 0.993333 0.000000
# 2.0000 0.330000 0.670000 0.000000
# 3.0000 0.730000 0.270000 0.000000
# 8.0000 0.646667 0.353333 0.000000
# 잡음이 0 이면 시작점이 얕은 골 쪽이라 언제나 얕은 골로 갑니다
# 잡음 3 에서 73 퍼센트가 깊은 골로 넘어갑니다
# 잡음 8 에서는 65 퍼센트로 다시 내려갑니다. 너무 크면 어느 골에도 안 머무릅니다
# 209강 문제 5 에서 국소 최소가 문제라 했는데 잡음이 그것을 어느 정도 풉니다
#
# 문제 4. 실무에서 쓰는 감소식
#
# (1) 흔한 감소식을 정리합니다
# 무엇 어떻게 언제 쓰나
# 계단식 몇 판마다 10 분의 1 가장 오래 쓰임
# 코사인 부드럽게 0 까지 요즘 기본
# 선형 곧게 0 까지 언어모형에서 흔함
# 준비 구간 처음에 0 에서 올림 앞에서 터지는 것을 막음
# 1 나누기 t 이론이 말하는 것 실무에서는 잘 안 씀
#
# (2) 네 감소식을 같은 예산에서 견줍니다
# 기본 학습률 0.0600 에 20000 걸음입니다
# 감소식 마지막 학습률 비 초과손실
# 고정 1.00000000 0.0123034940
# 계단식 0.00100000 0.0001319542
# 코사인 0.00000000 0.0000608211
# 선형 0.00000000 0.0003681695
# 1 나누기 t 0.00005000 0.9804811660
# 끝에서 학습률이 0 에 가까워지는 셋이 크게 낫습니다
# 1 나누기 t 는 조건을 만족하지만 너무 일찍 작아져 뒤처집니다
# 실무의 감소식은 이론 조건이 아니라 정해진 예산 안에서 최선을 노립니다
#
# (3) 준비 구간이 왜 필요한지 봅니다
# 처음 걸음에서 그래디언트가 얼마나 큰지 봅니다
# 어디서 전체 그래디언트 노름 배치 16 의 평균 노름
# 시작점 6.294745 6.931398
# 최적점 근처 0.629475 1.138632
# 시작점에서 그래디언트가 훨씬 큽니다
# 그래서 같은 학습률이라도 첫 걸음이 가장 위험합니다
# 선형 회귀에서는 준비 구간을 넣어도 결과가 똑같습니다
# 걸음이 쌓이면 시작점 의존이 완전히 사라지기 때문입니다
# 그래서 문제 3 의 4 차 함수로 옮겨 봅니다. 시작점은 2.5 이고 잡음은 0.5 입니다
# 학습률 준비 구간 없음 50 걸음 200 걸음 1000 걸음
# 0.3000 0.000000 0.000000 0.000000 0.000000
# 0.5000 1.000000 0.000000 0.000000 0.000000
# 0.7000 1.000000 0.980000 0.980000 0.945000
# 표의 값은 발산한 비율입니다
# 학습률 0.5 에서 준비 구간이 없으면 200 번 모두 터집니다
# 50 걸음만 넣어도 한 번도 안 터집니다
# 다만 0.7 에서는 준비 구간이 있어도 거의 다 터집니다
# 준비 구간은 시작점이 나쁠 때를 넘겨 주는 것이지 상한을 올리지는 않습니다
#
# (4) 학습률과 판 수를 함께 정하는 것을 봅니다
# 코사인 감소식으로 예산을 바꿔 가며 기본 학습률을 고릅니다
# 걸음 예산 가장 좋은 기본 학습률 그때 초과손실
# 2000 0.0400 0.0002837135
# 8000 0.0200 0.0001321884
# 32000 0.0200 0.0000293055
# 예산이 커지면 더 큰 기본 학습률이 유리해집니다
# 멀리 갈 시간이 있으면 처음에 크게 움직여도 되기 때문입니다
# 그래서 학습률과 판 수를 따로 고르면 안 됩니다
#
# 문제 5. 실무에서 쓰기
#
# (1) 무엇을 확인해야 하는지 정리합니다
# 증상 무엇을 봅니다
# 손실이 안 줄면 학습률이 너무 큰지 먼저
# 발산하면 준비 구간을 넣습니다
# 일찍 멈추면 학습률이 너무 빨리 줄었는지
# 끝에서 떨리면 학습률을 더 줄입니다
# 판 수를 바꾸면 학습률도 다시 고릅니다
#
# (2) 학습률이 너무 크면 어떻게 보이는지 봅니다
# 학습률을 올려 가며 처음 200 걸음의 손실을 봅니다
# 학습률 50 걸음 200 걸음 무엇으로 보이나
# 0.0200 0.896204 0.507135 내려감
# 0.1000 0.510727 0.523501 되올라감
# 0.3000 터짐 터짐 발산
# 0.6000 터짐 터짐 발산
# 학습률이 크면 처음 몇 십 걸음 안에 드러납니다
# 그래서 짧게 돌려 보고 고르는 것이 가장 쌉니다
#
# (3) 이론과 실무가 갈라지는 자리를 정리합니다
# 무엇 어떻게 무엇 어떻게
# 이론 무한 걸음 실무 정해진 예산
# 이론 1 나누기 t 실무 코사인이나 선형
# 이론 볼록 가정 실무 안 볼록
# 이론 최적점에 닿음 실무 쓸 만한 자리면 됨
# 이론은 무엇이 가능한지 말하고 실무는 예산 안에서 최선을 찾습니다
# 둘이 다른 것이 아니라 묻는 물음이 다릅니다
#
# (4) 이 강의를 한 장으로 모읍니다
# 물음 한 줄로
# 왜 줄여야 하나 떨림이 학습률에 비례하기 때문입니다
# 얼마나 줄여야 하나 합은 발산하고 제곱합은 수렴해야 합니다
# 어느 감소식이 그런가 1 나누기 t 가 대표입니다
# 그런데 실무는 코사인이나 선형을 씁니다
# 왜 다른가 정해진 예산 안에서 최선을 노리기 때문입니다
# 준비 구간은 왜 시작점의 그래디언트가 가장 크기 때문입니다
# 판 수를 바꾸면 학습률도 다시 골라야 합니다
# 237강은 배치 크기와 학습률의 관계를 정면으로 다룹니다
#
# ==============================================================================
# 검산 끝
# ==============================================================================