728x90
서론
- 일반적인 Gradient Descent에서 수렴을 좀 더 빠르게 하기 위함이다.
- 이전에 필요한 내용은 모멘텀 방법이 있었고 여기서 발전한 내용이다.
- 모멘텀에 대해서 잠시 이야기하자면 이전 단계의 기울기를 포함해 학습이 빠르고 부드럽게 만드는 것이다.
- NAG는 여기서 모멘텀을 활용해 예측된 값 기울기를 사용한다.
- 자세한 수식은 본론에서 설명하도록 하고 여기서 마친다.
본론
- 모멘텀
- 모멘텀에 대해서 잠시 짚고 넘어간다면 다음과 같다.
- 속도 업데이트 : $v_t=\gamma v_{t-1}+\eta \nabla J(\theta_{t-1})$
- $v_t$는 속도, $\gamma$는 모멘텀 계수, $\eta$는 학습률,$\nabla J(\theta_{t-1})$는 $\theta_{t-1}$에서의 기울
- 파라미터 업데이터 : $\theta_t=\theta_{t-1}-v_t$
- 위와 같은 내용을 코드와 실행결과로 확인해 보겠습니다.
-
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()
- 결과
- 수식을 보면 알 수 있겠지만 v가 속력이라는 이름을 붙여서 그렇지 필자의 생각은 ‘얼만큼(크기) 어디로(방향) 이동할 건가’에 대한 변수라고 생각한다.
- 그럼 이제 모멘텀에 대해 알았으니 이 본문의 메인인 NAG에 대해 알아보자
- Nesterov Accelerated Gradient (NAG)
- 모멘텀을 이용하는 데 큰 차이점이 뭐냐면 아까 전에는 이동할 거리를 먼저 정하고 → $\theta_{t}$의 위치로 이동을 했다면 여기서는 순서가 조금 다르다.
- 예측 단계 : 먼저 저번 속력 이용해 이동할 위치를 확인한다.
- $\theta_{lookahead}=\theta_{t-1}-\gamma v_{t-1}$
- 기울기 계산 : 그 위치에서 기울기를 계산한다.
- $\nabla J(\theta_{lookahead})$
- 속도 업데이트 : 그 기울기를 가지고 현재의 속도를 구한다.
- $v_t=\gamma v_{t-1}+\eta \nabla J(\theta_{lookahead})$
- 파라미터 업데이트
- $\theta_t=\theta_{t-1}-v_t$
- 간략하게 설명하자면 앞서갈 곳의 기울기를 이용해서 간다는 것인데, 이것만으로는 왜 빨리 수렴하는지 이해가 안 될 수 있다.
- 왼쪽은 모멘텀, 오른쪽은 NAG이다. 다음과 같이 앞에 있는 점으로 계산하면 빠르게 수렴하는 것을 확인할 수 있다.
결론
- 이 포스트는 모멘텀과 NAG에 대해서 확인해 본 포스트이다.
- 모멘텀은 이전 속도를 이용해서 빠르게!
- NAG는 모멘텀도 이용한 미래의 점 기울기를 이용해서 빠르게!
- 포스팅에 관한 수정 및 지적은 언제나 환영입니다.
- 처음 제대로된 포스팅인 것 같은데 이 글은 노션으로 먼저 썼다가 노션에서 티스토리의 이동이 쉽지 않음을 알게 되면서 다음부터는 티스토리에 바로 작성할 예정이다.
728x90
'Learn' 카테고리의 다른 글
[데이터처리와 분석] K-Mean 실습 및 확인 (0) | 2024.06.13 |
---|---|
[컴퓨터비전] R-CNN (0) | 2024.06.13 |
[머신러닝] Optimizer(SGD+M, AdaGrad, RMSProp, Adam, AdamW) (1) | 2024.06.12 |
[데이터처리와분석] 데이터 준비하기 (0) | 2024.06.12 |
[머신러닝] Normalization 종류 (0) | 2024.06.12 |