자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 차분 간격은 짧을수록 정확하다고 봄 | 1, 2 | 자름 오차는 간격에 비례하고 반올림·측정 오차는 간격에 반비례한다. 두 항이 같아지는 가운데 간격이 가장 좋다 |
| 가운데 차분도 전진 차분과 같은 간격이 가장 좋다고 봄 | 2 | 자름 오차가 h² 에 비례하므로 가장 좋은 간격은 δ 의 세제곱근쯤으로 커진다(float64 에서 10⁻⁵ 쯤) |
| float32 그래디언트 검사가 실패하면 자동미분이 틀렸다고 봄 | 3 | 반올림 오차 δ/h 가 크다. float64 로 검사하거나 float32 에서는 간격을 10⁻² 쯤으로 키운다 |
| 차원이 늘면 무작위 방향이 낮아질 확률이 준다고 봄 | 5 | 확률은 늘 1/2 이다. 줄어드는 것은 낮아졌을 때 곧장 내려간 높이에 대한 비율(약 √(2/(πd)))이다 |
| 격자 탐색이 범위를 빈틈없이 덮으니 더 낫다고 봄 | 6 | 중요한 하이퍼파라미터가 몇 개뿐이면 격자는 중요한 하이퍼파라미터의 값을 몇 가지만 시험한다. 무작위는 시도마다 다른 값을 시험한다 |
| 동시 섭동 어림 하나가 각 변수의 효과를 알려 준다고 봄 | 7 | 한 번의 어림에는 다른 칸의 그래디언트가 섞인다. 평균해야 맞는다 |
| 평균이 흔들리면 샘플을 늘리면 된다고 봄 | 8 | 1/uᵢ 로 나누는 꼴에서 uᵢ 가 0 근처에 올 수 있으면 평균 자체가 없다. ±1 로 뽑거나 곱하는 꼴을 쓴다 |
| 어림의 평균이 맞으면 학습률도 경사하강과 같게 써도 된다고 봄 | 9 | 한 스텝의 길이 제곱이 d + 2 배라 터진다. 학습률을 d 쯤으로 나누고, 스텝 수가 d 배쯤 는다 |
| 계단 모양 목표는 그래디언트가 0이라 내려갈 수 없다고 봄 | 10, 12 | 노이즈로 흐리면 기댓값은 매끄럽다. 흐림 폭이 너무 좁거나 넓으면 그래디언트가 작다 |
| 흐리게 해도 바닥은 그대로라고 봄 | 11 | 대칭일 때만 그렇다. 한쪽이 가파르면 바닥이 완만한 쪽으로 약 0.674σ 옮겨 간다 |
요약
이 장에서는 값만 돌려주는 상자를 내려가는 방법 넷을 차례로 보았는데, 첫째인 유한 차분은 두 점의 함숫값 차이를 간격으로 나눠 미분을 어림한다. 간격이 크면 곡선이 휜 것이 섞이고(간격에 비례하는 자름 오차), 작으면 함숫값의 반올림 오차가 간격으로 나뉘어 커진다(간격에 반비례). 그래서 오차는 U 자를 그리고, float64 전진 차분에서 가장 좋은 간격은 10⁻⁸ 근처다. 1952년 키퍼와 울포위츠가 노이즈 섞인 실험에서 같은 고민을 했고, 오늘날 이 방법은 역전파 코드를 검사하는 데 쓰인다. 다만 변수가 d 개면 그래디언트 하나에 함숫값이 d + 1 번 든다.
무작위 탐색은 그래디언트를 어림하지 않고 아무 방향이나 시험해서 낮아지면 옮긴다. 넬더와 미드의 단체법처럼 비교만 하는 방법은 단순하고 노이즈와 계단에 강하다. 변수가 둘이면 그래디언트 방법에 크게 뒤지지 않지만, 차원이 커지면 낮아진 스텝도 대부분 옆으로 걸은 것이 되어 함숫값 계산 횟수가 차원에 비례해 는다. 하이퍼파라미터처럼 몇 개만 중요한 문제에서는 격자보다 무작위로 뽑는 편이 같은 횟수로 더 많은 값을 시험한다.
동시 섭동은 모든 변수를 무작위 부호로 한꺼번에 흔들어 앞뒤 함숫값 두 번으로 그래디언트를 어림한다. 어림 하나에는 다른 칸의 그래디언트가 섞여 노이즈의 제곱이 참 그래디언트 제곱의 d − 1 배쯤이지만, 평균은 참 그래디언트다. 스텝이 쌓이며 노이즈가 지워지므로 거친 어림으로 작은 스텝을 많이 걷되, 학습률은 d 쯤으로 나눠야 하고 스텝 수는 d 배쯤 는다. MeZO 는 이 방법으로 역전파 없이 큰 언어 모델을 파인튜닝한다.
가우시안 스무딩은 함수를 가우스 노이즈로 흐린 fσ 를 다룬다. fσ 의 그래디언트는 f 의 미분 없이 함숫값에 무게 u/σ 를 매긴 평균으로 적히고, 흔드는 크기를 크게 둔 동시 섭동의 어림은 fσ 의 그래디언트를 어림한다. 흐리면 작은 골짜기가 지워지고 계단 모양 목표에도 그래디언트가 생긴다. 그 무게는 정규분포의 점수 함수이고, 같은 식이 강화학습의 REINFORCE 다.
막힌 곳
이 장의 방법들은 모두 한 점 x 둘레를 흔들어 보는 데서 출발했고, 흐림 폭 σ 는 우리가 정해 주었으며 흔드는 방향은 어느 쪽이든 똑같이 뽑았다. 그런데 울퉁불퉁한 그릇에서 보았듯 σ 는 처음에는 크고 바닥 근처에서는 작아야 할 것 같고, 한쪽이 가파른 V 처럼 방향마다 알맞은 흐림 폭이 다를 수도 있다. 시험해 본 점들의 결과를 보고 흔드는 폭과 방향, 더 나아가 점을 뽑는 분포 자체를 고쳐 갈 수는 없을까? 점 하나를 옮기는 대신 점 여러 개를 한꺼번에 뽑아 좋은 것을 남기는 생물의 진화 같은 방법은 어떨까?
그리고 차원 수만큼 느려진다는 결론도 마음에 걸린다. 신경망처럼 식을 아는 함수라면 함숫값 몇 번 계산할 값으로 그래디언트를 정확히 얻을 길이 있지 않을까?