공부 벌레🐛가 되자!
계속 볼수록 익숙해져야 하는 개념이 계속 볼수록 잘 모르겠는 경우가 생긴다.🤔 저번주 최적화 알고리즘까지 공부를 마치고 다시 처음부터 되돌아 가서 공부했다. 오늘 다시 공부하고 정리하게 될 최적화 알고리즘이 제발 내 뇌(🧠)에 들어오길 🤦♀️
📕 딥러닝 교과서, 출판사: 이지스 퍼블리싱
📙 밑바닥부터 시작하는 딥러닝, 출판사: 한빛미디어
📒 더북 - 딥러닝 텐서플로 교과서
3장에서는 신경망 학습의 기본 최적화 알고리즘인 경사하강법과 미니배치 훈련 방식으로 변환된 경사하강법을 살펴보았습니다.
신경망의 손실 함수는 복잡해서 가장 가파른 곳을 찾아 내려가는 바잇ㄱ만으로 최적해를 찾지 못하고 느립니다.
이런 한계를 극복하기 위해 확률적 경사 하강법을 변형한 많은 알고리즘이 제안되었습니다.
책에서는 SGD Momentum, Nesterov momentum, Adagrad, RMSProp, Adam을 살펴볼 예정입니다.
딥러닝 교과서에선 6장, 밑시딥은 6-1에 해당되는 내용입니다.
배치 경사 하강법(Batch Gradient Descent, BGD)은 전체 데이터셋(=배치)에 대한 오류를 구한 다음 기울기를 한 번만 계산하여 모델의 parameter를 업데이트하는 방식입니다.
즉, 전체 훈련 데이터셋(total training dataset)에 대해 가중치를 편미분하는 방식입니다.
배치 경사 하강법은 한 스텝에 모든 훈련 데이터셋을 사용해서 학습 시간이 오래 걸립니다.
이 단점을 개선한 방법이 SGD였죠.
확률적 경사 하강법(Stochastic Gradient Descent, SGD)은 임의로 선택한 데이터에 대해 기울기를 계산하는 방법입니다.
적은 데이터를 사용하므로 BGD보다 계산이 빠릅니다.
아래 그림을 보면 비교가 가능합니다.
parameter의 변경 폭이 불안정하고, 정확도가 낮을 수 있지만 속도가 빠르다는 장점이 있습니다.
미니 배치 경사 하강법(mini-batch gradient descent)은 전체 데이터셋을 미니 배치(mini-batch) 여러 개로 나눈 뒤,
미니 배치 한 개마다 기울기를 구합니다. 그 평균 기울기를 이용하여 모델을 업데이트해서 학습하는 방법입니다.
미니 배치 경사 하강법은 전체 데이터를 계산하는 것보다 빠릅니다.
확률적 경사 하강법보다 안정적이어서 가장 많이 사용됩니다.
변경 폭이 확률적 경사 하강법에 비해 안정적이면서 속도도 빠릅니다.
SGD의 parameter 변경 폭은 불안정합니다. 이 문제를 해결하기 위해 학습 속도와 운동량을 조절하는 optimizer를 적용할 수 있습니다.
SGD의 단점을 개선해주는 Momentum, Adagrad, Adam의 세 가지 방법이 있습니다.
학습률이란 최적화 할 때의 속도를 조절하는 parameter이며, step size
라고도 합니다.
신경망 학습에서 학습률이 너무 작으면 시간이 너무 오래 걸리고, 반대로 너무 크면 발산하여 학습이 제대로 이루어지지 않습니다.
이 학습률을 정하는 효과적 기술이 학습률 감소(leraning rate decay)입니다.
초반에는 큰 폭으로 이동하여 최대한 빠르게 내려가고, 점차 학습률을 줄여 조심스럽게 내려가는 방법입니다.
초반엔 높은 학습률로 시작해 학습률을 조금씩 낮춰 작게 학습하는 방법
내리막길을 내려가는 것을 다시 상상해 보자...🙈
경사가 가파를 때는 조심스럽게 내려가야하고, 완만할 때는 아까보다 더 성큼성큼 이동할 것이다. 이게 적응적 학습률이다.
경사가 가파를 때 보폭을 크게 이동하면 최적화 경로를 벗어나거나 최소 지점을 지나친다.
그래서 경사가 완만할 때 더 큰 보폭으로 이동하는 것이 훨씬 유리하다.
이렇게 곡면의 변화에 따라 학습률이 적응적으로 조절된다면 안정적으로 학습할 수 있다.
위처럼 가로가 길고 세로는 짧은 타원형 모양이 있다면,
단계마다 등고선의 직각 방향으로 이동하여 이동 궤적이 진동하는 모습이 됩니다.
이런 성질을 비등방성(anisotropy) 함수라고 합니다. 방향에 따라 기울기가 달라지는 함수입니다.)
이 경우엔 1차 미분인 기울기만 사용하면 매끄럽게 진행될 수 없습니다.
2차 미분인 곡률을 사용해야 차원별로 지형의 형태를 정확히 파악해야 최적의 경로로 수렴할 수 있습니다.
즉, 하고 싶은 말은 탐색하는 경로가 영 별로라는 점인데요.
만약 기울기만 사용한다면 관성을 추가해 이동 경로가 덜 진동하도록 만들어야 합니다. 이 관성에 대한 내용은 뒤에 다뤄집니다.
학습시 수많은 임계점을 만나게 됩니다.
임계점: 미분값이 0인 지점으로 maximun point, minimum point, saddle point가 있습니다.
saddle point의 경우, 최댓값인지 최솟값인지 구분하지 못하고 학습을 종료 시키는 경우가 발생합니다.
곡면에는 무수히 많은 saddle point가 있기 때문에 유의해야 합니다.
이때 구분하는 방법은 loss를 확인하는 방법이 있습니다.
여기까지 SGD의 단점을 살펴보았습니다. 자연스럽게 이 단점이 보완된 알고리즘이 나오겠죠?😊
책에는 SGD Momentum이라 표기하고 있습니다. 같은 말입니다.
모멘텀은 최적해를 향해 진행하던 속도에 관성을 주어 SGD가 갖고 있던 문제
등을 해결한 알고리즘입니다.
은 '운동량'을 뜻하는 단어입니다.
물리적 법칙을 이용해서 이렇게 설명할 수 있습니다.
위 식에서 나온 는 실제로 공기 저항이나 마찰 등에 해당하는 역할이며, 마찰 계수라 불립니다.
*보통 0.9나 0.99로 설정
모멘텀의 이동은 이렇습니다.
진행하던 속도에 관성이 적용되니까 saddle point를 만나거나 local minima에 빠지더라도 그 지점을 벗어날 수 있습니다.
SGD는 기울기가 계속해서 바뀔 때, 다른쪽으로 튕겨나갈 수 있는데 관성이 작용하면 진행하던 속도를 유지하며 부드럽게 이동하게 됩니다.
위 그림에서도 실제로 곡선의 형태로 부드럽게 이동하는 것을 볼 수 있습니다.
△ 부드럽게 이동, SGD, Momentum 속도 차이
Momentum의 단점으로 문제가 있습니다.
경사가 가파른 곳을 빠른 속도로 내려오다 관성을 이기지 못하고 최소 지점을 지나쳐 버리는 현상입니다.
그레디언트가 완만하다면 최적해를 잘 찾겠지만, 가파를수록 overshooting될 가능성이 큽니다.
위의 오른쪽 그림을 보면, gradient보다 속도가 더 크기 때문에 실제 step이 커지고 지나치게 됩니다.
이때 최적해 주변을 평평하게 만들어주는 regularization 기법이 있는데 5장에서 다룬다고 합니다.
Momentum은 두 종류의 식으로 표현이 됩니다.
두 식의 차이가 보이시나요?
속도를 계산할 때, gradient 누적 방향이 반대입니다.
다음에 소개되는 Nesterov momentum은 overshooting 문제를 개선한 알고리즘이라고 합니다.
그리고 위에서 두 번째 식을 사용한 알고리즘이라고 합니다!
네스테로프 모멘텀은 현재의 속도 벡터와 현재 속도로 한 걸음 미리 가 본 위치의 그레디언트 벡터를 더해 다음 위치를 정합니다.
다음 속도 는 현재 속도에 마찰 계수()를 곱한 뒤 한 걸음 미리 가 본 위치의 그레디언트를 빼서 계산합니다.
△ SGD 모멘텀과 네스테로프 모멘텀 비교
△ 새로운 변수로 치환하여 계산 방법
네스테로프 모멘텀은 진행하던 속도에 관성을 주는 점은 SGD 모멘텀과 같습니다.
하지만 오버슈팅을 막기 위해 현재 속도로 한 걸음 미리 가 보고 오버 슈팅이 된 만큼 다시 내리막길로 내려가는 방식입니다.
네스테로프 모멘텀은 관성이 커지더라도 오버슈팅이 될지 살펴본 다음에 교정하기 때문에 오버슈팅이 억제됩니다.
모멘텀은 모멘텀 값과 기울기 값이 더해져서 실제 스텝을 결정하는데 반면,
네스테로프 모멘텀은 모멘텀 값이 적용된 지점에서 기울기 값을 계산합니다.
모멘텀은 속도는 빠르지만 멈추어야 할 시점에서도 관성에 의해 훨씬 멀리 간다는 단점이 있지만,
네스테로프 방법은 모멘텀으로 절반 정도 이동한 후 어떤 방식으로 이동할지 다시 계산해서 스텝을 결정하기 때문에 단점을 극복합니다.
아다그라드(Adagrad)라고 읽으며, Adaptive gradient의 줄임말입니다.
Adagrad는 이름에서도 살짝 알 수 있듯이, 손실 함수 곡면의 변화에 따라 적응적으로 학습률을 정하는 알고리즘입니다.
손실 함수 경사가 가파를 때 큰 폭으로 이동하면 최적화 경로를 벗어나서 최소 지점을 지나칠 수 있습니다.
반대로 경사가 완만할 때는 최적해 경로가 아닐 수 있기 때문에 큰 폭으로 이동하는 것이 좋습니다.
즉, 많이 변화한 변수는 최적해에 근접했을 거란 가정하에 작은 크기로 이동하면서 세밀하게 값을 조정하고 반대로 적게 변화한 변수들은 학습률을 크게 하여 빠르게 오차 값을 줄이고자 하는 방법입니다.
여기서 보폭(step size
)를 조절해주는 것이 '학습률'이었습니다.
학습률의 크기에 따라 학습 속도가 달라졌습니다.
그렇다면 Adagrad는 학습률을 서서히 낮추는 방법이었는데, 어떻게 해야 점차적으로 낮출 수 있을까요?
가장 간단한 방법은 매개변수 '전체'의 학습률 값을 일괄적으로 낮추는 것입니다.
하지만 Adagrad는 그 아이디어에서 한 번 더 발전해 '각각의' 매개변수에 맞춤형 값을 만들어줍니다.
개별 매개변수에 적응적으로(Adaptive) 학습률을 조정하면서 학습을 진행합니다.
그림을 보면 최솟값을 향해 효율적으로 움직이고 있습니다.
y축 방향은 기울기가 커서 처음에는 크게 이동하지만, 보폭이 작아지도록 업데이트 됩니다.
y축 방향으로 업데이트 강도가 빠르게 약해지면서 지그재그로의 움직임이 줄어듭니다.
위 그림을 통해 마지막 정리!
경사에 따른 보폭을 비교해서 봐주세요.
그리고 곡면의 변화량을 계산하기 위해 모든 단계에서 계산했던 기울기를 모아 크기를 측정합니다.
여기서 모든 단계의 기울기를 하나의 벡터로 표현합니다.
기울기의 제곱함을 계산해서 곡면의 변화량으로 사용된다고 합니다.
(아 식 안 정리하고 그냥 넘어가고 싶었는데...)
식은 이렇습니다. 그냥 '학습률'과 '기울기'가 반비례한다는 점을 이용한 알고리즘이다. 이해하면 되지 않을까 싶습니다.😎
AdaGrad의 치명적 단점을 꼬집어야 또 다음 알고리즘을 배울 수 있겠죠...
이 친구의 단점은 무엇일까요?
아까 곡면의 변화량을 전체 경로의 기울기 벡터의 크기로 계산을 했습니다.
그래서 학습이 진행될수록 변화량은 커지는데, 적응적 학습률은 점점 낮아집니다.
만약 경사가 매우 가파른 곳에서 학습을 시작한다면, 초반부터 적응적 학습률이 급격히 감소하다가 최적해에 도착하기 전 조기 종료될 가능성이 있습니다.
이처럼 조기 학습 중단되는 문제를 해결하기 위해 고안된 것이 RMSProp입니다!
RMSProp와 Adam은 다음 포스팅에서 이어 정리하겠습니다.
제가 개념 정리와 이미지 등 참고한 교재, 링크는 위의 참고 자료에 남겨놓았습니다.
안녕하세요! 정리를 깔끔하게 잘해주셔서 공부하는데에 많은 도움이 됩니다!
한가지 궁금한 점이 있는데요. overshooting 문제 부분에서 momentum에 대한 두개의 식이 어떤게 다른지 모르겠습니다! 다른 점이 안보여서요..