다시 이음

딥러닝(2) - 경사하강법(Gradient Descent)과 역전파(Backpropagation) 본문

AI 일별 공부 정리

딥러닝(2) - 경사하강법(Gradient Descent)과 역전파(Backpropagation)

Taeho(Damon) 2021. 10. 20. 01:04

안녕하세요.

 

어제 우리는 신경망의 진행 방향에 따라 순전파와 역전파로 나뉜다고 알아보았습니다.

 

어제는 순전파에 대해서 알아보았고 오늘은 그 역전파에 대해서 알아보도록 하겠습니다.

 

 

🍀 들어가기 전에 꼭 알아둬야 할 게 있습니다.

- 편미분 이해하기

- 이해를 못하겠더라도 계속해서 보고 손으로 써보고 해보기

 

 

역전파(Backpropagation)

 

1. 역전파 란?

 

역전파(Backpropagation)는 먼저 계산 결과와 정답의 오차를 구해 이 오차에 관여하는 값들의 가중치를 수정하여 오차가 작아지는 방향으로 일정 횟수를 반복해 수정하는 방법입니다. 오차역전파 또는 오류역전파라고도 불립니다.

 

역전파가 가능하려면 먼저 순전파가 선행되어야 합니다.

 

위에 설명에서 계산 결과와 정답의 오차를 우리는 손실(Loss or Error) 정보를 전달한다고 하겠습니다.

 

그러면 손실(Loss or Error)정보는 어디서 알 수 있을까요?

 

 

2.손실함수(Loss Function) = 비용함수 (Cost Function)

 

손실 함수는 신경망이 학습 시 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 하는지를 알 수 있는 지표(정보)입니다.

 

일반적으로 평균 제곱 오차(Mean Squared Error, MSE)와 교차 엔트로피 오차(Cross Entropy Error, CEE)를 사용합니다.

 

당연하게도 수치가 높을 수록 안좋다는 뜻이겠죠?

 

❄️ 손실함수 종류

-MSE : 연속형 변수를 예측

-banary_crossentropy : 이진분류

-categorical_crossentropy : 다중 분류 손실함수(one-hot encoding 필요)

-sparse_categorical_crossentropy : 다중 분류 손실함수(one-hot encoding 필요없음)

 

❄️ 손실함수를 쓰는 이유

손실함수는 매개변수의 변화에 연속적으로 변화하지만, 정확도는 매개변수의 변화에 둔감하고, 변화가 있더라도 불연속적으로 변화하기 때문에 미분이 불가능하다. 미분이 안되면 최적화를 할 수 없어서 정확도가 아닌 손실 함수를 지표를 삼아 학습을 하는 것입니다.

 

 

 

손실함수는 model.compile(optimizer=.., loss='sparse_categorical_entropy') 와 같이 compile 해주면서 지정합니다.

 

 

 

우리는 이제 역전파를 통해서 전달해야할 정보를 구할 수 있습니다.

그렇다면 실행하기 위해서 어떻게 하면 손실을 줄일 수 있는지 알아야 합니다.

그 방향을 알려주는 것이 바로 경사하강법(Gradient Descent, GD) 입니다.

 

 

3. 경사하강법(Gradient Descent, GD)

 

경사하강법

  • 해당 가중치에서의 비용 함수(J)의 도함수(=비용 함수를 미분한 함수)를 계산해서 경사를 따라 내려가면서 가중치(w) 업데이트 시킵니다. 
  • 즉, 손실함수를 최소화하기 위하여 반복적으로 파라미터를 조정해나가는 방법입니다.
  • 방향 : 기울기가 양수 일 때 -> 음의 방향으로 나아가야 최소값 , 기울기가 음수일 때-> 양의 방향으로 나아가야 최소값입니다.
  • 크기 : 학습률(learning rate)이 너무 크면 학습시간이 짧아지나 전역 최솟값에서 멀어질 수 있습니다.
  • 크기 : 학습률(learning rate)이 너무 작으면 학습시간이 오래걸리고 지역 최솟값에 수렴할 수 있습니다.

❄️ 왜 가중치를 변경하나요?

- 순전파를 진행하며 생성된 신경망 알고리즘에서 실제 입력값은 변하지 않기 때문에 변수라고 볼 수 있는 것은 가중치입니다.

