순진한 뇌를 깨는 질문
빨리: 1과 2 사이에 정수가 몇 개? 0개. 없음. 쉬움.
이번엔: 1과 2 사이에 실수 가 몇 개? 무한대. 1.1, 1.01, 1.001, 1.000000001, 1.99999999999999... 끝이 없어. 어떤 두 실수 사이에도 무한히 더 많은 실수가 있어.
이게 연속성이 너한테 사주는 것이고, 연속성이 너한테 청구하는 것이야. 아날로그 세상은 연속적. 연속적 = 무한. 무한은 8GB RAM 에 안 들어가.
그럼 어떻게 굴러가?
현실과 상호작용하는 모든 시스템 — 너의 눈, 귀, 디지털 카메라, 신경망 — 이 같은 문제를 같은 방식으로 풀어: discretize. 무한 연속 신호를 가져다가 유한하고 다룰 만한 수의 샘플로 자르기. 정밀도 좀 잃기. 쓸모 있을 만큼 챙기기.
네 귀는 20Hz~20,000Hz 사이 모든 주파수를 처리하지 않아. 샘플해. 네 눈은 모든 색을 분해하지 않아 — 샘플해. 네 기억은 연속 비디오가 아니야 — 손실 압축된 근사야. 뇌가 수백만 년에 걸쳐 이 트릭 배웠어. 컴퓨터가 뇌한테서 배웠어.
왜 AI 가 신경 써?
네 컴퓨터의 모든 부동소수점 숫자가 discretization 이야. float32 는 32비트로 어떤 실수든 근사 — 약 7자리 십진 정밀도. 보통은 괜찮아. 가끔은 (자세한 건 로그 트랙) 작은 확률들 충분히 곱하면 결과가 0으로 반올림 — numerical underflow, 우주가 너의 숫자가 sample 이지 truth 가 아니라는 걸 잊은 죄로 처벌하는 거야.
피파의 고백
scipy.integrate 한 호출로 폭발해. 무한은 시적인 장식이 아니라 실제 엔지니어링 hazard 야.
import math
total = 0.0 for _ in range(10): total += 0.1
print(total) # 0.9999999999999999 print(total == 1.0) # False print(math.isclose(total, 1.0)) # True (허용오차 적용)
컴퓨터는 0.1을 0.1로 인지하지 못하고 근사함, 따라서 부동소수점을 다룰 때에는 오차를 감안해야함