Gradient descent
신경망은 가중치를 업데이트하면서 주어진 문제를 최적화한다. 이때, 가중치를 업데이트하는 방법에는 대표적으로 경사하강법을 사용한다. 경사하강법은 특정 함수에서의 미분을 통해 얻은 기울기를 이용하여 최적의 값을 찾아가는(손실을 줄이는) 방법이다. 즉, 기울기가 0인 부분을 찾아 가는 것이다.
위의 그래프는 y=x^2 함수이기 때문에, 어느 지점에서 출발해도 경사를 따라 내려가다 보면 최적값을 만날 수 있다. 하지만 보통의 문제는 다음과 같은 경우가 많다.
우리가 원하는 모델의 성능은 전역 최솟값(global minimum)에 도달하는 것이다. 하지만 왼쪽 점에서 시작하면 지역 최솟값(local minima)에 빠질 위험이 높다. 이러한 이유로 경사하강법은 항상 최적값을 반환한다는 보장을 할 수 없다.
따라서 실제로 모델을 학습할 때, 여러 가지 학습률(하이퍼 파라미터)을 사용해볼 필요가 있다. 학습률이 너무 높으면 학습이 되지 않을 수 있고, 학습률이 너무 낮으면 핛습 속도가 아주 느려서 전역 최솟값에 도달하기 전에 학습이 종료될 수 있기 때문이다.
모델이 학습되지 않은 상태라면 큰 학습률(학습률의 초기 설정으로는 주로 0.001(le-3)을 사용한다) 에서부터 시작하고, 어느 정도 학습이 된 경우엔 서서히 학습률을 줄여나가는 방법을 사용해보자. 또는, 학습률을 줄여보다가 급격히 키우고 다시 줄이는 것도 좋은 방법이 될 수 있다.
가중치 초기화
신경망의 올바른 학습을 위해서는 가중치 초기화 문제도 생각해봐야 한다. 위의 전역 최솟값 그래프를 다시 보면, 당연히 최고의 성능을 위해 왼쪽 점이 아닌 오른쪽 점을 선택하여 시작할 것이다. 이를 '초기화한다'라고 표현할 수 있다. 물론, 왼쪽 점을 선택했을 경우엔 지역 최솟값에 도달한 이후에 학습률을 증가시켜서 탈출하는 방법이 존재한다. 하지만 처음부터 오른쪽 점을 선택하는게 나을 것이다. 이처럼 좋은 성능을 얻기 위해서는 올바른 가중치 초기화를 진행해야 한다.
확률적 경사하강법(SGD)
경사 하강법은 불필요하게 많은 계산량은 속도를 느리게 할 뿐 아니라, 최적 해를 찾기 전에 최적화 과정이 멈출 수도 있다. 확률적 경사하강법(stochastic gradient descent)은 경사 하강법의 이러한 단점을 보완한 방법이다.
전체 데이터를 사용하는 것이 아니라, 랜덤하게 추출한 일부 데이터를 사용한다. 일부 데이터를 사용하므로 더 빨리 그리고 자주 업데이트를 하는 것이 가능해졌다.
랜덤한 일부 데이터를 사용하는 만큼 SGD는 중간 결과의 진폭이 크고 불안정해 보일 수 있다. 하지만 속도가 확연히 빠르면서도 최적 해에 근사한 값을 찾아낸다는 장점 덕분에 경사 하강법의 대안으로 사용되고 있다.
케라스 최적화 함수를 이용
keras.optimizers.SGD(lr=0.1)
모멘텀(sgd momentum)
'관성,탄력,가속도'를 뜻한다. 모멘텀 SGD란 말 그대로 경사 하강법에 탄력을 더해 주는 것이다. 경사 하강법과 마찬가지로 매번 기울기를 구하지만, 이를 통해 오차를 수정하기 전 바로 앞 수정 값과 방향(+,-)을 참고하여 같은 방향으로 일정한 비율만 수정되게 하는 방법이다. 따라서 수정 방향이 + 방향으로 한번, - 방향으로 한번 지그재그로 일어나는 현상이 줄어들고, 이전 이동 값을 고려하여 일정 비율만큼만 다음 값을 결정하므로 관성의 효과를 낼 수 있다.
모멘텀 계수를 추가한다
keras.optimizers.SGD(lr=0.1, momentum = 0.9)
이 외의 고급 경사 하강법에는 다음과 같은 방법이 있다.
네스테로프 모멘텀(NAG) | 모멘텀이 이동시킬 방향으로 미리 이동해서 그라디언트를 계산, 불필요한 이동을 줄이는 효과 | 정확도 개선 | [네스테로프 옵션을 추가] keras.optimizers.SGD(lr=0.1, momentum=0.9, nesterov=True) |
아다그라드(Adagrad) | 변수의 업데이트가 짖으면 학습률을 적게하여 이동 보폭을 조절하는 방법 | 보폭 크기 개선 | [아다그라드 함수 사용] keras.optimizers.Adagrad(lr=0.01,epsilon=1e-6) |
알엠에스프롭(RMSProp) | 아다그라드의 보폭 민갑도를 보완한 방법 | 보폭 크기 개선 | [RMSProp 함수 사용] keras.optimizers.RMSProp(lr=0.001, rho=0.9, epsilon=1e-08, decay = 0.0) |
아담(Adam) | 모멘텀과 RMSProp 방법을 합친 방법 | 정확도와 보폭 크기 개선 | [아담 함수를 사용] keras.optimizers.Adam(lr=0.001, beta_2 = 0.999, epsilon=1e-08, decay = 0.0) |
아담(Adam)은 현재 가장 많이 사용되는 고급 경사 하강법이다.
'데이터 분석 > 딥러닝' 카테고리의 다른 글
딥러닝 활용_NLP (0) | 2022.03.11 |
---|---|
역전파 (0) | 2022.03.11 |
신경망 (0) | 2022.03.08 |
머신러닝-딥러닝 용어 (0) | 2022.03.08 |
딥러닝 개요 (0) | 2022.03.07 |