자주 하는 실수와 요약
자주 하는 실수
| 실수 | 나온 문제 | 바로잡는 법 |
|---|---|---|
| 국가 번호의 길이를 외우기 편한지로만 봄 | 1 | 짧은 번호 하나가 그 번호로 시작하는 긴 번호를 모두 막는다. 어떤 번호도 다른 번호의 앞부분이 아니어야 끊어 읽힌다 |
| 코드표를 손으로 맞춰 보다 안 되면 더 찾음 | 2 | 크래프트 합 Σ 2^(−ℓ)를 먼저 더한다. 1을 넘으면 어떤 배치로도 안 된다 |
| 예산이 꽉 찬 코드표에 말을 그냥 더하려 함 | 2 | 기존 코드 하나를 한 자리 늘려 둘로 쪼개야 자리가 난다 |
| 합이 1이 아닌 점수로 −log₂를 손실로 씀 | 3 | 크래프트 부등식을 어긴 길이라 실제로 낼 수 없는 코드다. 합으로 나눠 확률로 만든다 |
| 흔한 순서대로 길이를 주면 허프만 코드라고 봄 | 4 | 가장 작은 둘을 합치는 순서로 확인한다. 길이가 같아 보여도 순서가 근거다 |
| 말 하나에 코드 하나로 1비트 아래를 내려 함 | 5, 6 | 정수 코드는 말 하나에 적어도 1비트. 묶거나 산술 코딩으로 글 전체에 코드 하나를 준다 |
| 글자가 많을수록 코드가 길다고 봄 | 8 | 코드 길이는 예측 확률의 곱(구간 폭)이 정한다. 흔한 글자 여섯과 드문 글자 둘이 같은 비트일 수 있다 |
| 압축된 비트열만 있으면 되살릴 수 있다고 봄 | 9 | 받는 사람에게 같은 예측기가 있어야 한다. 그 크기도 비용이다 |
| 보내는 사람과 받는 사람의 예측 확률이 아주 조금 달라도 괜찮다고 봄 | 9 | 칸의 경계가 옮겨지면 그 뒤가 모두 틀린다. 정수 빈도처럼 두 사람이 똑같은 값을 쓴다 |
| 퍼플렉서티를 맞힌 날 수나 정답률로 읽음 | 10 | 「몇 가지 가운데 고르게 헷갈리는 셈인가」. 2^(평균 비트) 또는 e^(평균 nat) |
| nat을 비트로 바꿀 때 ln 2를 곱함 | 11 | nat이 큰 단위다. 비트 = nat ÷ ln 2 |
| 토크나이저가 다른 모델을 토큰당 손실로 견줌 | 12 | 원래 글의 바이트 수로 나눈 바이트당 비트로 비교한다 |
요약
이 장에서 한 일을 정리해 보자. 0과 1로 끊어 읽을 표시 없이 말을 적으려면 어떤 코드도 다른 코드의 앞부분이 아니어야 하고, 그런 코드의 길이는 크래프트 부등식 Σ 2^(−ℓ) ≤ 1을 따른다. 길이 ℓ인 코드는 [0, 1)의 2^(−ℓ)을 차지하므로, 코드 길이를 정하는 일은 확률을 정하는 일과 같다. 확률 p로 나오는 말의 가장 좋은 길이는 −log₂ p이고, 평균 길이가 내려갈 수 있는 가장 낮은 값이 엔트로피다. 정수 길이 가운데서는 가장 작은 둘을 합쳐 가는 허프만 코드가 가장 짧지만, 말 하나에 적어도 1비트를 써서 흔한 말이 많을수록 비트를 버린다.
산술 코딩은 글자마다 예측 확률대로 [0, 1)을 쪼개 글 전체를 구간 하나로 만들고, 그 구간을 가리키는 비트를 낸다. 코드 길이는 예측기가 실제로 온 글자에 준 확률의 −log₂ 합보다 많아야 2비트 길다. 그래서 확률을 내는 것이면 무엇이든 압축기가 되고, 거꾸로 압축기가 매기는 비트는 확률로 읽힌다. 언어 모델의 크로스 엔트로피 손실은 토큰 하나를 적는 nat이고, ln 2로 나누면 비트, 토큰 수 ÷ 바이트 수를 곱하면 바이트당 비트, e의 거듭제곱으로 올리면 퍼플렉서티다. 직접 쓴 빵집 이야기에서 앞 글자를 보는 예측기는 시험 글을 글자당 6.18비트에서 3.95비트까지 줄였고, 친칠라는 글로 배우고도 그림과 소리를 PNG와 FLAC보다 작게 줄였다.
flowchart LR A["예측기<br/>다음 글자의 확률 q"] -- "산술 코딩<br/>구간을 q대로 쪼갠다" --> B["압축기<br/>비트 ≈ Σ −log₂ q"] B -- "크래프트 부등식<br/>q = 2^(−ℓ)" --> A B --> C["손실 = 비트 × ln 2<br/>바이트당 비트로 비교한다"]
막힌 곳
예측을 잘하면 짧게 적을 수 있다는 것은 이제 비트 단위로 말할 수 있지만, 이 장의 두 숫자가 걸린다. 빵집 이야기에서 앞 5글자 예측기는 학습 글을 글자당 0.38비트로 적었지만 처음 보는 글에서는 앞 2글자 예측기보다 길었다. 친칠라는 글을 8.3%로 줄였지만, 받는 사람에게 있어야 할 모델은 줄인 글보다 천 배 넘게 컸다. 두 경우 모두 예측기 자신을 적는 비트는 0으로 쳤는데, 예측기를 적는 데 드는 비트까지 셈에 넣으면 어떤 예측기가 「짧은 설명」일까? 그리고 그 셈으로 고른 예측기는 처음 보는 글에서도 짧게 적을까?