본문으로 건너뛰기
김신건의 로그

경사 하강법 (Gradient Descent)

· 수정 · 📖 약 2분 · 658자/단어 #algorithm #optimization #gradient-descent
gradient descent, 경사 하강법, GD, steepest descent, gradient-descent

정의

경사 하강법 (Gradient Descent, GD) 은 미분 가능한 목적 함수 f(x) 의 1차 도함수 (gradient) 방향으로 반복 이동하며 극소값 (local minimum) 을 찾는 1차 최적화 알고리즘. 머신러닝 / 딥러닝 학습의 핵심 엔진.

문제 상황과 동기

f(x) 가 복잡하여 closed-form 해 (grad f = 0) 를 구할 수 없음. 특히 고차원 (d >> 1) 에서는 Newton 법 (Hessian 필요) 이 현실적으로 불가능.

  • Naive (grid search): 차원당 그리드 M -> M^d. d=1000 이면 천문학적.
  • Gradient Descent: grad f 만 있으면 O(d) 반복. 차원에 선형적.

핵심 통찰: 함수가 국소적으로 선형 근사 가능하다면, 반대 방향으로 가면 함수값이 감소한다.

시각화

핵심 아이디어

x_{t+1} = x_t - eta * grad f(x_t)

  • eta (learning rate / step size): 한 step 의 크기
  • grad f(x_t): x_t 에서의 gradient (가장 가파른 증가 방향)
  • -grad f(x_t): 가장 가파른 감소 방향

Convex 함수: 전역 최소로 수렴 보장. Non-convex: saddle point / local min 에 빠질 수 있음.

알고리즘

1. 초기 x0, learning rate eta 설정
2. for t = 0, 1, ... until convergence:
3.   g = grad f(x_t)
4.   x_{t+1} = x_t - eta * g
5.   if ||g|| < eps: break
6. return x_t

구현

// Gradient descent: f(x,y) = x^2 + 2y^2 (convex)
#include <bits/stdc++.h>
using namespace std;
int main() {
  double x = 3.0, y = 2.0;
  double lr = 0.1;
  int max_iter = 100;
  for (int i = 0; i < max_iter; i++) {
      double gx = 2 * x;
      double gy = 4 * y;
      x -= lr * gx;
      y -= lr * gy;
      cout << i << " " << x << " " << y << " "
           << (x*x + 2*y*y) << "\n";
  }
}
결과
0 2.400000 1.200000 8.640000
1 1.920000 0.720000 4.723200
2 1.536000 0.432000 2.613888
...
98 0.000694 0.000014 4.894e-07
99 0.000555 0.000008 3.187e-07

복잡도

항목
시간 (iteration 당)O(d) (gradient 계산)
수렴 (convex, smooth)O(1/eps) 회 iteration
수렴 (strongly convex)O(log(1/eps)) 회 (linear convergence)
공간O(d)

변형 / 활용

변형설명
SGD (Stochastic GD)샘플 하나로 gradient 추정, 노이즈 있지만 빠름
Momentum관성 항 추가, 진동 억제
Adamadaptive lr + momentum, 가장 널리 사용
Mini-batch GDSGD + batch 의 절충

머신러닝 (Linear Regression, Logistic Regression, Neural Network), 최적제어, 로봇 공학.

수렴 분석 (Convex Case)

f(x) = x^2 + 2y^2 은 strongly convex (Hessian = diag(2,4) > 0). GD 는 linear rate 로 수렴:

||x_t - x*|| <= c^t * ||x_0 - x*||,   c = max(|1 - eta*L|, |1 - eta*mu|)
  • L = 4 (최대 eigenvalue), mu = 2 (최소 eigenvalue)
  • eta = 0.1 -> c = max(0.6, 0.8) = 0.8
  • 100 step 후 오차: 0.8^100 ~ 2e-10

함정

1. Learning Rate 선택

eta 가 너무 크면 발산, 너무 작으면 수렴 느림. 보통 0.01 ~ 0.001 에서 시작.

2. Saddle Point

고차원에서는 local min 보다 saddle point 가 문제. grad f = 0 이지만 극소가 아님. momentum / Adam 으로 완화.

3. Feature Scaling

차원 간 scale 이 다르면 gradient 방향이 왜곡됨. 모든 feature 를 같은 scale 로 정규화 필요.

BOJ 연습 문제

번호제목정답률링크
BOJ 9735삼차 방정식 풀기 (Newton)-kokoa-lab
BOJ 13147Dressing Up (GD 응용)-kokoa-lab

참고

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기