- 가중치 매개변수의 손실함수의 미분이란, 가중치 매개변수의 값을 아주 조금 변화 시켰을 때 손실 함수가 어떻게 변하냐의 의미입니다.

 

❄️ 왜 경사(기울기)에요?

- 우리는 손실을 최소한으로 만들어야 합니다. 그러기 위해선 변수인 가중치에서의 비용함수의 도함수(미분)를 최소한으로 만들 수 있는 값을 찾아야 하고 그것은 기울기를 작아지는 방향으로 나아가는 것입니다.  좀더 궁금하시면 미분에 대해서 알아보시면 좋을 것 같아요.

 

 

1) 경사하강법 업데이트 수식

위의 수식을 설명하면

w는 가중치, 에타(η)는 학습률, J(total)은 해당 노드가 영향을 미치는 오차의 총합입니다.

dJ(total)/dwj로 표현된 것은 가중치의 기울기 입니다.

 

위의 식에서 -(마이너스)로 표현된 이유는 위에서 말했듯 방향이 반대이어야 최소값을 찾기 때문입니다.

 

우리는 여기에서 가중치의 기울기를 구하기 위해서 체인룰을 알아야합니다.

 

쉽게 말하면 dJ(total)의 값과 dwj의 값을 바로 대입할 수 없기때문에 미분의 연쇄법칙을 사용하여 풀어내야 합니다.

 

신경망 알고리즘의 구조

 

우리는 위의 구조를 참고해서 업데이트 식을 풀어보도록 하겠습니다.

 

 

 

2) 경사하강법 역전파 알고리즘 원리

 

 

 

 

위의 정리를 통해서 출력층에서 은닉층, 은닉층에서 입력층으로의 역전파 알고리즘의 원리를 한번에 정리해봤습니다.

 

 

 

4.  옵티마이저(Optimizer)

경사하강법을 실행하다 보면 위의 그림처럼 경사가 하나가 아닌 다중 구조이기때문에 오목한 부분인 최소점을 찾을 때 전체에서 가장 작은 전역최적점에 가지 못하고 지역최적점으로 가는 경우가 생깁니다.

 

이럴 때 우리는 최적화의 목적으로 옵티마이저를 설정합니다.

 

경사를 어떻게 내려갈 것인가에 대한 방법이라고 생각하시면 편할 것 같습니다.

 

옵티마이저의 발전 과정

 

위의 그림을 통해 옵티마이저가 어떻게 발전을 했는지를 대략적으로 파악할 수 있습니다.

 

위에서 보이듯이 스텝방향은 우리가 위에서 공부한 가중치 업데이트식에서 '가중치의 기울기' 부분을 조정한다고 보면되고,

스텝사이즈는 가중치 업데이트식에서 에타(η)값을 조정하는 것이라고 생각하시면 됩니다.

 

 

옵티마이저의 종류

 

1) 경사하강법(Gradient Descent, GD) 

 

- 위에서 저희가 자세하게 분석한 방법입니다. 가장 기본적인 방법입니다.

2) 확률적 경사 하강법(Stochastic Gradient Descent, SGD)

 

- 전체 데이터에서 무작위로 하나의 데이터를 뽑아서 신경망에 입력한 후 손실을 계산합니다.

- batch_size = 1

- 가중치의 업데이트를 epoch당 전체 데이터 개수만큼 진행합니다.

- 장점 : 지역최적점에서 빠져나오기 용이합니다.

이유는? 전체 데이터를 하나씩 랜덤하게 분석하기 때문에 지역최적점에 빠지더라도 다른 데이터에서 최적점이 발견되면 그쪽으로 이동하게 됩니다.

 

- 단점 : 전역최적점을 찾지 못할 수 있습니다. 비정상적으로 떨어진 특이값에 따라 가중치 업데이트에 큰 편차가 발생합니다.

즉, 특이값이 나오면 그 방향으로 선회하여 업데이트가 이루어지기 때문에 최적점에서 멀어지는 결과를 가져올 수 있습니다.

- 단점을 극복하기 위해 mini-batch 가 생겨났습니다.

 

3) Batch gradient descent(BGD)

 

- 전체 데이터에 대한 손실을 계산하고 기울기를 업데이트 합니다.

- 가중치의 업데이트를 epoch당 1번 진행합니다.

