Learn

[머신러닝] Momentum & Nesterov

부루기 2024. 6. 11. 10:48
728x90

서론

  1. 일반적인 Gradient Descent에서 수렴을 좀 더 빠르게 하기 위함이다.
  2. 이전에 필요한 내용은 모멘텀 방법이 있었고 여기서 발전한 내용이다.
  3. 모멘텀에 대해서 잠시 이야기하자면 이전 단계의 기울기를 포함해 학습이 빠르고 부드럽게 만드는 것이다.
  4. NAG는 여기서 모멘텀을 활용해 예측된 값 기울기를 사용한다.
  5. 자세한 수식은 본론에서 설명하도록 하고 여기서 마친다.

본론

  1. 모멘텀
    1. 모멘텀에 대해서 잠시 짚고 넘어간다면 다음과 같다.
    2. 속도 업데이트 : $v_t=\gamma v_{t-1}+\eta \nabla J(\theta_{t-1})$
      1. $v_t$는 속도, $\gamma$는 모멘텀 계수, $\eta$는 학습률,$\nabla J(\theta_{t-1})$는 $\theta_{t-1}$에서의 기울
    3. 파라미터 업데이터 : $\theta_t=\theta_{t-1}-v_t$
    4. 위와 같은 내용을 코드와 실행결과로 확인해 보겠습니다.
    5. import numpy as np
      import matplotlib.pyplot as plt
      
      # Define the function to optimize
      def f(x):
          return x**2
      
      # Define the gradient of the function
      def grad_f(x):
          return 2*x
      
      # Gradient Descent with Momentum parameters
      gamma = 0.9  # momentum coefficient
      eta = 0.1    # learning rate
      iterations = 20
      x_initial = 10
      
      # Arrays to store the values
      x_values = [x_initial]
      v = 0  # initial velocity
      
      # Gradient Descent with Momentum
      x = x_initial
      for i in range(iterations):
          v = gamma * v + eta * grad_f(x)
          x = x - v
          x_values.append(x)
      
      # Create a plot
      x_range = np.linspace(-10, 10, 400)
      y_range = f(x_range)
      
      plt.figure(figsize=(10, 6))
      plt.plot(x_range, y_range, label='$f(x) = x^2$')
      plt.scatter(x_values, [f(x) for x in x_values], color='red')
      for i in range(len(x_values) - 1):
          plt.arrow(x_values[i], f(x_values[i]), 
                    x_values[i+1] - x_values[i], 
                    f(x_values[i+1]) - f(x_values[i]), 
                    head_width=0.3, head_length=0.5, fc='blue', ec='blue')
      plt.title('Gradient Descent with Momentum')
      plt.xlabel('x')
      plt.ylabel('f(x)')
      plt.legend()
      plt.grid()
      plt.show()
    6. 결과
    7. 수식을 보면 알 수 있겠지만 v가 속력이라는 이름을 붙여서 그렇지 필자의 생각은 ‘얼만큼(크기) 어디로(방향) 이동할 건가’에 대한 변수라고 생각한다.
    8. 그럼 이제 모멘텀에 대해 알았으니 이 본문의 메인인 NAG에 대해 알아보자
  2. Nesterov Accelerated Gradient (NAG)
    1. 모멘텀을 이용하는 데 큰 차이점이 뭐냐면 아까 전에는 이동할 거리를 먼저 정하고 → $\theta_{t}$의 위치로 이동을 했다면 여기서는 순서가 조금 다르다.
    2. 예측 단계 : 먼저 저번 속력 이용해 이동할 위치를 확인한다.
      1. $\theta_{lookahead}=\theta_{t-1}-\gamma v_{t-1}$
    3. 기울기 계산 : 그 위치에서 기울기를 계산한다.
      1. $\nabla J(\theta_{lookahead})$
    4. 속도 업데이트 : 그 기울기를 가지고 현재의 속도를 구한다.
      1. $v_t=\gamma v_{t-1}+\eta \nabla J(\theta_{lookahead})$
    5. 파라미터 업데이트
      1. $\theta_t=\theta_{t-1}-v_t$
    6. 간략하게 설명하자면 앞서갈 곳의 기울기를 이용해서 간다는 것인데, 이것만으로는 왜 빨리 수렴하는지 이해가 안 될 수 있다.
    7. 왼쪽은 모멘텀, 오른쪽은 NAG이다. 다음과 같이 앞에 있는 점으로 계산하면 빠르게 수렴하는 것을 확인할 수 있다.

결론

  1. 이 포스트는 모멘텀과 NAG에 대해서 확인해 본 포스트이다.
  2. 모멘텀은 이전 속도를 이용해서 빠르게!
  3. NAG는 모멘텀도 이용한 미래의 점 기울기를 이용해서 빠르게!
  • 포스팅에 관한 수정 및 지적은 언제나 환영입니다.
  • 처음 제대로된 포스팅인 것 같은데 이 글은 노션으로 먼저 썼다가 노션에서 티스토리의 이동이 쉽지 않음을 알게 되면서 다음부터는 티스토리에 바로 작성할 예정이다.
728x90