
모델을 학습 할 때 손실함수를 사용해서 모델이 얼마나 틀렸는지를 알 수 있지만 어떻게 개선해야하는지에 대해서는 알지 못합니다. 손실을 줄이는 방법은 모델의 가중치(Weight)와 편향(Bias)의 수정을 통해 줄일 수 있습니다. 이 때 어떤 방향으로 수정할지 결정하는 핵심 도구가 "미분"입니다.
미분을 통해 손실함수가 줄어드는 방향을 찾아 가중치를 업데이트할 수 있습니다. 하지만 신경망의 손실 함수를 수학적인 방식으로 미분하는 것은 어렵기 때문에 컴퓨터를 이용하여 수치적으로 근사하는 방법인 수치 미분을 사용합니다.
📌 신경망에서 수치 미분이 필요한 이유
신경망 학습의 목표는 손실 함수를 최소화하는 최적의 가중치를 찾는 것입니다.
이를 위해 경사 하강법(Gradient Descent) 같은 최적화 알고리즘을 사용합니다.
하지만 경사 하강법을 쓰려면 손실 함수에 대한 미분(기울기)이 필요합니다.
✅ 수치 미분(Numerical Differentiation)이란?
- 함수의 미분값을 수학 공식으로 구하지 않고 컴퓨터를 이용해 수치적으로 근사하는 방법
- 특정한 작은 값 를 설정하여 미분을 근사적으로 계산함
- 신경망의 손실 함수를 미분하기 어려운 경우 유용하게 사용됨
✅ 수치 미분을 활용하는 이유
- 복잡한 신경망 구조에서도 미분을 쉽게 계산할 수 있음
- 미분 공식을 직접 구하기 어려운 경우에도 손실을 줄이는 방향을 찾을 수 있음
- 최적화 과정(예: 경사 하강법)에서 활용되어 손실 함수의 최소값을 찾는 데 도움을 줌
📌 수치 미분의 기본 개념
수치 미분은 다음과 같은 방식으로 근사적으로 계산됩니다.


✅ 왜 h를 보통 10^-4로 사용하는데 왜 이렇게 설정할까?
너무 크면 근사값의 정확도가 떨어지고 너무 작으면 컴퓨터 연산 과정에서 반올림 오차(Rounding Error)가 발생할 수 있으며, 10^-4 정도가 해석적 미분값과 가장 근사한 결과를 제공함
📌 이론적으로 미분 개념을 이해하기위한 예시 코드
이 코드에서 수치 미분을 사용하여 기울기를 구하고 접선을 시각적으로 확인하는 과정은 이론적으로 미분 개념을 이해하기 위한 학습용 코드이며, 실제로 딥러닝이나 신경망을 학습할 때는 수치 미분이 아니라 오차 역전파(Backpropagation)와 해석적 미분(Analytical Differentiation)을 사용합니다.
# coding: utf-8
# 1️⃣ 라이브러리 불러오기
import numpy as np
import matplotlib.pylab as plt
# 2️⃣ 수치 미분을 수행하는 함수
def numerical_diff(f,x): # 중심 차분을 사용해 미분값을 근사적으로 계산
h = 1e-4 # 0.0001
return (f(x+h) - f(x-h)) / (2*h)
# ✔ 특정 함수 f(x)의 미분값을 수치적으로 구하는 함수
# 3️⃣ 미분할 함수 정의
def function_1(x):
return 0.001*x**2 + 0.1*x
# 이차 함수 형태로 곡선 그래프를 가지며 특정 x값에서 미분값(기울기)를 구할 예정
# 4️⃣ 특정 지점에서 접선을 구하는 함수
def tangent_line(f,x):
d = numerical_diff(f,x) # 해당 지점에서 기울기 계산
print(d) # 기울기 출력
y = f(x) - d*x # 접선의 절편 계산
return lambda t: d*t +y # 기울기 d와 절편 y를 사용한 직선 방정식 반환
# ✔ 특정 x에서의 접선을 구하고 그래프에 표시할 수 있도록 반환하는 함수
# 5️⃣ 그래프를 위한 데이터 생성
x = np.arange(0.0, 20.0, 0.1) # x 범위를 0~20까지 설정
y = function_1(x) # 위에서 정의한 함수 f(x)에 x 값들을 대입하여 y 값 계산
plt.xlabel("x") # x축 라벨 설정
plt.ylabel("f(x)") # y축 라벨 설정
# 6️⃣ 특정 지점에서 접선 구하기
tf = tangent_line(function_1, 5) # x=5에서의 접선 구하기
y2 = tf(x) # 접선 방정식 tf를 x 값들에 적용하여 y 값 계산
# ✔ 원래 함수 그래프와 함께 접선을 표시할 수 있음
# 7️⃣ 그래프 출력
plt.plot(x, y)
plt.plot(x, y2)
plt.show()

📌 이 코드가 실제로 사용되지 않는 이유
1️⃣ 수치 미분은 연산량이 너무 많음
- 코드에서 numerical_diff(f, x) 함수는 특정한 x값에서 작은 변화량을 주면서 차이를 계산하는 방식으로 미분을 구함
- 하지만 신경망에서는 수천~수백만 개의 가중치(Weight)를 업데이트해야 하기 때문에 모든 가중치에 대해 이런 방식으로 미분을 구하면 연산량이 너무 커짐
- 따라서 실제 신경망에서는 "오차 역전파(Backpropagation)"를 활용한 해석적 미분을 사용함
2️⃣ 해석적 미분(Analytical Differentiation)이 훨씬 효율적
- 해석적 미분은 수학적으로 정확한 미분값을 한 번에 계산할 수 있는 방법임
- 예를 들어, 함수 f(x) = 0.01x^2 + 0.1x을 직접 미분하면 f′(x) = 0.02x + 0.1로 단순히 미분값을 구할 수 있음
- 반면 수치 미분은 작은 변화량()을 사용해서 근사값을 구하는 방식이므로 연산량도 많고 정확도도 낮을 수 있음
3️⃣ 실제 신경망에서는 자동 미분(Autograd) 사용
- 최신 딥러닝 프레임워크(TensorFlow, PyTorch 등)에서는 자동으로 미분을 계산하는 자동 미분(Autograd) 기능이 내장되어 있음
- 예를 들어, PyTorch에서는 .backward()를 사용하면 자동으로 미분이 계산됨
import torch
x = torch.tensor(5.0, requires_grad=True)
y = 0.01 * x**2 + 0.1 * x
y.backward() # 자동 미분
print(x.grad) # 기울기 출력
- 위의 방식을 통해 수치 미분 없이도 해석적으로 미분값을 자동 계산해줌
🚀 수치 미분은 직관적으로 이해하기 쉽고 어디서나 사용할 수 있는 방법이지만 계산 비용이 크기 때문에 실제 학습에서는 "오차 역전파(Backpropagation)"를 이용한 해석적 미분을 사용합니다. (추후 업로드 예정)
'📚 [Archive] CS & AI 스터디 > [STUDY] 인공지능 🤖' 카테고리의 다른 글
| [신경망 학습 알고리즘] 순전파 역전파 (0) | 2025.02.05 |
|---|---|
| [미적분학] 일변수 미분 vs 다변수 미분(편미분) (0) | 2025.02.05 |
| [모델 평가/학습 목표] 손실함수(Loss Function) (0) | 2025.02.05 |
| [모델 평가/학습 목표] 주요 손실 함수 정리 (2) | 2025.02.05 |
| [인공지능개요] 인공지능 학습 방식 (3) | 2025.02.05 |