- 장점 : 전체 데이터에 대해 업데이트가 한번에 이루어지기 때문에 SGD 보다 업데이트 횟수가 적고, 전체적인 계산 횟수도 적습니다.

- 단점 : 지역최적점에서 빠져나오기 어렵습니다. 일반화가 어렵습니다.

 

3) mini-batch(MSGD)

 

-batch_size를 임의로 정하여 batch_size수 만큼 데이터를 뽑아서 손실을 계산하되 전체 데이터를 모두 소진할 때 까지 반복한다.

-가중치의 업데이트를 epoch당 전체 데이터 개수 / batch_size 의 값만큼 진행합니다.

ex) 200개의 데이터에서 batch_size=10이면 10개씩 데이터를 뽑아서 20번 실행

- 장점 : BGD보다 local optimal 에 빠질 리스크가 적습니다.
- 단점 : 사용자가 batch_size 하이퍼파라미터를 지정해주어야 한다.

 

 

스텝 방향(가중치의 기울기 조정)

 

4)  Momentum

- 운동량이 없다면 공이 굴러가면서 첫번째로 만나는 최적점에 머무르게 될 것입니다.(모멘텀(운동량)을 고려하지 않음)

- 위의 알고리즘에서 운동량(가속도)을 추가해준다면 가속도가 붙어 작은 언덕을 넘어갈 수도 있게 됩니다.

- 위의 원리를 사용한 것이 모멘텀이며 모멘텀은 기존의 가중치의 업데이트 양보다 추가적으로 더 크게 업데이트가 되는 결과를 가져오고 이것을 물리학적으로 관성과 비슷하다고 볼 수 있습니다.

 

- 훈련 종료 시점은 미리 정해둔 학습 반복 수 또는 MSE의 수치가 주어진 기준보다 낮을 때 훈련을 종료합니다.

 

5) Nesterov Accelerated Gradient (NAG)

 

-기본적인 momentum 방식은 이동을 중지해야 하는 지점에 도달해도 momentum에 의해 해당 지점을 지나칠 수 있다는 문제가 있습니다. Nesterov accelerated gradient (NAG)는 이러한 문제점을 해결하기 위해 제안되었습니다.

-기본적인 momentum 방식은 현재의 가속도를 고려하지 않고 속도를 설정한다면, NAG는 현재의 가속도를 어느정도 고려하여 속도를 설정한다고 생각할 수 있습니다.

 

 

스텝 사이즈(학습량)

 

6) AdaGrad(Adaptive Gradient)

 

- 최적화 과정을 효율적으로 만들기 위해 고정된 learning rate가 아니라 각각의 변수마다 적합한 learning rate를 자동으로 설정한다.

- 업데이트가 많이된 변수의 경우엔 학습량을 작게 설정하여 세밀하게 업데이트하고, 업데이트가 적게된 변수의 경우엔 학습량을 크게 설정하여 더욱 빠르게 최적점을 찾을 수 있도록 합니다.

- 단점 : 학습량을 조절해주는 변수가 학습이 오래될 경우, 점점 커지게 되고 학습량이 점차 줄어들다 더이상 업데이트가 이루어지지 않게 됩니다. 이러한 문제점을 해결하기 위해 제안된 알고리즘이 AdaDelta와 RMSProp입니다.

 

7) Root Mean Square Propagation(RMSProp)

 

- AdaGrad에서의 학습량을 조절하는 변수는 현재 시간까지의 변화량의 합으로 정의되기 때문에 시간이 지날수록 증가하고, 이에 따라 learning rate는 감소합니다.

- RMSProp에서의 학습량을 조절하는 변수는 이전의 변화량과 현재의 변화량의 어떠한 평균으로 정의되기 때문에 learning rate가 급격하게 감소하는 현상을 방지할 수 있습니다.

 

8) Adaptive Momentum Estimation (Adam)

 

- 현재 deep neural network의 학습에 가장 광범위하게 이용되고 있는 알고리즘입니다.

- momentum + RMSProp 이며 학습량과 방향(가중치의 기울기)을 모두 고려하는 방법입니다.

 

옵티마이저 식의 요약

위의 요약표를 통해서 각 옵티마이저마다 기존 GD에 어떤 식들이 추가되어있는지 눈으로 보면서 파악하면 좋을 것 같습니다.