극한과 미분: 변화율을 재는 도구
평균 변화율과 순간 변화율의 차이, 극한이라는 생각, 도함수의 정의와 접선의 기울기를 익혀요. 파이썬으로 미분값을 직접 근사해 보고, 미분이 머신러닝에서 "어느 쪽으로 가야 오차가 줄어드는가"를 알려 주는 나침반이 되는 이유를 봐요.
자동차 계기판의 속도계는 "지금 이 순간"의 속도를 보여 줘요. 그런데 생각해 보면 이상해요. 속도는 "거리 ÷ 시간"인데, 한 순간에는 시간이 흐르지 않으니 0 ÷ 0이 되잖아요. 이 역설을 푸는 도구가 극한이고, 극한으로 구한 순간 변화율이 미분이에요. 미분은 머신러닝에서 "지금 파라미터를 어느 쪽으로 조금 움직이면 오차가 줄어드는가"를 알려 주는 나침반이에요. AI가 스스로 학습하는 원리의 출발점이죠.
평균 변화율
정지 상태에서 출발한 자동차가 초 동안 미터를 간다고 해 볼게요.
| 시간 (초) | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 거리 (m) | 0 | 5 | 20 | 45 | 80 |
2초에서 4초 사이의 평균 속도는 간 거리를 걸린 시간으로 나누면 돼요.
일반적으로 가 에서 로 갈 때 함수의 평균 변화율은
그래프로 보면 두 점을 잇는 직선(할선)의 기울기예요.
순간 변화율: 간격을 줄여 가기
그럼 정확히 3초일 때의 속도는? 3초와 그 바로 뒤 시점 사이의 평균 속도를 구하되, 간격 를 점점 줄여 봐요.
| 간격 | 3초에서 초까지 평균 속도 |
|---|---|
| 1 | 35 |
| 0.1 | 30.5 |
| 0.01 | 30.05 |
| 0.001 | 30.005 |
를 0에 가깝게 할수록 평균 속도가 30에 한없이 가까워져요. 이것이 3초의 순간 속도예요. 을 직접 넣으면 0 ÷ 0이 되지만, 를 0에 가까이 가져갈 때 값이 어디로 향하는지는 분명하게 말할 수 있어요. 이 "향하는 값"이 극한이에요.
극한이라는 생각
은 "가 에 한없이 가까워지면 가 에 한없이 가까워진다"는 뜻이에요. 중요한 점은 에서 실제로 무슨 일이 일어나는지는 상관없다는 거예요. 가까이 갈 때의 경향만 봐요.
을 넣으면 0 ÷ 0이지만, 이면 이니까 가 1에 가까워지면 값은 2에 가까워져요. 극한은 2예요.
연속
이면, 즉 가까이 갈 때의 값과 실제 값이 같으면 함수가 에서 연속이라고 해요. 그래프를 펜을 떼지 않고 그릴 수 있다는 뜻이에요. 대부분의 자연스러운 함수는 연속이고, 미분은 연속인 곳에서만 가능해요.
도함수의 정의
함수 의 에서의 순간 변화율을 미분계수라고 하고, 이걸 모든 에 대해 돌려주는 함수를 도함수라고 해요.
표기는 여러 가지예요. , , 모두 같은 뜻이에요. 는 "가 아주 조금 변할 때 가 몇 배만큼 변하는가"로 읽으면 직관적이에요.
정의로 직접 구해 보기
의 도함수를 구해 볼게요.
이면 예요. 그래서 이고, 에서의 기울기는 6이에요. 자동차 예제의 은 도함수가 이니 3초의 속도는 30 m/s로 앞의 표와 정확히 맞아요.
그림으로 보면: 접선의 기울기
할선의 두 점을 한없이 가깝게 붙이면 곡선에 살짝 닿는 접선이 돼요. 미분계수는 그 접선의 기울기예요. 곡선을 아주 크게 확대하면 거의 직선처럼 보이는데, 그 직선의 기울기라고 생각해도 돼요. 이 "확대하면 직선"이라는 관점이 아주 중요해요.
조금 움직였을 때의 변화를 직선으로 근사하는 이 식이 선형 근사이고, 경사 하강법이 바로 이 식에서 나와요.
파이썬으로 미분 근사하기
정의를 그대로 코드로 옮기면 미분값을 숫자로 구할 수 있어요.
def f(x):
return x ** 2
def derivative(f, x, h=1e-5):
return (f(x + h) - f(x - h)) / (2 * h) # 양쪽에서 재는 중앙 차분
print(derivative(f, 3)) # 6.000000000039306
를 한쪽으로만 잡는 것보다 와 양쪽을 쓰는 중앙 차분이 훨씬 정확해요. 이 방법을 수치 미분이라고 하고, 딥러닝에서 직접 짠 미분 코드가 맞는지 검사할 때(기울기 검사) 지금도 써요.
주의: h를 너무 작게 하면 를
1e-15처럼 아주 작게 잡으면 오히려 결과가 엉망이 돼요. 컴퓨터의 실수 계산 오차(프로그래밍 기초의 0.1 + 0.2 문제) 때문에, 거의 같은 두 수를 빼는 순간 유효 숫자가 사라져요. 수치 미분에서는1e-5정도가 무난해요.
미분값이 알려 주는 것
부호: 오르막인가 내리막인가
- : 그 지점에서 함수가 증가해요. 를 늘리면 값이 커져요.
- : 함수가 감소해요. 를 늘리면 값이 작아져요.
- : 평평해요. 꼭대기, 바닥, 또는 잠깐 쉬어 가는 곳이에요.
크기: 얼마나 가파른가
미분값의 절댓값이 크면 가파르고, 작으면 완만해요. 를 조금 움직였을 때 가 얼마나 민감하게 반응하는지를 알려 줘요.
머신러닝의 나침반
모델의 오차를 나타내는 손실 함수를 라고 해 볼게요. 는 모델의 파라미터예요. 우리는 손실을 가장 작게 만드는 를 찾고 싶어요.
산 위에서 짙은 안개 때문에 앞이 안 보인다고 상상해 보세요. 할 수 있는 건 발밑의 경사를 느끼는 것뿐이에요. 내리막 방향으로 한 걸음, 또 한 걸음 가다 보면 결국 골짜기에 닿겠죠. 미분값이 바로 그 "발밑의 경사"예요.
- 이면 를 늘릴수록 손실이 커지니 를 줄여요.
- 이면 를 늘려요.
둘을 합치면 "미분값의 반대 방향으로 조금 움직인다"가 돼요.
(에타)는 한 걸음의 크기, 학습률이에요. 이것이 경사 하강법의 전부예요. 딥러닝 모델이 수십억 개의 파라미터를 가져도, 하는 일은 각 파라미터에 대해 이 한 줄을 수없이 반복하는 거예요.
def loss(w):
return (w - 4) ** 2 + 1 # w = 4에서 가장 작은 손실
w = 0.0
for step in range(30):
grad = derivative(loss, w)
w = w - 0.1 * grad
print(round(w, 4)) # 3.995 4에 가까워졌어요
손실 함수의 바닥이 어디인지 모르는 상태에서 시작했는데, 경사만 따라 내려가서 답 근처에 도착했어요. 이 과정을 여러 변수로 넓히는 것이 다음 다음 강의의 그래디언트, 그 경사를 효율적으로 구하는 것이 역전파예요.
미분할 수 없는 곳
연속이어도 미분할 수 없는 곳이 있어요. 는 에서 뾰족하게 꺾여 있어서, 왼쪽에서 재면 기울기 -1, 오른쪽에서 재면 1이라 하나로 정해지지 않아요.
딥러닝에서 가장 많이 쓰는 활성화 함수 ReLU()도 0에서 꺾여 있어요. 실제로는 0에서의 미분값을 그냥 0(또는 1)으로 정해 버려요. 정확히 0이 나올 일이 거의 없고, 그렇게 해도 학습이 잘 되기 때문이에요. 수학의 엄밀함과 공학의 실용성이 만나는 대표적인 장면이에요.
연습 문제
- 의 1에서 4까지의 평균 변화율은?
- 정의를 이용해 의 도함수를 구하세요.
- 는?
- 손실 함수의 미분값이 -3이고 학습률이 0.1이면, 경사 하강법은 를 어느 쪽으로 얼마나 움직일까요?
- 위의
derivative함수로 의 에서의 미분값을 구해 보세요. 예상값은 얼마인가요?
정답
- 직선이라 어디서나 기울기가 같아요.
- 이고, 이면
- 이니 4
- 이니 를 0.3만큼 늘려요.
- 약 12예요. 다음 강의의 미분 규칙으로 보면 예요.
다음 강의
매번 극한으로 도함수를 구하는 건 번거로워요. 다음 강의에서는 거듭제곱, 곱, 지수, 로그 함수를 바로 미분하는 규칙들을 익히고, 도함수로 함수의 모양(언제 커지고, 언제 가장 크고 작은지)을 읽는 법을 배워요.