잡학사전/머신러닝

[머신러닝] Gradient Descent (with Python)

슬기나무 2024. 7. 24. 22:29
반응형

이번 포스팅에서는 최적화 문제에서 널리 쓰이는 방법 중 하나인 Gradient Descent에 대해 알아봅시다.

 

 Gradient Descent?

Gradient Descent는 머신러닝과 최적화 문제에서 널리 사용되는 방법 중 하나로, 주어진 함수의 최소값을 찾기 위해 사용됩니다.

 

이 방법은 이름 그대로 cost function의 기울기가 낮은 방향으로 반복적으로 이동하며 최소값을 찾아가는 방법입니다.

 

기본적으로 최소화하고자 하는 목적 함수(cost function) $J(\theta)$와 입력변수 $\theta$, 그리고

 

목적함수의 기울기인 $\triangledown J(\theta)$를 필요로 합니다.

 

 

 동작 알고리즘

Gradient Descent의 동작 알고리즘은 아래와 같이 이루어집니다.

 

1. Initialization: 파라미터 $\theta$를 임의의 값으로 초기화합니다.

 

2. Iteration:

 1) 현재의 $\theta$값에서의 기울기 $\triangledown J(\theta)$를 계산합니다.

 2) 파라미터 $\theta$를 아래와 같이 기울기의 반대 방향으로 이동하도록 업데이트 합니다.

 

$$\theta = \theta - \alpha \triangledown J(\theta)$$

 

이 때, $\alpha$는 학습률(learning rate)라 부르는 값이며, 너무 크면 파라미터가 발산할 수 있고

 

너무 작으면 수렴시간이 오래걸릴 수 있어 적절한 값 선정이 필요합니다.

 

3. 종료: 기울기가 충분히 작아지거나, 미리 정한 Iteration 횟수를 만족한 경우 종료합니다.

 

 

 Python 예제 코드

간단하게 목적함수 $J(\theta) = \theta ^2$를 최소화하기 위한 gradient descent 예제를 해보겠습니다.

 

먼저, 목적함수를 정의합니다.

def cost_function(theta):
    return theta**2

 

그리고 그 목적함수의 기울기도 정의해야겠죠?

def gradient(theta):
    return 2*theta

 

그다음 파라미터의 초기값과 학습률, 반복횟수를 입력받아 동작하는 알고리즘을 함수로 정의합니다.

 

이 함수의 return 값은 최소화된 파라미터와 목적함수의 값이 될겁니다.

def gradient_descent(initial_theta, learning_rate, iterations):
    theta = initial_theta
    theta_values = [theta]
    cost_values = [cost_function(theta)]
    
    for _ in range(iterations):
        grad = gradient(theta)
        theta = theta - learning_rate * grad
        theta_values.append(theta)
        cost_values.append(cost_function(theta))
        
    return theta_values, cost_values

 

임의의 값으로 파라미터를 초기화하고, 학습률 및 반복횟수를 정의한 후, 알고리즘 함수를 실행합니다.

initial_theta = 10
learning_rate = 0.1
iterations = 20

theta_values, cost_values = gradient_descent(initial_theta, learning_rate, iterations)

 

 

결과를 보니 파라미터 $\theta$가 기울기 반대방향을 따라 작아짐에 따라,

 

목적함수(cost function) 또한 작아지는 것을 확인할 수 있습니다.

 

이 경우 당연하게도, 목적함수는 $\theta ^2$였으니 반복횟수가 많아질수록 0에 수렴하게 될겁니다.

 

 

아래에 전체 코드를 나타내었습니다.

import numpy as np
import matplotlib.pyplot as plt

# 목적 함수 예제 (2차함수)
def cost_function(theta):
    return theta**2

# 목적 함수의 기울기
def gradient(theta):
    return 2*theta

# Gradient Descent 알고리즘
def gradient_descent(initial_theta, learning_rate, iterations):
    theta = initial_theta
    theta_values = [theta]
    cost_values = [cost_function(theta)]
    
    for _ in range(iterations):
        grad = gradient(theta)
        theta = theta - learning_rate * grad
        theta_values.append(theta)
        cost_values.append(cost_function(theta))
        
    return theta_values, cost_values

# 파라미터 초기화
initial_theta = 10
learning_rate = 0.1
iterations = 20

# Gradient Descent 실행
theta_values, cost_values = gradient_descent(initial_theta, learning_rate, iterations)

# 시각화
plt.figure(figsize=(10, 6))

plt.subplot(2, 1, 1)
plt.plot(range(len(theta_values)), theta_values, 'b-', marker='o')
plt.title('Gradient Descent Progress')
plt.ylabel('Theta')
plt.grid(True)

plt.subplot(2, 1, 2)
plt.plot(range(len(cost_values)), cost_values, 'r-', marker='o')
plt.xlabel('Iteration')
plt.ylabel('Cost')
plt.grid(True)

plt.tight_layout()
plt.show()

 

 

여기까지 Gradient Descent 방법에 대해 알아보았습니다.

반응형