본문 바로가기

ML&DL/Deep Learning

Gradient descent algorithm(경사하강법)과 back propagation

이 포스팅은 sung kim 교수님 강의 의 자료를 활용했습니다.

Gradient descent algorithm review

Loss function(=cost function=objective function)은 실제 값과 추정 값의 차이를 나타내는 함수. 즉, 얼마나 틀렸냐?를 나타낸다. loss function을 최소화 하는 것이 우리의 목적이다. gradient descent algorithm(경사 하강법)은 loss를 최소화 하는 weight를 찾는 방법중 하나이다. 그럼 어떻게 loss를 최소화 하냐? 현재 위치에서 gradient(기울기)가 가장 급격한 방향으로 조금씩 이동하며 최소값으로 도달한다.

 

 즉, 특정 weight에 대한 편미분을 통해 각각의 weight가 loss에 얼마나 영향을 미치는지를 나타내는 값이 gradient고 이에 반대되는 방향으로 얼마나 움직일지가 learning rate가 된다. weight가 하나라고 가정하면 다음과 같은 그림으로 gradient descent algorithm을 표현할 수 있다.

 

Gradient descent algorithm 순서

  • 현재 weight에서 모든 데이터에 대해 loss를 구해서 미분한다.
  • 미분한 값이 gradient(=기울기)가 된다.
  • 기울기가 양수면 음수방향으로 a(learning rate)만큼 이동한다. (weight를 수정한다.)
  • minima에 도달할 때 까지 반복한다.

Gradient descent 종류

Stochastic Gradient Descent (SGD): 데이터 마다(batch=1) gradient를 이용해 weight를 업데이트

Mini-Batch Gradient Descent (MBGD) : batch의 gradient 평균을 이용해 weight를 업데이트

Gradient Descent (GD) : 전체 데이터셋의 gradient 평균을 이용하여 weight를 업데이트

Back propagation

network가 깊고 복잡해진다면 한꺼번에 어떻게 미분할 수 있을까? 이것을 back propagation을 이용하여 해결할 수 있다. Neural net은 두가지 방향의 계산을 통해서 학습이 이루어진다.

 

  1. forward propagation: 현재 weight에 대해 loss를 계산한다.
  2. back propagation: loss를 뒤에서 부터 앞으로 보내면서 weight를 업데이트 한다.

 

1. forward로 output f를 구한다. (f=-7)

2. f를 각 노드들의 변수로 편미분한다.

3. 바로 미분값을 구할 수 없는 애들은 chain rule을 이용하여 미분값을 구한다.

4. 각 weight에 해당하는 f의 편미분값을 learning rate 만큼 곱해서 이전 step에서 빼주어 weight를 업데이트 한다.

어떤 복잡한 함수도 Back propagation을 이용하면 쉽게 미분가능하다!

Sigmoid함수를 예로 들면 복잡한데 어떻게 미분하냐! 싶겠지만 chain rule을 이용해서 간단하게 미분할 수 있다. Sigmoid함수를 graph로 표현하면 아래와 같다. 그러므로 tensorflow, PyTorch는 모든 것을 계산 그래프로 표현하고 chain rule을 이용하여 각 파라미터의 gradient를 구한다.

(이에 대한 수식은 다른 포스팅에 자세히 설명하도록 하겠다.)