본문 바로가기

오성연/Deep Learning

[DL 기초 #3] Single Perceptron - Artificial Neuron (3. Optimization - Gradient Descent)

이전 두 글에서 다룬 Foward propagation과 Back-propagation의 한 사이클을 '1 Epoch' 라고 부르며 이 과정을 반복하여 (Loss를 최소화 하는 방향으로) W를 최적화 합니다. 이때 사용하는 최적화 알고리즘을 Gradient Descent라고 합니다.


III. Optimization

Gradient Descent의 조건 : Convex

Loss의 최솟값을 구하기 위해서는 Loss 함수의 그래프가 아래와 같이 convex한 형태여야 합니다. 즉, w값이 증가함에 따라 기울기(slope)가 꾸준하게 증가하는 형태를 뜻합니다. 더 정확히 말하자면 convex란 아래의 그림처럼 곡선의 두 지점을 직선으로 이었을때, 이 직선이 곡선보다 위쪽에 위치하는 것을 뜻합니다.

두 점을 이은 직선이 곡선보다 위를 지나면 Convex

이러한 convex한 형태의 곡선의 한 지점에서 시작하여 Gradient가 감소하는 방향으로 weight를 업데이트 하여 최소의 Loss값을 찾는 것을 'Gradient Descent' 알고리즘 이라고 합니다.

Gradient Descent

위와 같이 곡선 위의 한 점에서 공이 비탈면을 따라 굴러내려가듯 Loss의 최저점(L_min)을 향해 하강하며 한 화살표는 1 epoch를 뜻합니다. 위의 그림에서는 6번째 epoch를 거쳐 Loss의 최저점에 도달하였고 이때의 최적 weight 값(w_optim)을 찾을 수 있습니다.

 

Gradient Descent의 한계 : Local Minima Problem

하지만 이러한 Gradient Descent(GD) 알고리즘은 한계가 존재합니다. 아래 그림을 보면 A지점에서 출발하는 경우 Gradient가 감소하는 방향으로 내려가면 Loss의 global min이 아닌 local min에 해당하는 지점에 멈추게 되어 제대로 weight를 최적화 하지 못합니다. 이를 local minima problem이라고 합니다.

local minima problem in A

 

Gradient Descent의 한계 극복 : 다양한 방법(SGD, Adam 등)

이 문제를 해결하기 위한 방법에는 여러가지가 존재하지만 대표적이고 많이 사용되는 방법으로 Stochastic Gradient Descent(SGD)가 있습니다.

 

SGD란 모든 데이터에 대해서 GD를 하는 것이 아니라 확률적으로(Stochastically) 랜덤하게 뽑아낸 일부 데이터에 대해서 GD를 진행하는 방법입니다. 

출처: https://aoc55.tistory.com/48

확률적으로 랜덤하게 뽑아낸 데이터를 이용해서 GD를 진행하기 때문에 위의 왼쪽 그림처럼 최저점을 향해 꾸준하게 하강하는 것이 아니라 불필요한 방향으로 튀어나가는 현상이 발생할 수 있습니다. 하지만 아주 조금씩이라도 내려가는 방향을 유지하기 때문에 결국 최저점에 도달할 수 있으며, 이리저리 튀는 덕분에 local minima에 갇힐 확률이 적어집니다. 게다가 전체 데이터를 이용하는 것보다 일부 데이터를 이용해 GD를 진행하기 때문에 연산량이 줄어들어 속도가 빠르다는 장점이 있습니다.

출처: https://aoc55.tistory.com/48

그리고 일반적으로 쓰이는 SGD는 Stochastic하게 Mini-Batch(나중에 다룰 내용이지만 일단 간단하게 일정한 N개의 데이터를 랜덤하게 뽑는 방식이라고 이해하면 될 것)를 뽑아서 각 Batch의 평균 Gradient를 이용해 GD를 진행하는 방식으로 조금 더 안정적이고 빠른 학습이 가능하도록 발전되었습니다.

 

출처: https://onevision.tistory.com/entry/Optimizer-%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%84%B1-Momentum-RMSProp-Adam

이런 방식 외에도 경사 하강에 방향성을 지닌 Momentum(관성)항을 추가하여 하강하던 방향으로 계속 하강하는 힘을 유지하여 local minima를 탈출하고자 하는 방식도 존재하며, step size를 도입하여 처음 보는 Loss 구간은 빠르게 훑어보고 훑어본 지점은 step size를 줄여서 세밀하게 탐색하는 Adagrad라는 방식도 존재합니다.

 

그리고 위에서 설명했던 방법들의 장점을 모아서 고안된 Adam 이라는 optimizer도 존재하며 가장 많이 쓰입니다. 아래는 각 optimizer의 작동 방식과 그 속도를 비교해 볼 수 있는 짤로 참고용으로 보시면 될 것 같습니다.

출처: https://onevision.tistory.com/entry/Optimizer-%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%84%B1-Momentum-RMSProp-Adam
출처: https://onevision.tistory.com/entry/Optimizer-%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%84%B1-Momentum-RMSProp-Adam
출처: https://onevision.tistory.com/entry/Optimizer-%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%ED%8A%B9%EC%84%B1-Momentum-RMSProp-Adam

 

이처럼 Loss의 최솟값을 찾기 위한 Optimizer를 설정해주는 것으로 1 epoch가 끝이 납니다. 


다시 정리하면, Machine Learning에서 1 epoch는  Forward Propagation - Backward Propagation - Optimization 순서로 진행됩니다. 그리고 이 epoch를 수차례 반복하여 모델의 weight를 update하는 과정을 '학습(Training)'이라고 부릅니다.