최적화 (Optimization)

손실 함수 값(loss)을 최소화하는 파라미터( : )를 구하는 과정


기울기(Gradient)

✔ 미분 가능한 N개의 다변수 함수 를 각 축이 가리키는 방향마다 편미분 한것


최적화 기법

경사 하강법(Gradient Descent)

  • 일차 미분을 이용한 최적화 기법
  • = Learning Rate, Step Size (하이퍼 파라미터, 보통 0.01 ~ 0.001)
  • step size가 너무 작으면 매 step 별로 이동하는 거리가 너무 작아 수렴하지 못하고, 너무 크면 발산하게 될 수 있다

  • 수식을 통해 손실 함수의 값이 거의 변하지 않을 때까지(약 ) 가중치를 업데이트하는 과정을 반복

+center

의문점 및 해결

모든 w(축)에 대해 편미분을 통해 각각의 gradient를 구하고 learning rate의 스케일 만큼 w를 조정(더하거나 빼거나)하여 가장 적은 loss 값을 향하여 찾아간다.

의문점: 대부분의 설명이 w를 x축으로 하는 2차원 그래프에서 설명되어있는데, 학습을 하는 중간에(혹은 최초에) 해당 그래프 모양을 알 수 있는가? 그래프는 매번 업데이트하면서 그려나가야 하는게 아닌가..

해결: 경사하강법 다시 정리

목적: loss 값이 최소가 되는 지점(, )을 찾는 것

방법: w가 1개인 직선방정식의 예

  1. loss를 구하기 위해 손실함수를 정의 (예: MSE)

  2. 업데이트(학습)하고자 하는 파라미터(, )에 대한 loss와의 관계식 정의

  3. 각 파라미터와 loss에 대한 관계식에서 편미분을 통해 기울기를 구함 (각 파라미터와 loss에 대한 관계식에서 기울기가 0이 되는 지점을 향해 찾아가도록 해야함)

  1. 경사하강법을 이용한 기울기 업데이트

이때, 와 2는 상수이므로 2는 생략가능

SO, loss를 최소화 하는 w, b 를 구하는 것이 목적

정의된 loss 함수에 따라 loss가 정해짐(MSE loss의 경우 볼록함수 그래프 안에 loss가 반드시 존재함을 가정) 경사하강법을 쓴다면 정의된 loss 함수를 각 파라미터()에 대해 편미분하여 기울기 값을 구하고, 기울기값을 이용해 파라미터를 줄여나감(업데이트)


배치 경사 하강법(Batch Gradient Descent)

  • 일반적으로 Batch Gradient Descent를 Gradient Descent라 지칭하기도 함.
  • 주요 특징은 역전파가 이루어질 때 전체 데이터셋을 이용하는 것이며, 전체 데이터셋에 대한 평균 손실과 각 파라미터의 평균 gradient를 역전파에 사용함.
errors = []
# random 한 값으로 w, b를 초기화 합니다.
w = np.random.uniform(low=-1.0, high=1.0)
b = np.random.uniform(low=-1.0, high=1.0)
 
for epoch in range(num_epoch):
    y_hat = x * w + b
 
    error = ((y_hat - y)**2).mean()
    if error < 0.0005:
        break
    
    w = w - learning_rate * ((y_hat - y) * x).mean() # w 파라미터의 gradient 평균
    b = b - learning_rate * (y_hat - y).mean() # b 파라미터의 gradient 평균
    
    errors.append(error)
    
    if epoch % 5 == 0:
        print("{0:2} w = {1:.5f}, b = {2:.5f} error = {3:.5f}".format(epoch, w, b, error))
 
print("----" * 15)
print("{0:2} w = {1:.1f}, b = {2:.1f} error = {3:.5f}".format(epoch, w, b, error))

경사 하강법의 한계

1. Local Minimum

볼록함수(Convex Function)
  • 아래 또는 위로 볼록한 함수를 볼록 함수
  • 초기 파라미터 값이 어떻게 설정되어도 경사 하강법을 활용하면 최적의 값에 도달할 수 있지만, 현실에서는 대부분의 함수는 비볼록 함수 형태
  • L1 Loss, L2 Loss

