경사하강법(Gradient Descent)의 직관적 이해
경사하강법(Gradient Descent)은 머신러닝 모델을 훈련시키는 데 사용되는 핵심 알고리즘 중 하나이다. 이 방법은 모델의 예측과 실제 데이터 간의 오차를 최소화하는 파라미터(매개변수)를 찾는 데 사용된다. 경사하강법은 특히 복잡한 모델에서 최적의 해를 찾기 위한 반복적인 최적화 기술로 널리 사용된다.
💡 경사하강법이란? (What is Gradient Descent?)
경사하강법은 함수의 최솟값을 찾기 위해 함수의 기울기(gradient, 경사)를 이용하여 반복적으로 파라미터를 업데이트하는 최적화 알고리즘이다. 머신러닝에서는 손실 함수(loss function)의 값을 최소화하는 모델 파라미터를 찾는 데 주로 사용된다. 손실 함수는 모델의 예측값과 실제값 사이의 차이를 나타내며, 이 손실 함수의 값을 줄이는 것이 목표이다.
📉 기본 원리 (Basic Principle)
경사하강법의 기본 원리는 다음과 같다.
- 임의의 초기 파라미터 값으로 시작한다.
- 현재 파라미터 값에서 손실 함수의 기울기를 계산한다. 기울기는 손실 함수가 가장 가파르게 증가하는 방향을 나타낸다. 따라서, 기울기의 반대 방향으로 이동하면 손실 함수가 감소한다.
- 기울기의 반대 방향으로 일정 크기만큼 파라미터를 업데이트한다. 이 때 이동하는 크기를 학습률(learning rate)이라고 한다.
- 손실 함수의 값이 충분히 작아지거나, 파라미터의 변화가 미미해질 때까지 2, 3 단계를 반복한다.
수식으로 표현하면 다음과 같다.
- new_parameter = old_parameter - learning_rate * gradient
여기서 'new_parameter'는 업데이트된 파라미터 값, 'old_parameter'는 이전 파라미터 값, 'learning_rate'는 학습률, 'gradient'는 손실 함수의 기울기를 의미한다.
✍️ 경사하강법의 단계별 설명 (Step-by-Step Explanation)
초기화 (Initialization): 모델의 파라미터를 임의의 값으로 초기화한다. 예를 들어, 선형 회귀 모델의 경우 기울기(weight)와 절편(bias)을 무작위로 설정할 수 있다.
import numpy as np # 파라미터 초기화 weight = np.random.randn() bias = np.random.randn()
손실 함수 정의 (Define Loss Function): 모델의 예측값과 실제값 사이의 오차를 계산하는 손실 함수를 정의한다. 평균 제곱 오차(Mean Squared Error, MSE)가 일반적인 손실 함수로 사용된다.
# MSE 손실 함수 정의 def mse_loss(y_true, y_predicted): return np.mean((y_true - y_predicted)**2)
기울기 계산 (Calculate Gradient): 손실 함수에 대한 각 파라미터의 기울기를 계산한다. 기울기는 손실 함수가 가장 빠르게 증가하는 방향을 나타내므로, 이 반대 방향으로 이동해야 손실 함수를 최소화할 수 있다.
# 기울기 계산 (예시: 선형 회귀 모델) def calculate_gradient(X, y_true, weight, bias): y_predicted = weight * X + bias # weight에 대한 기울기 dw = np.mean(2 * X * (y_predicted - y_true)) # bias에 대한 기울기 db = np.mean(2 * (y_predicted - y_true)) return dw, db
파라미터 업데이트 (Update Parameters): 계산된 기울기를 사용하여 파라미터를 업데이트한다. 학습률(learning rate)은 업데이트의 크기를 조절하는 역할을 한다. 적절한 학습률을 선택하는 것이 중요하다. 너무 크면 최적점을 지나칠 수 있고, 너무 작으면 수렴하는 데 시간이 오래 걸린다.
# 파라미터 업데이트 def update_parameters(weight, bias, dw, db, learning_rate): new_weight = weight - learning_rate * dw new_bias = bias - learning_rate * db return new_weight, new_bias
반복 (Iteration): 손실 함수의 값이 충분히 작아지거나, 파라미터의 변화가 미미해질 때까지 2, 3, 4 단계를 반복한다. 반복 횟수를 설정하여 알고리즘이 무한정 실행되는 것을 방지할 수 있다.
# 경사하강법 반복 def gradient_descent(X, y_true, weight, bias, learning_rate, epochs): for epoch in range(epochs): dw, db = calculate_gradient(X, y_true, weight, bias) weight, bias = update_parameters(weight, bias, dw, db, learning_rate) y_predicted = weight * X + bias loss = mse_loss(y_true, y_predicted) if epoch % 100 == 0: print(f'Epoch {epoch}, Loss: {loss}') return weight, bias # 예시 데이터 X = np.array([1, 2, 3, 4, 5]) y_true = np.array([2, 4, 5, 4, 5]) # 초기 파라미터 및 학습 설정 weight = np.random.randn() bias = np.random.randn() learning_rate = 0.01 epochs = 1000 # 경사하강법 실행 final_weight, final_bias = gradient_descent(X, y_true, weight, bias, learning_rate, epochs) print(f'Final Weight: {final_weight}, Final Bias: {final_bias}')
📚 학습률 (Learning Rate)
학습률(learning rate)은 경사하강법에서 파라미터를 업데이트할 때 얼마나 크게 이동할지를 결정하는 중요한 하이퍼파라미터(hyperparameter, 초매개변수)이다. 학습률이 너무 크면 최적점을 지나쳐 발산(divergence)할 수 있고, 너무 작으면 수렴(convergence)하는 데 시간이 오래 걸릴 수 있다. 따라서 적절한 학습률을 선택하는 것이 중요하다.
- 학습률이 너무 큰 경우: 손실 함수 값이 진동하거나 발산할 수 있다.
- 학습률이 너무 작은 경우: 수렴 속도가 매우 느려져 최적의 파라미터를 찾는 데 오랜 시간이 걸린다.
일반적으로 학습률은 0.001, 0.01, 0.1 등의 값을 사용하며, 다양한 값을 시도해 보면서 가장 적합한 값을 찾아야 한다. 또한, 학습률 스케줄링(learning rate scheduling) 기법을 사용하여 학습 과정 동안 학습률을 동적으로 조절할 수도 있다.
🤔 경사하강법의 종류 (Types of Gradient Descent)
경사하강법은 데이터셋의 크기와 사용 방식에 따라 여러 종류로 나눌 수 있다.
- 배치 경사하강법 (Batch Gradient Descent): 전체 훈련 데이터셋을 사용하여 한 번의 업데이트를 수행한다. 안정적인 수렴이 가능하지만, 데이터셋이 큰 경우 계산 비용이 많이 든다.
- 확률적 경사하강법 (Stochastic Gradient Descent, SGD): 각 업데이트마다 무작위로 선택된 하나의 데이터 포인트(샘플)를 사용하여 기울기를 계산한다. 계산 비용이 적고 빠르게 수렴할 수 있지만, 불안정하게 진동하며 수렴할 수 있다.
- 미니배치 경사하강법 (Mini-Batch Gradient Descent): 전체 데이터셋을 작은 미니배치(mini-batch)로 나누어 각 미니배치에 대해 기울기를 계산한다. 배치 경사하강법과 확률적 경사하강법의 절충안으로, 안정성과 속도 면에서 균형을 이룬다. 딥러닝에서 가장 널리 사용되는 방식이다.
📝 경사하강법 요약 (Summary of Gradient Descent)
- 경사하강법 (Gradient Descent): 손실 함수를 최소화하는 파라미터를 찾는 최적화 알고리즘
- 손실 함수 (Loss Function): 모델의 예측값과 실제값 사이의 오차를 나타내는 함수
- 기울기 (Gradient): 손실 함수가 가장 가파르게 증가하는 방향
- 학습률 (Learning Rate): 파라미터 업데이트 시 이동하는 크기를 결정하는 하이퍼파라미터
- 배치 경사하강법 (Batch Gradient Descent): 전체 데이터셋을 사용
- 확률적 경사하강법 (Stochastic Gradient Descent, SGD): 하나의 데이터 포인트를 사용
- 미니배치 경사하강법 (Mini-Batch Gradient Descent): 미니배치를 사용
경사하강법은 머신러닝 모델을 훈련시키는 데 필수적인 도구이다. 기본 원리를 이해하고 다양한 변형을 활용함으로써, 모델의 성능을 최적화할 수 있다.