[AI Day 03] 기울기와 미분의 시작 - 순간 기울기는 어떻게 구할까?
들어가며
PyTorch를 공부하다 보면 gradient, backward(), optimizer 같은 개념을 자주 만나게 된다.
이 기능들은 모두 모델의 오차를 줄이기 위해 미분을 사용한다. 하지만 미분 공식을 외우기 전에 먼저 이해해야 할 개념이 있다.
바로 변화량과 기울기다.
오늘은 미분이 어떤 원리에서 시작되는지 이해하기 위해 다음 내용을 공부했다.
- 변화량
- 기울기
- 직선과 곡선의 차이
- 평균 기울기와 순간 기울기
h의 의미- 극한
x²을 미분하면 왜2x가 되는지- Python을 이용한 기울기 계산
- AI에서 미분이 사용되는 이유
1. 변화량이란?
다음 두 점이 있다고 생각해 보자.
1
2
(1, 2)
(3, 6)
첫 번째 점에서 두 번째 점으로 이동하면 x는 1에서 3으로 변한다.
1
Δx = 3 - 1 = 2
y는 2에서 6으로 변한다.
1
Δy = 6 - 2 = 4
여기서 Δ는 델타라고 읽으며, 어떤 값이 얼마나 변했는지를 의미한다.
1
2
Δx = x의 변화량
Δy = y의 변화량
2. 기울기란?
기울기는 x가 변했을 때 y가 얼마나 변했는지를 나타낸다.
계산 방법은 다음과 같다.
1
2
기울기 = y의 변화량 / x의 변화량
= Δy / Δx
앞의 두 점을 이용해 계산하면 다음과 같다.
1
2
3
4
5
Δx = 2
Δy = 4
기울기 = 4 / 2
= 2
기울기가 2라는 것은 x가 1 증가할 때 y가 2 증가한다는 뜻이다.
기울기 공식을 처음 보면 Δx / Δy로 헷갈릴 수 있지만, 정확한 순서는 다음과 같다.
1
기울기 = Δy / Δx
우리가 알고 싶은 것은 x가 변할 때 y가 얼마나 변했는지이기 때문이다.
3. 직선의 기울기는 왜 항상 같을까?
다음 함수를 살펴보자.
1
y = 2x
값을 표로 나타내면 다음과 같다.
| x | y |
|---|---|
| 0 | 0 |
| 1 | 2 |
| 2 | 4 |
| 3 | 6 |
각 구간에서 x는 1씩 증가하고 y는 2씩 증가한다.
1
2
3
4
5
x: 0 → 1
y: 0 → 2
x: 1 → 2
y: 2 → 4
모든 구간에서 다음 값이 같다.
1
기울기 = 2 / 1 = 2
직선에서 x와 y가 변하지 않는 것이 아니다.
x와 y는 계속 변하지만, 변화하는 비율이 항상 일정하기 때문에 어느 위치에서나 기울기가 같다.
4. 곡선은 위치마다 기울기가 다르다
이번에는 다음 함수를 살펴보자.
1
y = x²
| x | y |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 4 |
| 3 | 9 |
| 4 | 16 |
y의 증가량은 다음과 같다.
1
2
3
4
0 → 1 : 1 증가
1 → 4 : 3 증가
4 → 9 : 5 증가
9 → 16 : 7 증가
직선과 다르게 y의 증가량이 계속 변한다.
따라서 y = x²과 같은 곡선은 위치에 따라 기울기가 달라진다.
5. 평균 기울기와 순간 기울기
y = x² 위의 두 점을 선택해 보자.
1
2
(1, 1)
(3, 9)
두 점 사이의 기울기는 다음과 같다.
1
2
3
4
5
Δx = 3 - 1 = 2
Δy = 9 - 1 = 8
기울기 = 8 / 2
= 4
하지만 이 값은 x가 1에서 3으로 이동한 전체 구간의 기울기다.
곡선에서는 위치마다 기울기가 다르기 때문에, 두 점 사이에서 계산한 값은 해당 구간의 평균 기울기라고 볼 수 있다.
그렇다면 정확히 x가 2인 한 지점의 기울기는 어떻게 구할 수 있을까?
6. 한 점의 기울기에 두 점이 필요한 이유
x가 2일 때 함수값은 다음과 같다.
1
2² = 4
따라서 점은 다음과 같다.
1
(2, 4)
하지만 점 하나만으로는 기울기를 계산할 수 없다.
기울기는 변화량을 이용하기 때문에 시작점과 도착점, 즉 두 점이 필요하다.
같은 점끼리 계산하면 다음과 같다.
1
2
(4 - 4) / (2 - 2)
= 0 / 0
분모가 0이 되기 때문에 계산할 수 없다.
그래서 기준점 옆에 다른 점을 하나 두고 두 점 사이의 기울기를 계산해야 한다.
7. h란 무엇인가?
기준점에서 옆의 점까지 x가 이동한 거리를 h라고 표현한다.
기준점이 x라면 옆의 점은 다음과 같다.
1
x + h
기준점이 x = 2일 때 h에 따라 옆의 점은 다음처럼 달라진다.
| h | x + h |
|---|---|
| 1 | 3 |
| 0.1 | 2.1 |
| 0.01 | 2.01 |
| 0.001 | 2.001 |
h가 작아질수록 옆의 점은 기준점에 가까워진다.
h를 줄이는 이유는 결과를 정수에 가깝게 만들기 위해서가 아니다.
두 점을 최대한 가깝게 만들어 한 지점의 순간 기울기를 구하기 위해서다.
8. x = 2에서 순간 기울기 구하기
함수는 다음과 같다.
1
y = x²
기준점은 x = 2이고 함수값은 4다.
h를 줄여가며 기울기를 계산해 보자.
h = 1
1
2
3
4
5
옆의 점 = 2 + 1 = 3
기울기 = (3² - 2²) / 1
= (9 - 4) / 1
= 5
h = 0.1
1
2
3
기울기 = (2.1² - 2²) / 0.1
= (4.41 - 4) / 0.1
= 4.1
h = 0.01
1
2
기울기 = (2.01² - 2²) / 0.01
= 4.01
h = 0.001
1
2
기울기 = (2.001² - 2²) / 0.001
= 4.001
결과를 정리하면 다음과 같다.
| h | 기울기 |
|---|---|
| 1 | 5 |
| 0.1 | 4.1 |
| 0.01 | 4.01 |
| 0.001 | 4.001 |
h가 작아질수록 기울기는 4에 가까워진다.
1
5 → 4.1 → 4.01 → 4.001 → 4
따라서 y = x²에서 x = 2인 순간의 기울기는 4라고 할 수 있다.
9. h를 정확히 0으로 넣을 수 없는 이유
두 점 사이의 기울기는 다음 식으로 표현할 수 있다.
1
(f(x + h) - f(x)) / h
여기에 h = 0을 넣으면 다음과 같다.
1
2
(f(x) - f(x)) / 0
= 0 / 0
분모가 0이 되기 때문에 계산할 수 없다.
그래서 h를 정확히 0으로 만들지는 않고, 0에 한없이 가깝게 만든다.
1
2
3
4
5
1
0.1
0.01
0.001
0.0001
이처럼 어떤 값을 특정 값에 한없이 가깝게 보내는 생각을 극한이라고 한다.
10. x²을 미분하면 왜 2x일까?
함수를 다음과 같이 두자.
1
f(x) = x²
두 점 사이의 기울기는 다음과 같다.
1
(f(x + h) - f(x)) / h
함수를 대입하면 다음과 같다.
1
((x + h)² - x²) / h
(x + h)²을 전개하면 다음과 같다.
1
2
(x + h)²
= x² + 2xh + h²
원래 식에 대입한다.
1
(x² + 2xh + h² - x²) / h
x²과 -x²이 사라진다.
1
(2xh + h²) / h
분자에서 h를 묶는다.
1
h(2x + h) / h
h를 약분하면 다음과 같다.
1
2x + h
이제 h를 0에 한없이 가깝게 만들면 h 부분이 사라지고 다음 값이 남는다.
1
2x
따라서 다음과 같이 정리할 수 있다.
1
2
f(x) = x²
f'(x) = 2x
11. 미분 결과가 숫자 하나가 아닌 이유
x²을 미분한 결과는 숫자 하나가 아니라 2x다.
그 이유는 곡선의 기울기가 위치마다 달라지기 때문이다.
| x | 기울기 2x |
|---|---|
| 0 | 0 |
| 1 | 2 |
| 2 | 4 |
| 3 | 6 |
| 4 | 8 |
| 5 | 10 |
2x는 모든 위치에서 기울기를 구할 수 있는 새로운 함수다.
예를 들어 x = 5일 때 원래 함수값은 다음과 같다.
1
5² = 25
하지만 기울기는 미분한 함수에 x = 5를 넣어야 한다.
1
2 × 5 = 10
따라서 다음 두 값을 구분해야 한다.
1
2
함수값: 25
기울기: 10
12. Python으로 확인하기
이번에는 Python을 사용해 h가 작아질수록 기울기가 실제 미분값에 가까워지는지 확인했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def square(x):
return x ** 2
def calculate_slope(x, h):
y_change = square(x + h) - square(x)
x_change = h
return y_change / x_change
def main():
x = float(input("기준 x를 입력하세요: "))
h_values = [1.0, 0.1, 0.01, 0.001]
for h in h_values:
slope = calculate_slope(x, h)
print(f"h = {h}일 때 기울기: {round(slope, 10)}")
derivative = 2 * x
print(f"미분 공식으로 계산한 기울기: {derivative}")
if __name__ == "__main__":
main()
x에 3을 입력하면 다음과 같은 결과가 나온다.
1
2
3
4
5
h = 1.0일 때 기울기: 7.0
h = 0.1일 때 기울기: 6.1
h = 0.01일 때 기울기: 6.01
h = 0.001일 때 기울기: 6.001
미분 공식으로 계산한 기울기: 6.0
h가 작아질수록 계산 결과가 6에 가까워지는 것을 확인할 수 있다.
13. 오늘 헷갈렸던 부분
오늘 학습하면서 특히 헷갈렸던 부분은 다음과 같다.
기울기 공식의 순서
1
2
잘못 이해한 식: Δx / Δy
정확한 식: Δy / Δx
기울기는 x의 변화에 대한 y의 변화 비율이다.
직선의 기울기가 일정한 이유
직선에서 x와 y가 변하지 않는 것이 아니다.
1
2
x와 y가 변하지 않는다: X
x와 y의 변화 비율이 일정하다: O
h를 작게 만드는 이유
h를 작게 만드는 것은 정수에 가까워지기 위해서가 아니다.
두 점을 가깝게 만들어 순간 기울기에 가까워지기 위해서다.
함수값과 기울기
1
2
x = 5일 때 함수값: 25
x = 5일 때 기울기: 10
원래 함수와 미분한 함수를 구분해야 한다.
14. AI에서 미분이 필요한 이유
딥러닝 모델에는 학습을 통해 조정되는 가중치가 있다.
가중치를 바꾸면 모델의 예측 결과가 달라지고, Loss도 달라진다.
1
2
3
4
5
가중치 변화
↓
예측 결과 변화
↓
Loss 변화
AI 학습에서 중요한 것은 다음 질문이다.
가중치를 조금 바꾸었을 때 Loss가 얼마나 변하는가?
이것은 결국 기울기를 구하는 문제다.
1
2
3
x = 가중치
y = Loss
기울기 = 가중치 변화에 따른 Loss의 변화 정도
기울기를 알면 Loss를 줄이기 위해 가중치를 어느 방향으로 움직여야 하는지 판단할 수 있다.
PyTorch의 다음 코드는 이러한 미분값을 자동으로 계산한다.
1
loss.backward()
아직 backward()를 직접 사용하지는 않았지만, 이 함수가 계산하는 gradient가 결국 각 가중치에 대한 Loss의 기울기라는 것을 이해할 수 있었다.
오늘 배운 내용 정리
오늘의 핵심 내용은 다음과 같다.
Δ는 변화량을 의미한다.- 기울기는
Δy / Δx로 계산한다. - 직선은 변화 비율이 일정하므로 기울기가 항상 같다.
- 곡선은 위치에 따라 기울기가 달라진다.
- 한 점의 기울기를 구하려면 옆의 점이 필요하다.
- h를 작게 만들수록 두 점이 가까워진다.
- 두 점이 가까워질수록 평균 기울기가 순간 기울기에 가까워진다.
- h는 정확히 0으로 만들 수 없으므로 극한을 사용한다.
x²을 미분하면2x가 된다.- 함수값과 기울기는 서로 다른 값이다.
- AI에서는 미분을 이용해 Loss가 감소하는 방향을 찾는다.
마무리
처음에는 미분을 복잡한 공식이라고만 생각했다.
하지만 오늘 공부를 통해 미분은 갑자기 등장한 계산법이 아니라, 두 점 사이의 기울기를 점점 더 정확하게 구하는 과정에서 시작된다는 것을 알게 되었다.
한 문장으로 정리하면 다음과 같다.
미분은 두 점 사이의 평균 기울기를 계산한 뒤, 두 점을 한없이 가깝게 만들어 한 지점의 순간 기울기를 구하는 과정이다.
다음 학습에서는 x³, 일차함수, 상수와 같은 여러 함수를 직접 미분해 보면서 미분 공식이 어떻게 만들어지는지 더 자세히 알아볼 예정이다.