+center

비볼록함수(Non-Convex Function)
  • Global minimum < Local minimum 일 때, Global minimum 을 구해야 하지만, Local minimum에 빠지는 현상을 초례함

+center


2. 안장점 (Saddle Point)

  • 기울기가 0이지만 극값이 되지 않음
  • 경사하강법은 안장점에서 벗어나지 못함

+center



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

  • GD의 경우 모든 데이터를 한꺼번에 넣고 순전파 후 전체에러에 대해 역전파를 통해 파라미터를 업데이트시킴(전체 데이터셋에 대해 epoch 만큼 학습).
  • 베이직 SGD는 한 개 혹은 임의의 샘플데이터만 활용해서 gradient를 계산함.
  • Mini-Batch Gradient Descent를 Stochastic Gradient Descent (SGD)의 한 변형으로 표현하기도 한다. 엄밀히 말하면, Mini-Batch Gradient Descent는 SGD의 일반화된 형태로 볼 수 있으며, 두 알고리즘 간의 차이는 배치 크기(batch size) 에 있다.

Mini-Batch Gradient Descent

  • Mini-batch SGD는 Min-batch의 크기만큼 데이터의 일부만 활용해서 gradient를 계산함.
  • 특히, 실제로 딥러닝에서 사용되는 대부분의 “SGD” 알고리즘은 Mini-Batch Gradient Descent를 의미함.
  • Mini-batch SGD에서는 배치 단위 내에서 각 데이터마다 손실과 파라미터들의 gradient를 구하고, 평균 손실과 평균 gradient의 정보를 이용해 배치 단위의 파라미터 업데이트가 이루어짐.


GD, SGD

  • Gradinet Descent
    • 최적값을 찾아가는 것은 정확하지만 너무 느리다.
    • local minimum에 수렴할 가능성이 있다.
  • Stochastic Gradient Descent (Mini-batch Gradient Descent)
    • 최적값을 찾아가는 방향이 뒤죽 박죽이고, 한 스템 나아가기 위한 사이즈를 정하기 어렵지만 빠르다.
    • Mini-Batch를 사용하면 배치 평균을 기반으로 기울기를 계산하므로, 기본 SGD보다 더 안정적인 업데이트를 수행하며 수렴 속도를 높일 수 있다.
    • local minimum 문제를 어느정도 해결할 수 있다.

다양한 최적화 기법

Momentum

  • 관성의 법칙을 이용해 최적화하는 방법이다. 속도가 크게 나올수록 기울기가 크게 업데이트 된다. 진행중인 방향으로 관성을 더해 지역 최소점(Local minimum)에 빠지지 않도록 한다. 

AdaGrad

  • Adagrad의 경우 squared gradient(기울기 제곱)에 반비례하도록 학습률을 조정하는데, 이는 기울기가 가파를수록 조금만 이동하고, 완만할 수록 조금 더 이동하게 함으로써 변동을 줄이는 효과가 있다. 무엇보다 행렬곱 연산을 통해 가중치마다 다른 학습률을 적용한다는 점에서 더욱 정교한 최적화가 가능해진다.
  • 단점은 기울기가 0인 부근에서는 학습이 느려져서 local minima에 빠지게 될 수 있다. 그 문제를 해결하고자 나온 것이 RMSProp 이다.

RMSProp

  • AdaGrad의 업그레이드 버전인데 보폭을 줄이되 이전 기울기 변화의 맥락을 살핀다. a가 너무 작아져서 학습이 안되는 것을 방지해준다.

Adam

  • Momentum + AdaGrad의 장점을 합쳐서 만든 기법이다. 방향과 보폭 둘 다 적절하게 조절해준다. 대부분의 상황에서 결과가 잘 나오는 편이라 잘 모를 때는 Adam을 쓰도록 하자.

참고


Prev: 5. 역전파(Back Propagation)

Next: 7. 성능평가지표(Evaluation)


DeepLearning