이번 포스팅에서는 최적화 문제에서 널리 쓰이는 방법 중 하나인 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 방법에 대해 알아보았습니다.
'잡학사전 > 머신러닝' 카테고리의 다른 글
[머신러닝] 얀센의 부등식(Jansen's inequality) (0) | 2022.05.25 |
---|---|
[머신러닝] 컨벡스 함수(convex function) (0) | 2022.05.24 |
[머신러닝] 손실함수(loss function) (2) - 엔트로피(Entropy) (0) | 2022.04.14 |
[머신러닝] 손실함수(loss function) (1) - L1, L2 손실함수 (0) | 2022.04.13 |
[머신러닝] 그리드 서치(grid search) (0) | 2022.04.12 |