gzip만으로 언어 모델을 만들 수 있을까? (gzipt)
Can gzip be a language model?
TL;DR Highlight
gzip 압축 길이를 점수로 빔서치했더니 셰익스피어풍 문장이 나왔다
Who Should Read
LLM을 쓰지만 '압축=예측'이라는 원리가 낯선, 텍스트 생성·분류 로직을 짜는 백엔드 개발자
Core Mechanics
- 압축기 안에는 확률 모델이 숨어 있다
- 압축기는 예상한 데이터에 적은 바이트를, 예상 못 한 데이터에 많은 바이트를 쓴다.
- 심볼을 인코딩하는 데 필요한 비트 수는 -log2 p이고, p는 모델이 그 심볼에 준 확률이다.
- gzip 압축 길이가 곧 점수다
- gzip은 DEFLATE로 최근 32 KiB 슬라이딩 윈도우 안의 반복을 싼 back-reference로 바꾼다.
- 점수는 len(gzip(context + candidate))이고, 작을수록 더 '예측된' 후보다.
- 코퍼스를 윈도우에 넣어 두면 코퍼스와 비슷한 이어쓰기가 작게 압축된다.
- 한 바이트씩 고르면 실패한다
- gzip은 정수 바이트 길이만 주기 때문에 한 바이트를 더해도 길이가 안 바뀌는 경우가 많다.
- 후보가 대거 동점이 되어 신호가 양자화 노이즈에 묻힌다.
- 해법은 빔서치로 앞을 내다보는 것이다
- 코퍼스에 나오는 모든 바이트로 각 후보를 확장하고, 압축 길이가 작은 beam_width개만 남긴다.
- 이걸 horizon 바이트만큼 반복한 뒤 가장 잘 압축되는 구간을 확정한다.
- temperature가 양수면 최종 후보 중에서 샘플링한다.
- 생성 문맥엔 최근 꼬리 바이트만 둔다
Community Reactions
- bzip2·zstd로 바꿔 봤더니 말이 안 되는 결과가 나왔다는 경험
- 한 댓글러가 MiMo-V2.6-Flash로 포크해 돌렸더니 bzip2는 yxyxyx 같은 교차 반복 기호열을 만들었다.
- zstd는 공백과 개행 위주로 나왔고, 반복 바이트 런이 거의 공짜라서 그렇다는 설명이 붙었다.
- 빔서치가 얼마나 최적에 가까운지 모른다는 반론
- 탐색 공간이 탐색한 범위보다 훨씬 커서 결과는 gzip '그럴듯함 검사'의 하한일 뿐이라는 의견이다.
- 더 잘 압축되는 시퀀스가 있을 수 있는데 이에 대한 논의가 글에 없다는 지적이다.
- gzip을 분류기로 쓰는 방법이 이미 있다는 정보
- 주제별 문서(sports.txt 등)에 테스트 파일을 붙여 gzip -9 했을 때 가장 작은 쪽을 주제로 보는 방식이 소개됐다.
- gzip을 ML에 쓴 이전 논문(arxiv 2212.09410)과 tsoding의 구현 영상도 언급됐다.
- 이 정도로 n-gram이나 gzip이 대형 신경망에 가깝다고 말하면 과장이라는 의견
- 연관성은 분명하지만 역사적으로 과대 해석이 많았다는 지적이다.
- 글이 AI가 쓴 듯하고 실제 gzip이 아닌 zlib을 쓴다는 점이 거슬린다는 반응도 있었다.
How to Apply
- gzip -9로 텍스트 주제 분류 시험해 보기
- 오늘 주제별 샘플 문서 2~3개와 분류할 파일을 준비한다.
- 각 문서에 테스트 파일을 이어 붙여 gzip -9 한 뒤 크기가 가장 작은 쪽을 주제로 정한다.
- 문서 크기는 비슷하게 맞춘다.
- zlib으로 후보 점수 함수 만들어 보기
- len(zlib.compress(context + candidate))로 후보 이어쓰기의 점수를 계산한다.
- 같은 점수가 많이 나오면 한 바이트 대신 여러 바이트 구간 단위로 비교한다.
- gzipt 레포를 받아 코퍼스를 바꿔 돌려 보기
- 저장소(github.com/nathanrs/gzipt)를 클론해 자기 도메인 텍스트를 --corpus로 넣는다.
- beam_width, horizon 값을 바꿔 출력이 어떻게 달라지는지 비교한다.
Try It
# 파이썬 터미널에서 실행 (논문 방법의 간이 버전: zlib 압축 길이로 후보 점수 매기기)
import zlib
corpus = open("{{코퍼스.txt}}", "rb").read()[-30000:]
prompt = b"{{프롬프트}}"
cands = [b"{{후보1}}", b"{{후보2}}", b"{{후보3}}"]
# 짧을수록 코퍼스가 '예상'한 이어쓰기
for c in cands:
print(len(zlib.compress(corpus + prompt + c, 9)), c)
# 이어서 해 볼 것: 후보를 여러 바이트 구간으로 늘려 상위 몇 개만 남기는 빔서치로 확장해 보기Terminology
관련 논문
The Judge Can Debias Itself: LLM-as-a-Judge가 스스로 편향을 고치게 하는 법
심사 프롬프트에 편향 경고를 넣거나 스스로 비판시켰더니 21개 중 20개 조합에서 정확도가 올랐다
미국 노동시간의 90%는 AI 벤치마크가 제대로 다루지 못하는 일이다
벤치마크 29개를 직업 과제에 매핑했더니 노동시간 90%가 커버 밖
Postgres 19, AI 코드 리뷰가 버그를 너무 많이 찾아 출시 연기
LLM 코드 리뷰가 버그를 쏟아내 Postgres 19가 11월로 밀리고 기능 8~10개가 빠졌다
StarSkirmish Bench v0.2: LLM이 1시간 만에 짜는 StarCraft 봇 대결
LLM에게 1시간 동안 StarCraft 봇을 짜게 했더니 GPT-6 Astra가 1위
그럴듯한 설명 하나면 멀티모달 LLM 심사위원도 속는다 (JUPE 벤치마크)
정답은 그대로 두고 설명만 붙였더니 MLLM 심사위원의 오답 거절률이 12.7~13.8%p 떨어졌다
신경망은 이미 깔끔하다: polysemanticity의 원인 재해석
뉴런을 직접 들여다봤더니 대부분 한 가지 역할이 있었다는 주장
Linus Torvalds의 첫 LLM 보조 패치 시리즈
Linus가 LLM으로 folio 조회 패치 10개를 만들어 read() 벤치가 10배 빨라졌다
Related Resources
- https://nathan.rs/posts/gzip-lm/
- https://github.com/nathanrs/gzipt
- https://arxiv.org/abs/2309.10668
- https://arxiv.org/abs/2212.09410
- https://bellard.org/ts_zip/
- https://arxiv.org/abs/2506.01084
- https://www.youtube.com/watch?v=l6DKRf-fAAM
- https://www.youtube.com/watch?v=9n39SbRPXKQ
- https://jakobs.dev/solving-mnist-with-gzip/