지노랩 /JinoLab

14. 경사하강법(Gradient Descent) 본문

프로그래밍/C언어를 이용한 Deep Learning

14. 경사하강법(Gradient Descent)

지노랩/JinoLab 2025. 8. 9. 09:41

 

1. 경사하강법이란?

  • 목표: 손실함수(loss function) E(w) 를 최소화하는 가중치 w* 를 찾는 방법
  • 손실함수 예시:

  • 경사(gradient):

  • 업데이트 룰:

  • α: 학습률(learning rate)
  • 매 단계마다 dE/dw의 “방향”과 “크기”를 참고해 w를 조금씩 내려가면(하강하면), 손실이 점차 줄어듭니다.

2. 시각적 이해

   E(w)
    ▲
    │         ●  
    │        / \
    │       /   \
    │      /     \
    │     ●       ●   ← 목표점(기울기=0, 최소 손실)
    │    /         \
    │   /           \
    │  ●             ●
    └──────────────────▶ w
            ▲
       현재 위치
  1. 현재 위치(노란 점)에서 E(w)E(w) 기울기를 계산
  2. 기울기가 양수면 ww내려(–), 음수면 올려(+)
  3. 여러 번 반복하면(→ 화살표) 최저점(기울기 = 0)에 수렴

3. C 언어 구현: 단일 매개변수 경사하강법

#include <stdio.h>

// 손실함수: E(w) = (x*w - y)^2
double loss(double x, double w, double y) {
    double diff = x * w - y;
    return diff * diff;
}

// 손실함수의 기울기 dE/dw = 2 * (x*w - y) * x
double gradient(double x, double w, double y) {
    return 2.0 * (x * w - y) * x;
}

int main(void) {
    double x       = 0.5;    // 입력값
    double y_true  = 0.8;    // 목표(정답)
    double w       = 0.0;    // 초기 가중치
    double alpha   = 0.1;    // 학습률
    int    epochs  = 20;     // 반복 횟수

    printf("Epoch |     w     |   loss   \n");
    printf("--------------------------------\n");
    for (int i = 1; i <= epochs; i++) {
        double grad = gradient(x, w, y_true);
        w -= alpha * grad;                   // 경사하강 업데이트
        double L = loss(x, w, y_true);
        printf("%5d | %8.4f | %8.4f\n", i, w, L);
    }
    return 0;
}

빌드 & 실행

gcc -o gd_single gd_single.c
./gd_single
Epoch |     w     |   loss   
--------------------------------
    1 |   0.0800 |   0.2704
    2 |   0.1440 |   0.1564
    3 |   0.1958 |   0.0904
    4 |   0.2373 |   0.0522
    5 |   0.2701 |   0.0302
    ...
   20 |   0.7960 |   0.0003
  • 설명
    • gradient() 함수가 기울기(손실 증가 방향)를 계산
    • w -= alpha * grad; 로 손실이 줄어드는 반대 방향(하강)으로 이동
    • 반복할수록 손실(loss)가 0에 가까워지고, 가중치 w가 y_true / x에 수렴

4. 팁 & 확장

  1. 학습률(α) 조정
    • 너무 크면 발산, 너무 작으면 느린 수렴
  2. 다차원 경사하강법
    • 입력 벡터 x\mathbf{x}, 가중치 벡터 w\mathbf{w}로 일반화
  3. 미니배치·배치 학습
    • 여러 샘플 평균 기울기를 사용해 안정적 학습
  4. 모멘텀, Adam 등 고급 옵티마이저 적용 가능

이처럼 경사하강법은 “현재 손실 그래프에서 기울기를 구해, 그 반대 방향으로 조금씩 이동하는” 매우 직관적인 학습 알고리즘입니다. 다음 강의에서는 다층 퍼셉트론에 적용된 역전파(backpropagation) 를 살펴보겠습니다!