적분: 넓이와 누적, 그리고 확률
잘게 쪼개서 더하는 리만 합으로 넓이를 구하고, 속도에서 거리를 되찾는 누적으로서의 적분을 이해해요. 미분과 적분이 서로 반대라는 미적분의 기본 정리, 기본 적분 공식, 그리고 확률 밀도 아래의 넓이가 곧 확률이라는 사실과 몬테카를로 적분까지 다뤄요.
미분이 "지금 이 순간 얼마나 빨리 변하는가"였다면, 적분은 그 반대예요. 변화를 차곡차곡 쌓으면 전체가 얼마인가. 속도계 기록에서 달린 거리를, 시간당 물이 차는 속도에서 수조에 찬 물의 양을 되찾는 계산이에요. 그리고 머신러닝에서 아주 중요한 사실 하나, 확률은 확률 밀도 곡선 아래의 넓이예요. 적분을 이해하면 확률과 통계의 문이 열려요.
넓이를 어떻게 잴까
직사각형의 넓이는 가로 × 세로예요. 그런데 곡선 아래, 가 0부터 1까지인 부분의 넓이는 어떻게 잴까요? 곡선이 휘어 있어서 공식이 없어요.
아이디어는 단순해요. 얇은 직사각형으로 잘게 쪼개서 더한다. 구간을 개로 나누고 각 조각의 높이를 곡선 값으로 잡아요.
이걸 리만 합이라고 해요. 직사각형이 곡선 아래를 완벽히 채우지는 못하지만, 잘게 쪼갤수록 오차가 줄어요.
import numpy as np
for n in (4, 10, 100, 1000):
x = np.linspace(0, 1, n + 1)
area = (x[:-1] ** 2).sum() / n # 왼쪽 끝 높이로 만든 직사각형들
print(n, round(area, 6))
4 0.21875
10 0.285
100 0.32835
1000 0.332834
을 키울수록 에 다가가요. 미분에서 간격 를 0으로 보냈듯, 여기서는 조각의 폭을 0으로 보내는 극한을 취해요. 그 극한이 정적분이에요.
기호 는 합(Sum)의 S를 길게 늘인 모양이고, 는 무한히 얇은 폭이에요. " 아주 얇은 폭"을 모두 더한다는 뜻이 기호에 그대로 들어 있어요.
부호 있는 넓이
곡선이 축 아래로 내려가면 그 부분은 음수로 더해져요. 그래서 정적분은 정확히는 "부호 있는 넓이"예요. 예를 들어 이에요. 위로 볼록한 부분과 아래로 볼록한 부분이 상쇄되니까요.
누적으로서의 적분
첫 미분 강의의 자동차를 다시 불러올게요. 위치가 이면 속도는 였어요. 이번엔 반대로 속도만 알고 있다면 3초 동안 간 거리는?
짧은 시간 동안 간 거리는 대략 "속도 × 시간"이에요. 이걸 0초부터 3초까지 모두 더하면
과 정확히 같아요. 속도 그래프 아래의 넓이가 간 거리예요. 변화율을 적분하면 전체 변화량이 돼요.
- 시간당 강수량을 하루 동안 적분 → 하루 강수량
- 순간 전력(와트)을 한 달 동안 적분 → 전력 사용량(킬로와트시)
- 서버의 초당 요청 수를 하루 동안 적분 → 하루 총 요청 수
미적분의 기본 정리
위 예에서 우연이 아닌 사실을 봤어요. 넓이(적분)를 구하는 데 도함수의 "반대"가 쓰였어요. 이것이 미적분학 전체에서 가장 중요한 정리예요.
미분하면 가 되는 함수 (원시 함수)를 찾아서, 양 끝의 값 차이를 구하면 넓이가 돼요. 무한히 많은 직사각형을 더하는 일이, 함수 값 두 번 빼는 일로 바뀌는 마법 같은 정리예요. 미분과 적분은 서로를 되돌리는 연산이에요.
의 원시 함수는 이에요(미분하면 이죠). 그래서
리만 합으로 힘들게 다가갔던 값이 한 줄에 나와요.
기본 적분 공식
미분 공식을 거꾸로 읽으면 돼요. 는 적분 상수예요(상수는 미분하면 사라지니, 원시 함수는 상수만큼의 차이를 빼고 같아요).
| 함수 | 원시 함수 |
|---|---|
| () | |
미분은 규칙만 따르면 언제나 계산되지만, 적분은 그렇지 않아요. 처럼 간단해 보이는 함수도 원시 함수를 익숙한 함수들로 쓸 수 없어요. 그래서 실무에서는 숫자로 근사하는 수치 적분을 많이 써요.
확률은 넓이다
이 강의에서 가장 중요한 부분이에요.
확률 밀도 함수
키, 시간, 온도처럼 연속적인 값의 확률은 특정 값 하나가 아니라 구간으로 말해요. "키가 정확히 170.000...cm일 확률"은 0이에요. 대신 "170cm에서 175cm 사이일 확률"은 의미가 있죠.
연속 확률 변수는 확률 밀도 함수 로 표현하고, 구간의 확률은 그 아래 넓이예요.
모든 경우를 합친 확률은 1이니, 밀도 곡선 아래 전체 넓이는 항상 1이에요.
정규 분포
자연과 사회의 수많은 측정값이 종 모양의 정규 분포를 따라요. 평균 0, 표준편차 1인 표준 정규 분포의 밀도는
앞의 은 전체 넓이를 정확히 1로 맞추려고 붙은 숫자예요. 이 함수의 원시 함수는 쓸 수 없으니 수치 적분으로 구해 볼게요.
import math
pdf = lambda z: np.exp(-z ** 2 / 2) / math.sqrt(2 * math.pi)
for k in (1, 2, 3):
z = np.linspace(-k, k, 100001)
print(k, round(np.trapezoid(pdf(z), z), 4))
1 0.6827
2 0.9545
3 0.9973
평균에서 표준편차 1개 안에 약 68%, 2개 안에 약 95%, 3개 안에 99.7%가 들어 있어요. 통계에서 자주 듣는 68-95-99.7 규칙이 바로 이 넓이들이에요. (넘파이 버전이 낮아 trapezoid가 없으면 np.trapz를 쓰세요.)
기댓값도 적분
평균(기댓값)은 "값 × 그 값의 확률"을 모두 더한 거예요. 연속이면 합이 적분이 돼요.
머신러닝의 손실 함수도 사실 "모든 가능한 데이터에 대한 오차의 기댓값"이라는 적분이에요. 우리는 그 적분을 직접 계산할 수 없어서, 가진 데이터들의 평균으로 근사해요. 이 생각이 다음에 나올 몬테카를로 방법이에요.
몬테카를로 적분: 무작위로 넓이 재기
넓이를 재는 전혀 다른 방법이 있어요. 한 변이 2인 정사각형 안에 무작위로 점을 마구 찍고, 그중 반지름 1인 원 안에 떨어진 비율을 세는 거예요.
rng = np.random.default_rng(0)
pts = rng.uniform(-1, 1, size=(1_000_000, 2))
inside = (pts ** 2).sum(axis=1) <= 1
print(4 * inside.mean()) # 3.141576
점 100만 개로 원주율을 소수 넷째 자리 가까이 맞혔어요. 이 방법은 차원이 높아져도 똑같이 쓸 수 있어서, 수백 차원짜리 적분이 필요한 물리 시뮬레이션, 금융 위험 계산, 그리고 머신러닝의 확률 모델에서 핵심 도구로 쓰여요. 강화학습이 "직접 해 보고 평균을 내는" 것도 같은 정신이에요.
실습
- 를 원시 함수로 계산하고, 리만 합 코드로 확인하세요.
- 평균 대기 시간이 10분인 지수 분포의 밀도는 ()이에요. 5분 안에 차례가 올 확률을 수치 적분으로 구해 보세요. (답은 )
- 몬테카를로 코드에서 점의 개수를 100, 1만, 100만으로 바꾸며 오차가 어떻게 줄어드는지 보세요. 점을 100배 늘리면 오차는 대략 몇 배 줄어드나요?
자주 하는 실수
- 적분 상수 빼먹기. 정적분이 아닌 원시 함수를 쓸 때는 를 붙여야 해요.
- 확률 밀도 값을 확률로 읽기. 밀도는 1보다 클 수도 있어요. 확률은 넓이예요.
- 연속 변수에서 한 점의 확률 묻기. 연속 확률 변수에서 정확히 한 값의 확률은 0이에요.
- 수치 적분을 너무 성기게 하기. 구간을 몇 개로 나눴는지에 따라 정확도가 크게 달라져요.
점검 문제
- 는?
- 속도 그래프 아래의 넓이는 무엇을 뜻하나요?
- 확률 밀도 함수 아래의 전체 넓이는?
- 표준 정규 분포에서 와 사이의 확률은 대략?
- 몬테카를로 방법에서 점을 4배 늘리면 오차는 대략 어떻게 될까요?
정답
- 의 차이니
- 그 시간 동안 이동한 거리(위치의 변화량)예요.
- 1이에요.
- 약 95%(0.9545)예요.
- 오차는 점 개수의 제곱근에 반비례해서, 4배 늘리면 대략 절반으로 줄어요. 그래서 100배 늘리면 약 10분의 1이 돼요.
다음 강의
미적분 트랙의 마지막은 최적화예요. 지금까지 배운 미분, 그래디언트, 역전파를 모두 모아, 손실을 가장 작게 만드는 방법을 제대로 배워요. 학습률, 확률적 경사 하강법, 모멘텀, 그리고 요즘 가장 많이 쓰는 Adam까지 직접 비교해 봐요.