[ML] Gradient Descent

2024. 2. 22. 13:48카테고리 없음

1. 경사하강법

경사하강법(Gradient Descent)는 함수의 최소값 또는 극소값을 찾기 위한 반복적인 최적화 알고리즘입니다. 쉽게 말하면, 산을 내려가는 가장 빠른 길을 찾는 방법이라고 생각할 수 있습니다. 여기서 산은 최소화하고자 하는 함수를 말합니다.

 

2. 경사하강법의 단계

  1. 임의의 시작점 선택 : 우선 함수의 그래프 상에서 임의의 점을 선택합니다. 이 점은 우리가 최적화를 시작하는 위치입니다. $x_0$
  2. 경사 계산 : 선택한 점에서 함수의 기울기를 계산합니다. 여기서 기울기는 어떤 방향으로 이동하면 함수의 값이 가장 빠르게 감소하는지를 나타냅니다. $$x_{\text{current}}$$
  3. 이동 : 계산된 경사의 반대 방향으로 작은 단계를 이동합니다. 경사가 급한 곳으로 이동하면 함수의 값이 빠르게 감소합니다. 이동거리는 학습률에 의해 결정되며, 이 값이 너무 크면 최소값을 지나치게 되고, 너무 작으면 최적화 과정이 느려집니다. $$x_{\text{next}}=x_{\text{current}}-\alpha \nabla f(x_{\text{current}})$$ $\alpha$는 학습률, $ \nabla f(x_{\text{current}})$는 현재 위치에서의 기울기
  4. 반복 : 새로운 위치에서 다시 기울기를 계산하고, 이동을 반복합니다. 이 과정을 함수의 값이 더 이상 크게 감소하지 않거나, 설정된 반복 횟수에 도달할 때까지 계속합니다.

3. Python에서 구현

import numpy as np

# 목표 함수
def f(x):
    return x ** 2

# 함수 f의 도함수(미분)
def df(x):
    return 2 * x

# 경사하강법 구현
def gradient_descent(starting_point, learning_rate, num_iterations):
    x = starting_point
    for i in range(num_iterations):
        grad = df(x)  # 현재 x에서의 기울기(미분값) 계산
        x = x - learning_rate * grad  # x 업데이트
        print(f"반복 {i+1}: x = {x}, f(x) = {f(x)}")
    return x

# 하이퍼파라미터
starting_point = 10  # 시작점
learning_rate = 0.1  # 학습률
num_iterations = 10  # 반복 횟수

# 경사하강법 실행
minimum_x = gradient_descent(starting_point, learning_rate, num_iterations)
print(f"최소값에 도달한 x: {minimum_x}, f(x)의 최소값: {f(minimum_x)}")