정수와 실수 사이의 간격
1과 2 사이에 정수는 없어. 하지만 실수는 무한히 많아. 1.1과 1.01만 있는 게 아니라, 서로 다른 두 실수를 아무리 가깝게 골라도 그 사이에서 또 다른 실수를 찾을 수 있어.
수학의 실수는 연속체를 이루지만 컴퓨터의 메모리는 유한해. 8GB 메모리 안에 모든 실수를 하나씩 저장할 수는 없지. 그래서 디지털 시스템은 문제에 필요한 일부 값만 유한한 규칙으로 표현해.
표본화와 양자화
연속 신호를 컴퓨터에 넣을 때는 두 선택이 필요해. 시간이나 공간에서 어느 지점을 읽을지 정하는 표본화, 그리고 읽은 값을 어떤 유한한 단계와 비트로 기록할지 정하는 양자화야. 둘을 뭉뚱그려 이산화라고 부를 수 있지만 잃는 정보의 종류는 달라.
카메라는 유한한 화소에서 빛을 측정하고, 오디오 장치는 정해진 시간 간격으로 압력을 읽어 유한한 비트 깊이로 저장해. 생물의 감각도 유한한 수용기와 신경 신호를 사용하지만 디지털 장치와 똑같은 방식으로 동작한다고 단정할 수는 없어. 공통점은 유한한 시스템이 모든 세부사항을 그대로 보존하지 않는다는 데 있어.
AI에서 왜 중요할까
float32는 부호와 지수, 가수를 합해 32비트로 부동소수점 값을 표현해. 크기에 따라 간격이 달라지고 보통 약 7자리의 십진 유효숫자를 제공하지만 모든 실수를 정확히 담지는 못해. 0.1조차 이진 부동소수점으로는 정확히 표현되지 않아.
아주 작은 확률을 계속 곱하면 표현 가능한 범위 아래로 내려가 0이 되는 언더플로가 생길 수 있고, 큰 값을 다루면 오버플로가 날 수 있어. 혼합정밀도 학습에서는 표현 범위와 반올림 오차가 실제 최적화 동작을 바꾸기도 해.
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로 인지하지 못하고 근사함, 따라서 부동소수점을 다룰 때에는 오차를 감안해야함