TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 27 READS

gzip으로 언어 모델을 만든다? 압축과 예측의 등가성 실험

신경망 없이 언어 모델을 만들 수 있을까. 한 개발자가 이 질문을 극단까지 밀어붙였다. 학습된 가중치도, 훈련 과정도 없이, 운영체제에 기본으로 딸려 오는 압축 도구인 gzip만으로 셰익스피어풍 텍스트를 이어 쓰게 만든 것이다. 이 실험의 출발점은 그가 이전에 시도했던 작업에 있다. 당시 그는 신경망 대신 무제한 n-gram 모델로 셰익스피어 텍스트를 생성했는데, 여기에도 가중치나 훈련은 없었고 오직 등장 빈도를 세는 계산만 있었다. 이후 그는 'Language Modeling is Compression'이라는 논문을 접하면서 압축과 예측이 본질적으로 같다는 개념, 즉 모든 예측 모델은 그 자체로 압축기이며 모든 압축 알고리즘은 예측 모델이라는 명제를 만나게 된다.

압축기 안에 숨어 있는 확률 모델

이 등가성이 왜 성립하는지는 압축기가 하는 일을 뜯어보면 드러난다. 압축기는 자신이 '예상하는' 데이터에는 적은 바이트를, 예상하지 못하는 데이터에는 많은 바이트를 쓴다. 알파벳 A가 100만 번 반복되는 파일은 한 문장으로 설명할 수 있지만, 100만 개의 무작위 바이트는 구조가 없어 거의 압축되지 않는다. 이것은 우연이 아니라 정보 이론의 핵심이다. 어떤 기호를 부호화하는 데 필요한 비트 수는 모델이 그 기호에 부여한 확률 p에 대해 -log₂p로 정해진다. 확률이 높을수록 필요한 비트는 적어진다. 다시 말해 누가 명시적으로 작성했든 아니든, 모든 압축기 안에는 확률 모델이 숨어 있다.

gzip이 사용하는 DEFLATE 알고리즘은 이 원리를 실제로 구현한다. DEFLATE는 다음에 올 바이트를 압축할 때 32KiB 크기의 슬라이딩 윈도우 안에 있는 최근 텍스트에서 일치하는 부분을 찾는다. 이어지는 내용이 윈도우에 이미 존재하는 무언가를 반복한다면, DEFLATE는 그것을 원본 바이트가 아니라 저렴한 역참조(back-reference)로 부호화한다. 결과적으로 압축기가 이미 본 텍스트를 되풀이하는 후보 문장은 거의 아무 공간도 차지하지 않고 압축된다.

점수 매기기와 실제 생성의 간극

여기서 점수 체계가 나온다. 어떤 맥락이 주어졌을 때 특정 후보 문장이 얼마나 그럴듯한지 알고 싶다면, 맥락과 후보를 함께 압축해 결과물의 바이트 길이를 재면 된다. 압축된 길이가 짧을수록 그 후보는 더 잘 '예측된' 것이다. 모델을 준비시키는 방법도 단순하다. gzip의 윈도우 안에 말뭉치를 함께 넣어두면, 말뭉치를 닮은 후보는 작게 압축되고 닮지 않은 후보는 크게 압축된다. 실제로 이 방식으로 tiny Shakespeare 말뭉치를 넣고 돌린 출력은 완전히 매끄러운 문장은 아니었지만, gzip이 원문에 대해 예상보다 훨씬 많은 것을 알고 있다는 사실을 분명히 보여줬다.

다만 점수를 매기는 것과 텍스트를 생성하는 것은 별개의 문제였다. 가장 단순하게 '가장 잘 압축되는 다음 한 바이트'를 고르는 방식은 형편없이 실패한다. 이유는 미묘하다. gzip은 압축 길이를 소수점 없는 정수 바이트 단위로만 알려준다. 그래서 바이트를 하나 더한다고 압축 길이가 바뀌지 않는 경우가 잦고, 수많은 후보가 동점이 되면서 정작 필요한 신호가 양자화 잡음에 묻혀버린다. 해결책은 한 바이트가 아니라 일정한 구간 전체를 미리 내다보고 나서 결정하는 것이다. 이 도구는 바이트 시퀀스에 대해 빔 서치(beam search)를 수행해, 각 단계에서 가능한 다음 바이트들을 놓고 맥락과 후보를 함께 압축한 뒤 그 길이를 비교한다.

무한 반복을 막는 꼬리 자르기

중요한 세부 사항이 하나 있다. 생성된 출력 중 마지막 꼬리(tail) 바이트만 점수 계산용 맥락에 남긴다는 점이다. DEFLATE는 가까운 곳의 일치를 먼 곳의 일치보다 더 저렴하게 부호화하기 때문에, 만약 gzip이 자신이 지금까지 만들어낸 전체 이력을 볼 수 있다면 방금 내뱉은 텍스트를 그대로 반복 복사하는 것이 가장 저렴한 선택이 되어버린다. 즉 아무런 제한을 두지 않으면 모델은 자기 출력을 되풀이하는 무한 루프에 빠진다. 맥락을 최근 일부로 제한하는 것은 이런 붕괴를 막기 위한 장치다.

이 실험의 매력은 구현이 놀랄 만큼 간소하다는 데 있다. 전체가 표준 라이브러리만 쓴 단일 파이썬 파일이며, 실제로는 gzip 프로세스를 띄우는 대신 zlib 모듈을 호출한다. 두 방식 모두 내부적으로 같은 DEFLATE 알고리즘을 쓴다. 코드는 깃허브에 공개돼 있어 직접 만져볼 수 있다. 참고로 앞서 언급한 논문도 이 아이디어를 시도했으나 성능이 좋지 않았는데, 논문이 가능성으로만 언급했던 빔 서치를 실제로 적용하자 생성 품질이 크게 개선됐다는 점이 이 프로젝트의 차별점이다.

실무자 입장에서 이 실험을 곧바로 제품에 쓸 일은 없을 것이다. 출력은 여전히 문법적으로 어설프고, 32KiB 윈도우라는 물리적 제약 탓에 다룰 수 있는 문맥의 크기도 작다. 그러나 이 시도가 던지는 메시지는 분명하다. 압축과 예측이 동전의 양면이라는 정보 이론의 오래된 명제가 추상적 정리에 머물지 않고, OS에 이미 깔려 있는 흔한 도구에서도 실제로 관찰된다는 사실이다. 거대한 파라미터와 대규모 학습이 언어 모델의 전부가 아니라, 그 밑바탕에는 '무엇을 얼마나 예상하는가'라는 확률적 구조가 놓여 있다는 점을 이 작은 실험이 직관적으로 상기시켜 준다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://nathan.rs/posts/gzip-lm/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...