지노랩 /JinoLab

21. Deep Learning을 위한 미분(calculus) 본문

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

21. Deep Learning을 위한 미분(calculus)

지노랩/JinoLab 2025. 8. 16. 09:21

 

1. 미분이 뭐예요?

  • 함수 f(x)미분은 “함수 값이 얼마나 빨리 변하는지”를 나타내는 수학적 도구예요.
  • 기하학적으로는 접선의 기울기를 뜻해요.

  • 즉, x를 아주 조금 Δx 만큼 바꿨을 때, f가 얼마나 변하는지( Δf )를 Δx로 나누면, 그 비율이 미분값이에요.

2. 주요 미분 공식

  • 상수배 법칙

상수 cc는 그대로 밖으로 나온다!

  • 거듭제곱 법칙 (Power Rule)

  • 합의 법칙

  • 차의 법칙 (합과 같음)

  • 곱의 법칙 (Product Rule)

  • 체인 룰 (Chain Rule)


3. 접선 기울기 계산 예시

예: f(x) = 3x 일 때, x=2에서 기울기는 항상 3! (직선이라 일정)
예: g(x) = x^2 일 때, g′(x) = 2x 이므로, x = 3에서 기울기는 2⋅3 = 6

 


4. C 언어로 “수치 미분(Numerical Derivative)” 구현하기

실제 딥러닝 라이브러리는 자동으로 미분을 계산해 주지만, 개념을 잡기 위해 작은 변화 Δx\Delta x 를 이용한 근사 미분 코드를 만들어 봅시다.

#include <stdio.h>

// 예시 함수 1: f(x) = 3x
double f1(double x) {
    return 3.0 * x;
}

// 예시 함수 2: f(x) = x^2
double f2(double x) {
    return x * x;
}

// 예시 함수 3: h(x) = (3x + 2x^2)^2
double h(double x) {
    double u = 3.0*x + 2.0*x*x;
    return u * u;
}

// 수치 미분: (f(x+h) - f(x)) / h
double numerical_derivative(double (*func)(double), double x) {
    double h = 1e-6;  // 매우 작은 값
    return (func(x + h) - func(x)) / h;
}

int main(void) {
    double x;

    // f1 미분
    x = 2.0;
    printf("f1(x)=3x,  x=%.2f -> f'(x)≈%.6f  (정답=3.0)\n",
           x, numerical_derivative(f1, x));

    // f2 미분
    x = 3.0;
    printf("f2(x)=x^2, x=%.2f -> f'(x)≈%.6f  (정답=2x=6.0)\n",
           x, numerical_derivative(f2, x));

    // h 미분 (체인룰 예시)
    x = 1.0;
    printf("h(x)=(3x+2x^2)^2, x=%.2f -> h'(x)≈%.6f  (정답=2u·u' = 2*(3+2)* (3+4*1) = 2*5*7=70)\n",
           x, numerical_derivative(h, x));

    return 0;
}

어떻게 동작하나요?

  1. 작은 h (10^-6)를 더한 뒤 함수 값을 구하고, 원래 값과 빼서 Δf를 얻어요.
  2. ΔfΔx로 나누면 미분값을 근사할 수 있습니다.
  3. 실제 수학 식으로 미분한 결과(3.0, 6.0, 70.0)와 아주 가까운 값을 확인할 수 있어요.

마무리

  • 딥러닝에서 역전파(Backpropagation)경사하강법(Gradient Descent) 에는 이 미분 개념이 숨어 있어요.
  • 오늘 배운 미분 공식을 잘 이해하면, 다음 시간에 “오차를 줄이는 방향”을 계산할 때 수식이 더 명확하게 다가올 거예요!