Gradient Descent
경사하강법
손실 함수를 최소화하는 최적화 알고리즘. 딥러닝 학습의 핵심.
경사하강법
손실 함수를 최소화하는 최적화 알고리즘. 딥러닝 학습의 핵심.
Gradient Descent(경사하강법)는 손실 함수(Loss Function)의 최솟값을 찾기 위해 기울기(gradient)의 반대 방향으로 파라미터를 반복적으로 업데이트하는 최적화 알고리즘입니다. 딥러닝에서 수백만 개의 가중치를 효율적으로 학습시키는 핵심 메커니즘으로, 모든 신경망 학습의 근간이 됩니다.
1847년 Cauchy가 처음 제안한 이 알고리즘은 1986년 Rumelhart의 역전파(Backpropagation) 논문과 결합되어 현대 딥러닝의 기반이 되었습니다. 2012년 AlexNet이 ImageNet 대회에서 우승하면서 GPU 기반 대규모 경사하강법 학습의 효과가 입증되었습니다.
핵심 원리는 현재 위치에서 손실 함수의 기울기를 계산하고, 그 반대 방향으로 learning rate만큼 이동하는 것입니다. 수식으로는 w = w - lr * gradient(L)로 표현되며, 이 과정을 손실이 충분히 작아질 때까지 반복합니다.
실무에서는 전체 데이터를 사용하는 Batch GD보다 미니배치를 사용하는 Mini-batch SGD가 표준입니다. Adam, AdaGrad, RMSprop 같은 변형 알고리즘들이 learning rate를 자동 조절하여 수렴 속도와 안정성을 크게 개선했습니다.
import numpy as np
# 간단한 Gradient Descent 구현
def gradient_descent(X, y, learning_rate=0.01, epochs=1000):
m, n = X.shape
weights = np.zeros(n)
bias = 0
for epoch in range(epochs):
# 예측값 계산
y_pred = np.dot(X, weights) + bias
# 손실 계산 (MSE)
loss = np.mean((y_pred - y) ** 2)
# 그래디언트 계산
dw = (2/m) * np.dot(X.T, (y_pred - y))
db = (2/m) * np.sum(y_pred - y)
# 파라미터 업데이트
weights -= learning_rate * dw
bias -= learning_rate * db
if epoch % 100 == 0:
print(f"Epoch {epoch}, Loss: {loss:.4f}")
return weights, bias
# 사용 예시
X = np.random.randn(100, 3)
y = 2*X[:, 0] + 3*X[:, 1] - X[:, 2] + np.random.randn(100)*0.1
weights, bias = gradient_descent(X, y, learning_rate=0.1, epochs=500)
"Loss가 계속 진동하는 건 learning rate가 너무 높은 거예요. 0.001에서 0.0001로 낮추고 Adam optimizer로 바꾸면 gradient descent가 안정적으로 수렴할 겁니다."
"SGD와 Mini-batch GD의 차이는 한 번 업데이트에 사용하는 샘플 수입니다. SGD는 1개 샘플로 noisy하지만 빠르고, Mini-batch는 보통 32-256개로 gradient 추정의 분산을 줄여 안정적입니다."
"gradient clipping 없이 학습하면 exploding gradient 문제가 생길 수 있어요. torch.nn.utils.clip_grad_norm_으로 max_norm=1.0 정도로 제한하는 게 좋겠습니다."
너무 크면 발산하고, 너무 작으면 학습이 느립니다. Learning rate scheduler나 Adam 같은 adaptive optimizer를 사용하세요.
비볼록 함수에서는 전역 최솟값이 아닌 지역 최솟값에 빠질 수 있습니다. Momentum이나 여러 초기값으로 학습을 시도하세요.
입력 특성의 스케일이 다르면 gradient 방향이 왜곡됩니다. 반드시 StandardScaler나 MinMaxScaler로 정규화하세요.