모두의 AI
머신러닝AI논문

배우기

  • 논문리뷰
  • 이론·수학 기반
    • CPAL2026
      • Kernel von Mises Formula of the Influence Function
  • 모델 최적화·경량화
    • PolarQuant: Quantizing KV Caches with Polar Transformation
  • 핵심 아키텍처·알고리즘
    • CPAL2026
      • AlphaFormer: End-to-End Symbolic Regression of Alpha Factors with Transformers
  • 예측 모델링·정형 데이터
  • AutoML·ML 파이프라인
    • ICML 2025
      • AutoML-Agent: A Multi-Agent LLM Framework for Full-Pipeline AutoML
  • 컴퓨터 비전·멀티모달
  • NLP·LLM
    • CPAL2026
      • The Curse of Depth in Large Language Models
  • 신뢰성·XAI
  • 데이터 중심·특성 공학
  • 엣지·웹·서비스
  • 도메인 특화 응용
🏅내 업적
배우기/AI논문/모델 최적화·경량화/Chapter 1: PolarQuant: Quantizing KV Caches with Polar Transformation

Chapter 1: PolarQuant: Quantizing KV Caches with Polar Transformation

긴 컨텍스트 LLM의 병목은 종종 파라미터가 아니라 KV 캐시 메모리입니다. PolarQuant는 이 병목을 정면으로 겨냥해, 랜덤 전처리 후 벡터를 극좌표계로 바꾸고 각도만 짧게 저장함으로써, 예전 방식처럼 “원래 숫자로 되돌리는 부가 정보”를 계속 달고 다니는 부담을 크게 줄입니다. 이 글은 논문의 정리와 수식을 천천히 풀어, 왜 각도 분포가 π/4\pi/4π/4 근방에 몰리고 왜 그 덕분에 초저비트 양자화가 가능한지를 실무 관점까지 연결해 설명합니다.
PDF원문 논문 PDF 보기↗
[초록 & 서론] 3줄 요약 + 문제 제기
3줄 요약
- 긴 문맥을 다루는 LLM은 과거 토큰의 Key, Value 벡터를 계속 쌓아 두어야 하므로, 결국 KV 캐시가 VRAM을 먹어 치우는 진짜 병목이 됩니다.
- 예전 방식: 숫자를 아주 짧게만 적어 둬도, 묶음마다 “원래 값으로 되돌리는 데 필요한 부가 숫자”를 또 적어야 합니다. 그 부가 정보는 보통 정밀한 형식(예: FP16)으로 따로 저장되기 때문에, 겉으로는 줄인 것 같은데 VRAM은 생각만큼 안 줄어드는 경우가 많습니다.
- PolarQuant는 벡터를 먼저 무작위로 섞은 뒤 극좌표로 옮겨 각도만 짧게 저장합니다. 그 무거운 부가 설명에 덜 묶이면서도 4.2배 이상 압축과 강한 장문맥 품질을 동시에 보여 줍니다.
맞춤 비유: 무게표를 박스마다 붙이는 택배창고 vs 방향만 기록하는 나침반 창고
기존 양자화는 박스마다 "이 박스의 최소값, 최대값, 스케일" 같은 딱지를 붙인 뒤 창고에 넣는 방식에 가깝습니다. 박스를 줄이려고 했는데, 정작 딱지 보관 비용이 계속 따라옵니다. PolarQuant는 박스를 통째로 한 번 잘 섞어 둔 뒤, 각 물건이 "어느 방향으로 향하느냐"만 저장하는 방식입니다. 절대적인 크기 정보는 반지름 하나로 남기고, 나머지는 방향 정보로 압축하니 창고가 훨씬 가벼워집니다.
쉬운 말로 짚어보면
- 딜레마: 숫자만 줄이면 끝이 아니라, 블록마다 붙는 설명서(메타데이터)가 FP16으로 무거워 배보다 배꼽이 큰 상황이 생기기 쉽습니다.
- PolarQuant의 방향: 좌표 숫자 대신 거리(반지름 rrr) 하나와 방향(각도들)으로 나누어 담습니다. 나머지는 어느 쪽으로 기울었나만 기록하는 셈입니다.
- 믹서기(SSS)와 45∘45^\circ45∘: 극좌표로 넘어가기 전에 좌표를 무작위로 섞으면, 큰 덩어리를 반으로 나눴을 때 앞·뒤 무게(에너지)가 비슷해지는 경우가 많고, 그 비율을 각도로 쓰면 π/4\pi/4π/4(45∘45^\circ45∘) 근처에 값이 몰리기 쉽습니다. 좁은 각도 구간에 자주 등장한다는 걸 알면 적은 비트로도 각도만 양자화할 여지가 생깁니다.
- 실험에서 보고된 것: KV 캐시 4.2배 이상 압축, 104K 근처 극한 문맥에서도 바늘 찾기 등에서 강한 결과, 오프라인 코드북으로 Prefill 시간을 크게 줄이는 구간(논문에서 온라인 대비 약 11.6초 vs 약 3.4초 등)이 있습니다.
한 줄: 잘 섞으면 각도가 예측 가능하게 몰리는 통계 구조를 이용해, 복구용 부가 정보 부담을 크게 걷어 낸 접근입니다.
[배경 지식] 꼭 필요한 기초 개념
먼저 짚고 가기 — 본문을 읽기 전에
- 실수는 컴퓨터에서 어떻게 저장되나 (부동소수점)
뉴럴넷 중간값은 보통 실수로 다룹니다. GPU에서 자주 쓰는 형식으로 FP32(32비트, 단정밀도)와 FP16(16비트, 반정밀도 half precision)이 있습니다. FP16은 비트 수가 FP32의 절반이라 같은 칸 수를 쓰면 메모리를 절반으로 줄일 수 있지만, 표현 눈금은 조금 더 거칠 수 있습니다. 논문에서 “KV를 FP16으로 둔다”는 말은 압축하기 전 기본 저장이 16비트 실수라는 뜻에 가깝습니다.
- 양자화(quantization)란
연속적인 실수를 아주 적은 비트짜리 정수 코드(예: 4비트면 24=162^4=1624=16가지 칸)에 가장 가까운 값으로 맞춰 넣는 일입니다. 저장·연산 비용을 줄이려는 목적이 크고, 쓸 때는 다시 실수에 가깝게 복원(역양자화)합니다. “어느 칸이 원래 어느 범위였는지”를 알려 주는 보조 숫자(스케일, 제로포인트 등)가 필요해지는 경우가 많습니다.
- INT4와 FP16이 한 문장에 같이 나오는 이유
본문은 INT4처럼 값 자체는 몇 비트로 줄였어도, 블록마다 그 코드를 해석하는 규칙을 FP16 같은 비트가 더 큰 형식에 적어 두는 경우가 많다고 설명합니다. 그 보조 정보 때문에 “숫자는 줄었는데 VRAM은 생각만큼 안 줄었다”는 상황이 생깁니다. 아래 PolarQuant가 그 부담을 어떻게 줄이려는지 이어집니다.

아래 다섯 가지 개념만 잡혀 있어도 PolarQuant의 수식이 갑자기 덜 무섭게 보입니다. 각 항목은 용어 정의뿐 아니라, 뒤에 나오는 기호가 무슨 역할을 하려는지까지 이어서 적었습니다.
- KV Cache
자기회귀 생성에서 이전 토큰의 Key, Value를 재사용하기 위해 저장하는 메모리입니다. 시퀀스 길이가 늘수록 거의 선형으로 커지기 때문에, 긴 컨텍스트에서는 파라미터보다 KV 캐시가 먼저 VRAM을 가득 채웁니다.
의미: 이후 수식의 벡터 xxx는 "모델 파라미터"가 아니라 캐시에 쌓이는 활성화에 가깝습니다. PolarQuant가 건드리는 것도 가중치가 아니라 이 표현의 저장 방식입니다.
- 양자화와 정규화 오버헤드
숫자를 몇 비트짜리 짧은 정수로만 저장하려면, 보통 묶음마다 “원래 범위에 맞추는 보조 숫자”(논문·구현에서는 scale, zero-point 등으로 부름)가 추가로 필요합니다. 문제는 이 보조 숫자가 블록마다 또 적어야 하고, 꽤 정밀한 형식으로 저장되는 경우가 많다는 점입니다.
의미: "숫자를 줄였는데도 왜 메모리가 안 줄어드나"의 한 가지 답은 짧은 본문 옆에 붙는 보조 숫자가 계속 따라온다는 것입니다. PolarQuant는 이 부가 층을 가능한 한 줄이는 방향을 택합니다.
- 극좌표계 (Polar coordinates)
2차원에서는 점을 (x,y)(x, y)(x,y) 대신 반지름 rrr와 각도 θ\thetaθ로 표현합니다. PolarQuant는 이 아이디어를 다차원으로 끌고 가서, 벡터를 하나의 반지름 + 재귀적으로 정의된 여러 각도로 표현합니다.
의미: 좌표축에 붙어 있는 숫자 대신 "전체 크기(r) + 여러 방향(각도)"으로 정보를 나눕니다. 그래서 묶음마다 스케일을 붙이는 방식 대신 각도만 따로 짧게 저장하는 설계가 열립니다.
- 랜덤 전처리 (Random preconditioning)
원본 벡터 xxx에 무작위 스케치 행렬 SSS를 곱해 좌표를 고르게 섞는 단계입니다. 핵심은 이 과정을 거치면 데이터가 특정 좌표축에 몰려 있지 않고, 가우시안처럼 다루기 좋은 분포를 띠게 된다는 점입니다.
의미: SSS는 "장식"이 아니라 이후 극좌표 변환을 깔끔한 확률 모델로 분석할 수 있게 만드는 열쇠입니다. 그래서 논문이 SxSxSx에 대한 정규 근사를 쓸 수 있습니다.
- 다변량 가우시안과 집중 현상
여러 차원의 독립 가우시안 벡터는 길이와 각도가 예쁜 형태로 분해됩니다. 특히 PolarQuant는 고차원에서 특정 레벨의 각도들이 π/4\pi/4π/4 근방으로 강하게 몰린다는 성질을 이용해, 적은 비트로도 오차를 안정적으로 통제합니다.
의미: "각도가 어디에 몰리는가"가 얼마나 적은 비트로 양자화할 수 있는가와 직결됩니다. 분포가 좁게 몰리면 코드북이 단순해져 저비트에 유리합니다.
일상 예시로 보완하면: KV 캐시는 긴 대화를 이어 가려면 꼭 필요한 과거 토큰용 창고이고, 양자화는 그 창고 칸을 작은 숫자로 바꾸는 일입니다. 다만 칸마다 “원래 크기를 복구하는 법”이 적힌 딱지를 또 붙여야 하면, 본품은 줄었는데 딱지가 더 무거워질 수 있습니다.
[제안 방법] 핵심 제안 및 수식 완벽 해부
PolarQuant의 이야기는 "랜덤하게 잘 섞인 벡터를 극좌표로 바꾸면 어떤 정보가 가장 싸게 저장되는가"라는 질문에서 시작합니다.
이 절을 읽는 방법 (로드맵)
아래 수식은 한꺼번에 외울 필요가 없습니다. 순서만 잡고, 막히는 구간은 건너뛰어도 됩니다.
1. SSS로 섞기 — 특정 축에만 값이 몰리지 않게 해서, 뒤에서 각도마다 따로 양자화·분석하기 쉽게 만듭니다.
2. 각도를 층으로 쌓기 — 레벨 1은 “이웃한 두 좌표가 만드는 방향”, 위 레벨은 “앞·뒤 큰 덩어리 중 어디에 에너지가 더 실렸나”를 각도 하나로 요약합니다.
3. 밀도가 곱으로 쪼개진다 — “전체 길이(반지름)”와 “각 층의 각도들”을 통계적으로 거의 독립처럼 다룰 수 있어, 설계가 쪼개집니다.
4. π/4\pi/4π/4 근처로 몰린다 — 자주 나오는 각도 구간이 좁아지면 비트를 적게 써도 됩니다.
5. 각도만 짧게 저장 → 반지름+각도로 좌표 복원 → 기존 어텐션 — 모델 수식 자체는 그대로입니다.
부담 줄이기:
(4) 번 결합 밀도와
(5) 번 sin⁡\sinsin 거듭제곱 식은 지수·감마(Γ\GammaΓ)까지 따라가지 않아도 됩니다. “π/4\pi/4π/4 근방에 확률이 몰린다” 한 줄만 가져가도 이 글의 메시지는 살아 있습니다.

1) 랜덤 전처리: 왜 SxSxSx가 가우시안처럼 보이는가
직관 먼저: Sx∼N(⋯ )Sx \sim \mathcal{N}(\cdots)Sx∼N(⋯) 는 “SxSxSx의 각 좌표가 비슷한 힘으로 흔들리고, 서로 따로따로 분석해도 된다”는 분석용 그림입니다. 실제 샘플이 매번 완벽한 가우시안일 필요는 없고, 각도별 양자화를 정당화하려는 근사라고 보면 됩니다.
먼저 원본 임베딩 x∈Rdx \in \mathbb{R}^{d}x∈Rd에 랜덤 스케치 행렬 S∈Rm×dS \in \mathbb{R}^{m \times d}S∈Rm×d를 곱합니다.
Sx∼N(0,∥x∥22Im)Sx \sim \mathcal{N}(0, \|x\|_2^2 I_m)Sx∼N(0,∥x∥22​Im​)
한 줄 번역: SxSxSx의 각 좌표는 평균 0, 분산 ∥x∥22\|x\|_2^2∥x∥22​인 정규분포를 따르고, 서로 독립입니다.
기호 표 (Symbol Breakdown)
  • 기호xxx
  • 뜻양자화하려는 원본 KV 벡터 (한 토큰·한 헤드에서 나온 ddd차원 벡터)
  • 기호ddd
  • 뜻원본 차원 (hidden size / head dim 등)
  • 기호SSS
  • 뜻무작위 전처리 행렬. 논문의 전제에 맞게 적절히 뽑힌 행렬
  • 기호mmm
  • 뜻스케치 후 차원 (SxSxSx의 길이)
  • 기호ImI_mIm​
  • 뜻m×mm \times mm×m 항등행렬. 대각선이 1, 나머지 0
  • 기호∥x∥2\|x\|_2∥x∥2​
  • 뜻유클리디안 노름 ∑kxk2\sqrt{\sum_k x_k^2}∑k​xk2​​, 즉 벡터의 "전체 세기"
  • 기호N(0,σ2Im)\mathcal{N}(0, \sigma^2 I_m)N(0,σ2Im​)
  • 뜻평균 벡터 0, 공분산이 σ2Im\sigma^2 I_mσ2Im​인 다변량 정규분포
기호뜻
xxx양자화하려는 원본 KV 벡터 (한 토큰·한 헤드에서 나온 ddd차원 벡터)
ddd원본 차원 (hidden size / head dim 등)
SSS무작위 전처리 행렬. 논문의 전제에 맞게 적절히 뽑힌 행렬
mmm스케치 후 차원 (SxSxSx의 길이)
ImI_mIm​m×mm \times mm×m 항등행렬. 대각선이 1, 나머지 0
∥x∥2\|x\|_2∥x∥2​유클리디안 노름 ∑kxk2\sqrt{\sum_k x_k^2}∑k​xk2​​, 즉 벡터의 "전체 세기"
N(0,σ2Im)\mathcal{N}(0, \sigma^2 I_m)N(0,σ2Im​)평균 벡터 0, 공분산이 σ2Im\sigma^2 I_mσ2Im​인 다변량 정규분포
이 식이 말하는 것 (한 단계 더): ∼N(⋅)\sim \mathcal{N}(\cdot)∼N(⋅) 는 "SxSxSx가 어떤 확률 법칙을 따른다"는 선언입니다. 여기서 중요한 건 "정확히 항상 가우시안이다"라기보다, 좌표들이 비슷한 스케일로 흔들리고 서로 독립에 가깝다는 분석용 근사가 성립한다는 점입니다. 그래서 뒤에서 각도별로 쪼개 양자화할 때, "한 각도를 건드리면 다른 각도와 복잡하게 엮인다"는 부담을 줄일 수 있습니다.
쉽게 읽기 (Step-by-step)
1. 분산에 ∥x∥22\|x\|_2^2∥x∥22​가 붙는 이유: 원래 벡터가 크면, 회전·섞기 후에도 좌표 값들이 흔들리는 폭이 그에 비례해 커지는 그림으로 이해하면 됩니다.
2. 독립 항등 분산: ImI_mIm​ 덕분에 각 좌표는 서로 상관 없이 같은 분산을 가집니다. 그래서 나중에 각도를 쪼개서 양자화할 때, "이 각도와 저 각도가 서로 얽혀 있다"는 부담이 줄어듭니다.
3. 직관: 특정 축에만 값이 몰린 벡터를 무작위로 섞으면, 여러 축에 고르게 퍼진 형태에 가까워집니다. 그래서 좌표 하나하나에 scale을 붙이는 방식보다, 전체 길이 + 방향으로 보는 쪽이 자연스러워집니다.

2) Level 1: 인접 두 좌표로 만드는 첫 각도
직관 먼저: 평면에서 (a,b)(a,b)(a,b) 벡터의 “기울기 각”을 tan⁡−1(b/a)\tan^{-1}(b/a)tan−1(b/a)로 잡는 것과 같습니다. 길이는 아직 빼지 않고, 방향만 뽑는 단계입니다. jjj가 바뀌면서 좌표를 두 개씩 짝 지어 d/2d/2d/2개의 작은 각도가 생깁니다.
가장 바닥 레벨에서는 인접한 두 좌표 (x2j−1,x2j)(x_{2j-1}, x_{2j})(x2j−1​,x2j​)를 한 평면 벡터로 보고 각도를 씁니다.
ψj(1):=tan⁡−1 ⁣(x2jx2j−1),j=1,…,d/2\psi_j^{(1)} := \tan^{-1}\!\left(\frac{x_{2j}}{x_{2j-1}}\right), \quad j = 1, \ldots, d/2ψj(1)​:=tan−1(x2j−1​x2j​​),j=1,…,d/2
한 줄 번역: jjj번째 쌍에 대해, "세로 성분/가로 성분" 비율의 각도입니다.
기호 표
  • 기호ψj(1)\psi_j^{(1)}ψj(1)​
  • 뜻레벨 1에서의 jjj번째 각도
  • 기호x2j−1,x2jx_{2j-1}, x_{2j}x2j−1​,x2j​
  • 뜻벡터 xxx의 (2j−1)(2j-1)(2j−1)번째, 2j2j2j번째 좌표
  • 기호tan⁡−1\tan^{-1}tan−1
  • 뜻아크탄젠트. (x2j−1,x2j)(x_{2j-1}, x_{2j})(x2j−1​,x2j​) 평면에서의 방향각
기호뜻
ψj(1)\psi_j^{(1)}ψj(1)​레벨 1에서의 jjj번째 각도
x2j−1,x2jx_{2j-1}, x_{2j}x2j−1​,x2j​벡터 xxx의 (2j−1)(2j-1)(2j−1)번째, 2j2j2j번째 좌표
tan⁡−1\tan^{-1}tan−1아크탄젠트. (x2j−1,x2j)(x_{2j-1}, x_{2j})(x2j−1​,x2j​) 평면에서의 방향각
이 각도가 의미하는 것: ψj(1)\psi_j^{(1)}ψj(1)​ 는 "두 좌표 값의 크기 비율이 만드는 방향"을 숫자 하나로 고정한 것입니다. 길이(노름)는 아직 빼지 않고, 방향 정보만 먼저 꺼내는 단계라고 보면 됩니다.
쉽게 읽기
1. 왜 나눗션가: 평면에서 (a,b)(a, b)(a,b)의 방향은 tan⁡−1(b/a)\tan^{-1}(b/a)tan−1(b/a)로 잡는 것이 기본입니다. 여기서 a=x2j−1a=x_{2j-1}a=x2j−1​, b=x2jb=x_{2j}b=x2j​입니다.
2. jjj는 반복: ddd가 짝수라고 두면, 좌표를 두 개씩 짝지어 d/2d/2d/2개의 각도가 생깁니다.
3. 직관: 레벨 1은 "아주 국소적인 방향"을 여러 개 만듭니다. 아직 큰 덩어리 비교는 하지 않습니다.

3) Level ℓ≥2\ell \ge 2ℓ≥2: 절반 블록의 "파워 비율" 각도
직관 먼저: 인덱스가 복잡해 보이지만, 하는 일은 하나입니다. 잘린 구간을 앞 절반·뒤 절반으로 나누고, 뒤 쪽 “세기”를 앞 쪽으로 나눈 비율에 tan⁡−1\tan^{-1}tan−1을 씁니다. 비율이 1에 가깝다 = 앞·뒤 에너지가 비슷하다 → 각도가 π/4\pi/4π/4 근처로 갑니다. 레벨이 올라갈수록 더 큰 묶음끼리 비교합니다.
상위 레벨에서는 연속된 좌표 구간을 두 덩어리로 나누고, 각 덩어리의 노름(에너지) 비율로 각도를 만듭니다.
ψj(ℓ):=tan⁡−1 ⁣(∥x(j−1/2)2ℓ+1:j2ℓ∥2∥x(j−1)2ℓ+1:(j−1/2)2ℓ∥2),j=1,…,d/2ℓ,  ℓ≥2\psi_j^{(\ell)} := \tan^{-1}\!\left( \frac{\left\|x_{(j-1/2)2^{\ell}+1:j2^{\ell}}\right\|_2} {\left\|x_{(j-1)2^{\ell}+1:(j-1/2)2^{\ell}}\right\|_2} \right), \quad j = 1, \ldots, d/2^{\ell},\; \ell \ge 2ψj(ℓ)​:=tan−1(​x(j−1)2ℓ+1:(j−1/2)2ℓ​​2​​x(j−1/2)2ℓ+1:j2ℓ​​2​​),j=1,…,d/2ℓ,ℓ≥2
한 줄 번역: "오른쪽 절반 블록의 세기"를 "왼쪽 절반 블록의 세기"로 나눈 뒤, 그 비율의 각도입니다.
기호 표
  • 기호ψj(ℓ)\psi_j^{(\ell)}ψj(ℓ)​
  • 뜻레벨 ℓ\ellℓ에서의 jjj번째 각도
  • 기호∥xa:b∥2\|x_{a:b}\|_2∥xa:b​∥2​
  • 뜻인덱스 aaa부터 bbb까지 부분 벡터의 유클리디안 노름
  • 기호분자
  • 뜻뒤쪽 절반 묶음의 노름
  • 기호분모
  • 뜻앞쪽 절반 묶음의 노름
  • 기호ℓ\ellℓ
  • 뜻트리를 위로 올라갈수록 묶음이 커짐 (2개씩 → 4개씩 → …)
기호뜻
ψj(ℓ)\psi_j^{(\ell)}ψj(ℓ)​레벨 ℓ\ellℓ에서의 jjj번째 각도
∥xa:b∥2\|x_{a:b}\|_2∥xa:b​∥2​인덱스 aaa부터 bbb까지 부분 벡터의 유클리디안 노름
분자뒤쪽 절반 묶음의 노름
분모앞쪽 절반 묶음의 노름
ℓ\ellℓ트리를 위로 올라갈수록 묶음이 커짐 (2개씩 → 4개씩 → …)
분자·분모 비율이 말하는 것: 오른쪽(뒤쪽) 절반의 "세기"를 왼쪽(앞쪽) 절반으로 나눈 뒤 tan⁡−1\tan^{-1}tan−1 을 씁니다. 이 값이 1에 가깝다는 말은 양쪽 절반이 비슷한 에너지라는 뜻이고, 그때 각도는 π/4\pi/4π/4 근처로 갑니다. 즉 이 각도는 "어느 한쪽 절반에 치우쳤는가"를 한 숫자로 요약한 지표입니다.
쉽게 읽기
1. 비율이 1이면: tan⁡−1(1)=π/4\tan^{-1}(1) = \pi/4tan−1(1)=π/4 (45°). 즉 앞·뒤 절반의 에너지가 비슷하면 각도는 45° 근처로 갑니다.
2. 레벨이 올라갈수록: 보는 범위가 커져서, "큰 덩어리 간 균형"을 재는 각도가 됩니다.
3. 직관: 좌표 하나씩 자르는 대신, "왼쪽 묶음과 오른쪽 묶음 중 어디에 더 무게가 실렸나"를 각도로 기록합니다.

4) 결합 밀도: 왜 곱으로 쪼개지는가
직관 먼저: “동시에 일어날 확률 밀도 = 길이에 대한 것 × 각도 층마다 것들을 곱” 형태라는 뜻입니다. 말로 풀면 반지름을 어떻게 양자화할지와 각 레벨 각도를 어떻게 양자화할지를 한꺼번에 뒤엉킨 거대 최적화로 풀지 않아도, 거의 나눠서 설계할 수 있다는 신호입니다.
논문이 강조하는 정리는, 반지름과 각도 블록의 결합 밀도가 곱으로 분해된다는 것입니다.
fR,Ψd(r,ψd(x))=fR(r)∏ℓ=1log⁡2dfΨ(ℓ) ⁣(ψ(ℓ))f_{R,\Psi_d}(r, \psi_d(x)) = f_R(r) \prod_{\ell=1}^{\log_2 d} f_{\Psi^{(\ell)}}\!\left(\psi^{(\ell)}\right)fR,Ψd​​(r,ψd​(x))=fR​(r)ℓ=1∏log2​d​fΨ(ℓ)​(ψ(ℓ))
한 줄 번역: "전체 길이 rrr"과 "각 레벨의 각도 묶음 ψ(ℓ)\psi^{(\ell)}ψ(ℓ)"가 서로 독립적으로 동시에 나타날 확률은, 각각의 확률을 곱한 것과 같다는 뜻입니다.
기호 표
  • 기호fR,Ψdf_{R,\Psi_d}fR,Ψd​​
  • 뜻반지름 rrr과 모든 각도 ψd(x)\psi_d(x)ψd​(x)의 동시 밀도
  • 기호fR(r)f_R(r)fR​(r)
  • 뜻반지름만 뽑았을 때의 밀도 (길이 분포)
  • 기호fΨ(ℓ)f_{\Psi^{(\ell)}}fΨ(ℓ)​
  • 뜻레벨 ℓ\ellℓ에서의 각도들의 밀도
  • 기호∏ℓ=1log⁡2d\prod_{\ell=1}^{\log_2 d}∏ℓ=1log2​d​
  • 뜻레벨 1부터 log⁡2d\log_2 dlog2​d까지 곱
기호뜻
fR,Ψdf_{R,\Psi_d}fR,Ψd​​반지름 rrr과 모든 각도 ψd(x)\psi_d(x)ψd​(x)의 동시 밀도
fR(r)f_R(r)fR​(r)반지름만 뽑았을 때의 밀도 (길이 분포)
fΨ(ℓ)f_{\Psi^{(\ell)}}fΨ(ℓ)​레벨 ℓ\ellℓ에서의 각도들의 밀도
∏ℓ=1log⁡2d\prod_{\ell=1}^{\log_2 d}∏ℓ=1log2​d​레벨 1부터 log⁡2d\log_2 dlog2​d까지 곱
밀도가 곱으로 쪼개진다는 말의 의미: fR,Ψd=fR×(각도들)f_{R,\Psi_d} = f_R \times (\text{각도들})fR,Ψd​​=fR​×(각도들) 형태는 "길이를 뽑는 문제"와 "각 레벨 각도를 뽑는 문제"가 통계적으로 분리된다는 뜻입니다. 구현 관점에서는 반지름 저장·각도별 코드북을 한꺼번에 뒤엉키게 최적화하지 않아도 된다는 이야기에 가깝습니다.
쉽게 읽기
1. 독립 = 설계가 쉬워짐: 양자화를 "한꺼번에 고차원 K-means"로 하지 않고, 각도마다 1차원 문제로 나눌 수 있습니다.
2. 직관: 복잡하게 얽힌 상관관계 대신, "길이 문제"와 "각도 문제"를 나눠서 최적화합니다.

5) ℓ≥2\ell \ge 2ℓ≥2 각도의 밀도: π/4\pi/4π/4 근방 집중
직관 먼저: 긴 식은 “각도 ψ\psiψ가 어디에 있을 확률이 가장 큰가?”를 쓴 것입니다. 핵심은 sin⁡(2ψ)\sin(2\psi)sin(2ψ)가 ψ=π/4\psi=\pi/4ψ=π/4에서 최대라는 점입니다. 그 앞에 큰 거듭제곱이 붙으면, 최대가 아닌 각도에서는 값이 거의 0으로 눌립니다 → 확률 질량이 45∘45^\circ45∘ 근처 좁은 띠에만 남습니다 → 적은 비트로도 양자화하기 좋습니다.
특히 ℓ≥2\ell \ge 2ℓ≥2에서 각 ψi(ℓ)\psi_i^{(\ell)}ψi(ℓ)​의 주변 밀도는 다음과 같은 형태입니다.
fℓ(ψi(ℓ))=22ℓ−1−2 Γ(2ℓ−2)2Γ(2ℓ−1)sin⁡2ℓ−1−1(2ψi(ℓ))f_{\ell}(\psi_i^{(\ell)}) = \frac{2^{2^{\ell-1}-2}\,\Gamma(2^{\ell-2})^2}{\Gamma(2^{\ell-1})} \sin^{2^{\ell-1}-1}(2\psi_i^{(\ell)})fℓ​(ψi(ℓ)​)=Γ(2ℓ−1)22ℓ−1−2Γ(2ℓ−2)2​sin2ℓ−1−1(2ψi(ℓ)​)
한 줄 번역: 앞에 있는 분수는 정규화 상수(전체 확률이 1이 되게 맞추는 값)이고, 진짜 모양은 sin⁡(2ψ)\sin(2\psi)sin(2ψ)의 큰 거듭제곱이 결정합니다.
기호 표
  • 기호Γ(⋅)\Gamma(\cdot)Γ(⋅)
  • 뜻감마 함수. 계승을 연속으로 확장한 함수
  • 기호sin⁡2ℓ−1−1(2ψ)\sin^{2^{\ell-1}-1}(2\psi)sin2ℓ−1−1(2ψ)
  • 뜻sin⁡(2ψ)\sin(2\psi)sin(2ψ)를 2ℓ−1−12^{\ell-1}-12ℓ−1−1번 곱한 것
  • 기호ψi(ℓ)\psi_i^{(\ell)}ψi(ℓ)​
  • 뜻레벨 ℓ\ellℓ의 iii번째 각도
기호뜻
Γ(⋅)\Gamma(\cdot)Γ(⋅)감마 함수. 계승을 연속으로 확장한 함수
sin⁡2ℓ−1−1(2ψ)\sin^{2^{\ell-1}-1}(2\psi)sin2ℓ−1−1(2ψ)sin⁡(2ψ)\sin(2\psi)sin(2ψ)를 2ℓ−1−12^{\ell-1}-12ℓ−1−1번 곱한 것
ψi(ℓ)\psi_i^{(\ell)}ψi(ℓ)​레벨 ℓ\ellℓ의 iii번째 각도
sin⁡(큰 지수)\sin^{\text{(큰 지수)}}sin(큰 지수) 가 하는 일 (의미): 거듭제곱은 "최댓값 근처만 살리고 나머지는 거의 0으로 만든다"는 스위치에 가깝습니다. 그래서 밀도는 한 좁은 구간에만 살아남고, 그 구간이 π/4\pi/4π/4 근방으로 잡힙니다. 양자화로 번역하면 "값이 자주 등장하는 각도 구간이 좁다" → 적은 코드북으로도 자주 맞는다입니다.
쉽게 읽기 (Step-by-step)
1. sin⁡(2ψ)\sin(2\psi)sin(2ψ)는 ψ=π/4\psi = \pi/4ψ=π/4에서 최대값 1을 가집니다.
2. 지수 2ℓ−1−12^{\ell-1}-12ℓ−1−1이 커질수록, 최대값 근처가 아닌 ψ\psiψ에서는 sin⁡(큰 지수)\sin^{\text{(큰 지수)}}sin(큰 지수)가 0에 가깝게 눌립니다.
3. 그래서 상위 레벨일수록 밀도는 45° 근처에만 뾰족하게 솟습니다.
4. 양자화 관점: 값이 넓게 퍼져 있지 않고 좁은 구간에 몰려 있으면, 적은 비트(코드북)로도 오차를 작게 만들 수 있습니다.

6) 각도 양자화: 1차원 K-means와 같다
직관 먼저: 연속 각도 선 위에 대표 점(코드북) 몇 개를 박고, 실제 각도를 가장 가까운 대표로 올림합니다. 기대 제곱 오차를 줄이는 전형적인 1차원 양자화 그림입니다. bbb비트면 구간이 2b2^b2b개입니다.
각도를 2b2^b2b개 구간으로 나누고, 구간 대표값 θj(ℓ)\theta_j^{(\ell)}θj(ℓ)​에 맞추는 손실은 다음과 같이 쓸 수 있습니다.
Eψi(ℓ)∼fℓ[∑j∈[2b]:ψi(ℓ)∈Ij(ℓ)∣ψi(ℓ)−θj(ℓ)∣2]\mathbb{E}_{\psi_i^{(\ell)} \sim f_{\ell}} \left[ \sum_{j \in [2^b] : \psi_i^{(\ell)} \in I_j^{(\ell)}} \left| \psi_i^{(\ell)} - \theta_j^{(\ell)} \right|^2 \right]Eψi(ℓ)​∼fℓ​​​j∈[2b]:ψi(ℓ)​∈Ij(ℓ)​∑​​ψi(ℓ)​−θj(ℓ)​​2​
한 줄 번역: 실제 각도 ψ\psiψ가 어느 구간 IjI_jIj​에 들어가면, 그 구간의 중심 θj\theta_jθj​까지의 거리 제곱을 줄이려는 기대값입니다.
기호 표
  • 기호Eψ∼fℓ\mathbb{E}_{\psi \sim f_{\ell}}Eψ∼fℓ​​
  • 뜻ψ\psiψ가 밀도 fℓf_{\ell}fℓ​을 따를 때의 기대값
  • 기호bbb
  • 뜻각도 하나에 쓰는 비트 수 (구간 개수 2b2^b2b)
  • 기호Ij(ℓ)I_j^{(\ell)}Ij(ℓ)​
  • 뜻레벨 ℓ\ellℓ에서 jjj번째 구간
  • 기호θj(ℓ)\theta_j^{(\ell)}θj(ℓ)​
  • 뜻그 구간의 대표값 (centroid, 코드북 항목)
기호뜻
Eψ∼fℓ\mathbb{E}_{\psi \sim f_{\ell}}Eψ∼fℓ​​ψ\psiψ가 밀도 fℓf_{\ell}fℓ​을 따를 때의 기대값
bbb각도 하나에 쓰는 비트 수 (구간 개수 2b2^b2b)
Ij(ℓ)I_j^{(\ell)}Ij(ℓ)​레벨 ℓ\ellℓ에서 jjj번째 구간
θj(ℓ)\theta_j^{(\ell)}θj(ℓ)​그 구간의 대표값 (centroid, 코드북 항목)
기대값이 말하는 것: 이 식은 "각도가 실제로 자주 나타나는 분포 fℓf_\ellfℓ​ 안에서, 구간별 대표 각도를 고르면 평균 제곱 오차를 줄일 수 있다"는 1차원 양자화 문제입니다. IjI_jIj​는 비트로 만든 칸, θj\theta_jθj​는 그 칸의 대표 색이라고 보면 됩니다.
쉽게 읽기
1. 구간이 많을수록(bbb 큼): 표현은 정밀해지고 저장 비용은 늘어납니다.
2. 직관: 연속 각도를 잘라서 대표 각도로 매핑하는 전형적인 양자화입니다.

7) 복원 오차: 벡터 길이에 비례하는 상대 오차
직관 먼저: 벡터가 크면 절대 오차도 조금 커질 수 있으니, “원래 길이 대비 몇 퍼센트 틀렸나”로 약속하는 셈입니다. ε\varepsilonε이 작을수록 좋은 압축 품질입니다.
논문은 복원 벡터 x′x'x′에 대해 다음과 같은 형태의 오차를 논의합니다.
E[∥x−x′∥22]=ε∥x∥22\mathbb{E}\left[\|x - x'\|_2^2\right] = \varepsilon \|x\|_2^2E[∥x−x′∥22​]=ε∥x∥22​
한 줄 번역: 평균 제곱 오차가 원본 노름의 제곱에 비례합니다. ε\varepsilonε이 작을수록 좋습니다.
기호 표
  • 기호x′x'x′
  • 뜻복원된 근사 벡터
  • 기호∥x−x′∥22\|x - x'\|_2^2∥x−x′∥22​
  • 뜻좌표별 차이를 제곱해 더한 값 (MSE 성격)
  • 기호ε\varepsilonε
  • 뜻상대 오차 수준 (무차원 작은 수)
기호뜻
x′x'x′복원된 근사 벡터
∥x−x′∥22\|x - x'\|_2^2∥x−x′∥22​좌표별 차이를 제곱해 더한 값 (MSE 성격)
ε\varepsilonε상대 오차 수준 (무차원 작은 수)
등호가 말하는 것: 왼쪽은 "복원이 얼마나 틀렸나"의 평균 제곱이고, 오른쪽은 "원본 벡터가 얼마나 큰가"에 곱한 비율입니다. 즉 절대 오차가 아니라 상대 오차로 약속하는 형태입니다. 벡터가 크면 같은 품질을 유지하려면 절대 오차 여유도 커질 수 있어, 이런 스케일 불변 형태가 분석에 잘 맞습니다.
쉽게 읽기
1. 원본이 크면 오차 허용치도 절대값으로는 커질 수 있음이 자연스럽습니다. 상대적으로는 ε\varepsilonε으로 묶입니다.
2. 직관: 비트를 충분히 주면 ε\varepsilonε을 원하는 만큼 줄일 수 있다는 논의와 연결됩니다.

8) 복원 식: 반지름과 각도로 좌표를 다시 펼치기
직관 먼저: 인덱스 iii가 이진 트리에서 왼쪽·오른쪽 가지를 어떻게 탔는지에 따라, 각 레벨에서 cos⁡ψ\cos\psicosψ를 곱할지 sin⁡ψ\sin\psisinψ를 곱할지가 갈립니다. 긴 식은 그 규칙을 한 줄로 쓴 것입니다. “전체 스케일 ∥x∥2\|x\|_2∥x∥2​ 한 번 × 레벨마다 cos⁡\coscos 또는 sin⁡\sinsin”만 기억해도 됩니다.
저장해 둔 반지름 ∥x∥2\|x\|_2∥x∥2​와 각도 ψ(ℓ)\psi^{(\ell)}ψ(ℓ)로 iii번째 좌표를 복원할 때, 논문 형태는 다음과 같이 쓰입니다.
xi=∥x∥2∏ℓ=1log⁡2d(cos⁡ψ⌊i/2ℓ⌋(ℓ))1{(i mod 2ℓ)≤2ℓ−1}∏ℓ=1log⁡2d(sin⁡ψ⌊i/2ℓ⌋(ℓ))1{(i mod 2ℓ)>2ℓ−1}x_i = \|x\|_2 \prod_{\ell=1}^{\log_2 d} (\cos \psi_{\lfloor i / 2^{\ell} \rfloor}^{(\ell)})^{\mathbf{1}\{(i \bmod 2^{\ell}) \le 2^{\ell-1}\}} \prod_{\ell=1}^{\log_2 d} (\sin \psi_{\lfloor i / 2^{\ell} \rfloor}^{(\ell)})^{\mathbf{1}\{(i \bmod 2^{\ell}) > 2^{\ell-1}\}}xi​=∥x∥2​ℓ=1∏log2​d​(cosψ⌊i/2ℓ⌋(ℓ)​)1{(imod2ℓ)≤2ℓ−1}ℓ=1∏log2​d​(sinψ⌊i/2ℓ⌋(ℓ)​)1{(imod2ℓ)>2ℓ−1}
한 줄 번역: 전체 스케일은 ∥x∥2\|x\|_2∥x∥2​로 한 번 정하고, 각 레벨에서는 코사인을 쓸지 사인을 쓸지를 인덱스 iii와 레벨 ℓ\ellℓ에 따라 고릅니다. 그걸 레벨마다 곱해 iii번째 좌표를 복원합니다.
기호 표
  • 기호xix_ixi​
  • 뜻복원 벡터의 iii번째 좌표
  • 기호1{⋅}\mathbf{1}\{\cdot\}1{⋅}
  • 뜻조건이 참이면 1, 아니면 0 (지시함수)
  • 기호i mod 2ℓi \bmod 2^{\ell}imod2ℓ
  • 뜻iii를 2ℓ2^{\ell}2ℓ로 나눈 나머지
  • 기호⌊i/2ℓ⌋\lfloor i / 2^{\ell} \rfloor⌊i/2ℓ⌋
  • 뜻iii를 2ℓ2^{\ell}2ℓ로 나눈 몫 (어느 블록의 각도를 쓸지)
기호뜻
xix_ixi​복원 벡터의 iii번째 좌표
1{⋅}\mathbf{1}\{\cdot\}1{⋅}조건이 참이면 1, 아니면 0 (지시함수)
i mod 2ℓi \bmod 2^{\ell}imod2ℓiii를 2ℓ2^{\ell}2ℓ로 나눈 나머지
⌊i/2ℓ⌋\lfloor i / 2^{\ell} \rfloor⌊i/2ℓ⌋iii를 2ℓ2^{\ell}2ℓ로 나눈 몫 (어느 블록의 각도를 쓸지)
복원 식의 직관 (무엇을 하고 있나): ∥x∥2\|x\|_2∥x∥2​ 로 전체 스케일을 한 번 잡은 뒤, 레벨마다 cos⁡\coscos 또는 sin⁡\sinsin 을 곱해 내려가며 좌표 xix_ixi​를 조립합니다. 지시함수 1{⋅}\mathbf{1}\{\cdot\}1{⋅} 는 "이 레벨에서는 왼쪽 절반 경로냐 오른쪽 절반이냐"에 따라 서로 다른 삼각함수를 택한다는 뜻입니다. 트리를 올라갈 때 반으로 쪼갠 것을, 내려올 때 삼각함수 곱으로 되돌린다고 이해하면 됩니다.
쉽게 읽기
1. 지수에 0/1이 들어간다는 뜻: 해당 레벨에서 cos⁡\coscos 항을 곱할지 말지, sin⁡\sinsin 항을 곱할지 말지를 고릅니다. (곱에 0승이면 사실상 1이라 무시)
2. 직관: 재귀적으로 벡터를 쪼개 왔으니, 복원할 때도 레벨별로 cos/sin을 곱해 내려오는 구조입니다. 세부 인덱스 규칙은 구현 시 트리 순서와 맞추면 됩니다.

9) 어텐션에 넣기: 구조는 그대로
직관 먼저: K^,V^\hat{K},\hat{V}K^,V^는 압축했다가 다시 펼친 캐시입니다. softmax·스케일 d\sqrt{d}d​ 등 학습 시와 같은 식에 넣기만 하면 됩니다.
복원된 Key, Value를 사용할 때, 스케일링된 어텐션은 다음과 같습니다.
softmax⁡ ⁣(K^:i⋅qid)V^:i\operatorname{softmax}\!\left(\frac{\hat{K}_{:i} \cdot q_i}{\sqrt{d}}\right) \hat{V}_{:i}softmax(d​K^:i​⋅qi​​)V^:i​
한 줄 번역: iii번째 토큰 위치에서, 쿼리 qiq_iqi​와 복원된 Key 열 K^:i\hat{K}_{:i}K^:i​의 내적을 스코어로 쓰고, softmax 가중합으로 V^\hat{V}V^를 섞습니다.
기호 표
  • 기호K^:i\hat{K}_{:i}K^:i​
  • 뜻복원 KV 캐시에서 iii번째 토큰에 해당하는 Key (열 벡터)
  • 기호qiq_iqi​
  • 뜻현재 토큰의 쿼리 벡터
  • 기호ddd
  • 뜻스케일링에 쓰이는 차원 (보통 head dim)
  • 기호V^:i\hat{V}_{:i}V^:i​
  • 뜻복원된 Value 쪽 기여
기호뜻
K^:i\hat{K}_{:i}K^:i​복원 KV 캐시에서 iii번째 토큰에 해당하는 Key (열 벡터)
qiq_iqi​현재 토큰의 쿼리 벡터
ddd스케일링에 쓰이는 차원 (보통 head dim)
V^:i\hat{V}_{:i}V^:i​복원된 Value 쪽 기여
이 한 줄이 말하는 것: 학습 때 쓰던 어텐션과 형태는 동일하고, 바뀐 것은 K,VK,VK,V 가 압축 저장 → 복원을 거친 K^,V^\hat{K},\hat{V}K^,V^ 라는 점뿐입니다. 즉 PolarQuant는 어텐션 정의를 바꾸는 논문이 아니라, 캐시 비트를 줄이는 표현 방법을 바꾸는 논문에 가깝습니다.
쉽게 읽기
1. 모델 수식은 그대로: PolarQuant는 캐시를 어떻게 압축·복원할지만 바꿉니다.
2. 직관: 학습된 attention 패턴을 유지하려면, 복원 오차를 충분히 줄이는 것이 핵심입니다.

요약: PolarQuant는
(1) 랜덤 전처리로 분포를 정리하고,
(2) 극좌표 각도로 바꾼 뒤,
(3) 각도가 집중되는 곳을 저비트로 양자화하고,
(4) 반지름 하나와 각도로 다시 펼쳐서
(5) 기존 어텐션에 넣습니다.
[수식 작동 시뮬레이션] Toy Data Walkthrough
위 절의 수식을 손으로 한 번 따라가 보려는 짧은 예입니다. 기호를 외우기보다, “레벨 1 → 레벨 2 → π/4\pi/4π/4”가 어떻게 연결되는지만 보면 됩니다.
숫자는 설명용 가정이지만, 한 프레임씩 그려 보면 알고리즘이 훨씬 선명해집니다.

설정
- 원본 Value 벡터를 x=(3,4,4,3)x = (3, 4, 4, 3)x=(3,4,4,3)라고 합시다. (d=4d=4d=4)
- 손계산 예시를 위해 전처리 후 벡터를 정수 좌표 x′=(3,4,4,3)x' = (3, 4, 4, 3)x′=(3,4,4,3)로 둡니다. (실제 SxSxSx는 보통 소수 좌표입니다.)
왜 xxx와 x′x'x′를 같게 두나요? 실제 파이프라인에서는 x′=Sxx' = Sxx′=Sx 로 값이 바뀝니다. 여기서는 노름·비율 계산이 정수로 깔끔하게 나오도록 같은 숫자를 택한 것입니다. 즉 "알고리즘 단계"는 그대로 두고, 예제 숫자만 읽기 쉽게 고른 것입니다.

1) Level 1 각도 계산 (두 좌표씩 한 평면)
첫 두 좌표 (3,4)(3, 4)(3,4), 뒤 두 좌표 (4,3)(4, 3)(4,3)에 대해:
ψ1(1)=tan⁡−1(4/3),ψ2(1)=tan⁡−1(3/4)\psi_1^{ (1) } = \tan^{-1}(4 / 3), \qquad \psi_2^{ (1) } = \tan^{-1}(3 / 4)ψ1(1)​=tan−1(4/3),ψ2(1)​=tan−1(3/4)
두 식이 각각 말하는 것: 첫 식은 "(3,4)(3,4)(3,4) 평면에서 벡터가 가로축 대비 세로로 얼마나 기울어졌나"이고, 둘째 식은 "(4,3)(4,3)(4,3) 평면에서의 기울기"입니다. 둘 다 한 쌍의 좌표가 만드는 '방향'만 뽑았고, 아직 전체 벡터 길이는 다음 단계에서 블록 노름으로 다룹니다.
숫자 감: 4/3≈1.334/3 \approx 1.334/3≈1.33, tan⁡−1(4/3)≈0.93\tan^{-1}(4/3) \approx 0.93tan−1(4/3)≈0.93 라디안(약 53°). 3/4=0.753/4 = 0.753/4=0.75, tan⁡−1(3/4)≈0.64\tan^{-1}(3/4) \approx 0.64tan−1(3/4)≈0.64 라디안(약 37°). 둘 다 0°나 90° 극단이 아니라 중간입니다.
쉽게 읽기: 레벨 1은 "각 좌표 쌍이 어느 방향을 보는지"만 봅니다. 한 축에만 값이 몰린 특이한 쌍이 아니라는 뜻입니다.

2) Level 2 각도 (앞·뒤 절반 블록의 노름 비율)
앞 절반 x1:2′=(3,4)x'_{1:2} = (3, 4)x1:2′​=(3,4), 뒤 절반 x3:4′=(4,3)x'_{3:4} = (4, 3)x3:4′​=(4,3)입니다.
∥x1:2′∥2=32+42=5,∥x3:4′∥2=42+32=5\|x'_{1:2}\|_2 = \sqrt{3^2 + 4^2} = 5, \qquad \|x'_{3:4}\|_2 = \sqrt{4^2 + 3^2} = 5∥x1:2′​∥2​=32+42​=5,∥x3:4′​∥2​=42+32​=5
비율은 5/5=15/5 = 15/5=1이므로
ψ1(2)=tan⁡−1(1)=π4(정확히 45°)\psi_1^{ (2) } = \tan^{-1} (1) = \frac{\pi}{4} \quad \text{(정확히 45°)}ψ1(2)​=tan−1(1)=4π​(정확히 45°)
비율이 1일 때의 의미: ∥x3:4′∥/∥x1:2′∥=1\|x'_{3:4}\| / \|x'_{1:2}\| = 1∥x3:4′​∥/∥x1:2′​∥=1 이면 "앞 두 칸에 담긴 에너지"와 "뒤 두 칸에 담긴 에너지"가 같다는 뜻입니다. 그래서 tan⁡−1(1)\tan^{-1} (1)tan−1(1) 은 어느 쪽에도 치우치지 않은 균형 각인 π/4\pi/4π/4 로 갑니다. 이 예제는 3–4–5 덕에 두 노름이 정확히 같아져, 근사 말고 정확히 π/4\pi/4π/4 가 나옵니다.
쉽게 읽기: 앞·뒤 절반의 에너지가 같으면 상위 레벨 각도는 정확히 π/4\pi/4π/4입니다. (3,4)(3,4)(3,4)와 (4,3)(4,3)(4,3)이 같은 길이 5를 갖는 피타고라스 직각삼각형이라, 정수만으로도 논문이 말하는 상위 레벨 각도 집중이 한 번에 드러납니다.

3) 코드북 양자화 (비트 할당 예시)
예를 들어 ψ1(1),ψ2(1)\psi_1^{ (1) }, \psi_2^{ (1) }ψ1(1)​,ψ2(1)​에는 범위가 넓으니 4비트, ψ1(2)\psi_1^{ (2) }ψ1(2)​는 이번 예에서는 정확히 π/4\pi/4π/4이므로 2비트만 줘도 중심 하나에 거의 붙일 수 있습니다.
쉽게 읽기: 2비트면 구간이 네 개뿐이지만, 값이 한 점에 몰려 있으면 적은 코드북으로도 충분히 가깝게 맞출 수 있습니다.

4) 복원
반지름은 r=∥x∥2r = \|x\|_2r=∥x∥2​ (원본이든 전처리 후 기준을 논문/구현에 맞게 택함) 하나를 저장하고, 양자화된 각도 인덱스를 따라 트리를 역으로 내려와 x^\hat{x}x^를 만듭니다.
쉽게 읽기: 좌표를 int4로 직접 저장한 것이 아니라, 길이 + 각도로 저장했기 때문에 메모리 이득이 생깁니다.

5) 어텐션
복원된 K^,V^\hat{K}, \hat{V}K^,V^를 기존 attention에 넣습니다. 모델 가중치를 바꾸지 않고 캐시 포맷만 최적화하는 그림입니다.

한 줄 요약: PolarQuant는 좌표를 직접 줄이기보다, 방향 정보로 바꿔 저장했다가 다시 펼치는 방식입니다. 이 정수 예제에서는 앞·뒤 절반의 노름이 둘 다 5로 같아 Level 2 각도가 정확히 π/4\pi/4π/4가 됩니다.
[실험·구현 심화] 이론을 코드와 벤치마크로 증명하기
논문을 읽다 보면 수식의 아름다움에 감탄하다가도, 결국 "그래서 실제 코드로 어떻게 돌렸고 결과가 어떤데?" 하는 실무적 궁금증이 생기기 마련입니다. PolarQuant 저자들은 이 아이디어를 이론에만 두지 않고, Llama-3.1 등 실제 모델에 올려 극한 벤치마크까지 검증했습니다. 아래에서는 구현 디테일부터 네 가지 핵심 실험까지 짚어 보겠습니다.

1. 실험 환경 및 구현 (Hardware & Implementation)
수식을 컴퓨터가 실행 가능한 코드로 옮기는 방식이 재현성의 첫 단추입니다.
- 하드웨어: VRAM 48GB인 NVIDIA RTX A6000 GPU 1대로 실험을 수행했습니다.
- 프레임워크·데이터 타입: PyTorch로 구현했고, 양자화된 각도 인덱스를 8비트 부호 없는 정수 타입 torch.uint8에 패킹(packing)해 넣었습니다.
- 커스텀 CUDA 커널: 쿼리 벡터 × 복원된 Key 캐시, 어텐션 스코어 × 복원된 Value 캐시 같은 핵심 곱셈을 가속하는 전용 CUDA 커널을 작성해 적용했습니다.
- 공유 전처리 행렬 SSS: 랜덤 전처리에 쓰는 회전(스케치) 행렬 SSS는 Key·Value 임베딩뿐 아니라 모든 레이어·모든 어텐션 헤드에 걸쳐 하나를 동일하게 공유(shared)했습니다.
- 코드북 두 전략: 각도 양자화에는 1차원 k-means++ 클러스터링을 사용했습니다.
- 온라인(Online): 프롬프트가 들어올 때마다 각도를 계산해 실시간으로 클러스터링합니다. (주문이 들어올 때마다 양념을 새로 맞추는 느낌.)
- 오프라인(Offline): 미리 계산해 둔 각도 분포 코드북을 모든 프롬프트에 재사용합니다. (미리 만든 만능 양념장을 쓰는 느낌.)

2. 실험 1: 각도 분포가 실제로 예쁘게 모일까? (분포 검증)
이론에서 다룬 각도 분포(예: 다변량 가우시안 가정)가 실제 KV 데이터에서도 의미가 있는지 확인하는 실험입니다.
- 세팅: LongBench의 Qasper에서 프롬프트를 샘플링해 KV 캐시를 추출한 뒤, 레벨 L=4L=4L=4 극좌표 변환을 적용했습니다.
- 결과: 랜덤 전처리를 하지 않으면 각도가 들쭉날쭉했고, 전처리 후에는 이상치(outlier) 성격이 줄었습니다. 특히 상위 레벨로 갈수록 각도가 π/4\pi/4π/4 주변으로 날카롭게 집중하는 모습을 실제 데이터에서 확인했습니다.

3. 실험 2: 극한 문맥 — Needle-In-A-Haystack
압축을 강하게 걸었을 때도 중요한 정보를 놓치지 않는지 보는, 유명한 "건초더미에서 바늘 찾기" 실험입니다.
- 세팅: Llama-3.1-8B-Instruct, 입력 길이 4K부터 104K까지 확장하며 테스트했습니다.
- 공정한 메모리 조건: SnapKV, PyramidKV, KIVI 등 최신 기법들과 비교할 때, 모든 방법의 KV 메모리 사용량을 원본 캐시의 25%(압축률 0.25)로 맞췄습니다.
- 결과: 토큰을 삭제해 메모리를 아끼는 계열(SnapKV 등)은 정보가 듬성듬성 빠지기 쉬운 반면, PolarQuant는 KIVI를 상회하며 recall이 가장 완전에 가까운 쪽으로 보고되었습니다.

4. 실험 3: LongBench — 범용 장문맥 벤치마크
한 가지 태스크만이 아니라, 긴 글 QA·요약·코드 등 여러 장문맥 과제에서도 통하는지 봅니다.
- 세팅: LongBench-V1 사용. 주의: 새로 생성되는 토큰에 대한 캐시는 정확도를 위해 FP16을 유지했다고 논문에 명시되어 있습니다.
- 결과: 평균 점수 기준 압축 없음(Exact)이 48.63이었고, PolarQuant-R(온라인)이 48.37로 원본에 거의 필적했습니다. KIVI(46.70), SnapKV(44.57) 등을 여유 있게 상회하는 결과로 보고됩니다.

5. 실험 4: 런타임 — 정말 실용적인 속도인가?
품질만 좋고 너무 느리면 서빙에 쓰기 어렵습니다. 처리 시간을 초 단위로 측정했습니다.
- 세팅: 입력 16,384토큰, 출력 1,024토큰 생성에 걸리는 시간을 측정했습니다.
- 생성 단계: PolarQuant는 토큰 생성 구간에서 KIVI 대비 약 14% 더 빠른 속도가 보고되었습니다.
- Prefill(전처리) 단계: 온라인 코드북은 프롬프트 처리에 약 11.633초, 오프라인 코드북은 약 3.364초로, 클러스터링 비용이 빠지며 전처리 시간이 크게 단축되었습니다. 품질 차이는 크지 않다고 하며, 저자들은 속도를 위해 오프라인 코드북을 강하게 권장합니다.

한 줄로 정리하면: PolarQuant는 칠판 위의 수식에 그치지 않고, PyTorch·CUDA·실모델 위에서 분포 검증 → 극한 문맥 → 범용 벤치마크 → 런타임까지 연결해 검증한 연구입니다.
직관 요약: 위 수치들은 “토큰을 지워서 버티는” 방식과 달리, 정교한 압축으로 정보를 유지하려는 쪽에 가깝습니다. 오프라인 코드북은 미리 만들어 둔 만능 각도표를 쓰는 것에 가깝고, 매 프롬프트마다 클러스터링하는 온라인보다 Prefill이 빠르다는 점이 실무에서 중요합니다.
[결론 및 한계점]
최종 의의 및 실무 활용 가치
1. PolarQuant는 "양자화하려면 정규화 메타데이터를 반드시 저장해야 한다"는 통념을 깨고, 극좌표 각도 양자화라는 다른 좌표계를 제안했습니다.
2. 긴 컨텍스트 서빙에서 가장 아픈 부분인 KV 캐시 메모리를 직접 겨냥하므로, 실제 서비스 비용과 최대 문맥 길이에 곧바로 영향을 줍니다.
3. 어텐션 수식을 갈아엎지 않고 캐시 표현만 바꾸기 때문에, 추론 시스템 최적화 파이프라인에 현실적으로 끼워 넣기 좋습니다.
한계점 (Future Work)
- 코드북 생성은 아직 K-means류 절차에 기대는 부분이 있어, 분포식을 직접 활용하는 더 빠른 closed-form 설계가 남아 있습니다.
- 논문의 강점은 장문맥 KV 캐시에 최적화되어 있으므로, 가중치 양자화나 activation 양자화로 그대로 일반화하려면 추가 검증이 필요합니다.
- 랜덤 전처리와 복원 커널을 실제 서비스 스택에 넣을 때는 CUDA kernel 최적화, packing layout, batch별 병렬화 전략이 성능을 크게 좌우할 수 있습니다.
[도식화 기획] 극명한 대비 시각화
왼쪽 패널은 기존 블록 양자화를 보여 줍니다. 블록마다 값 범위가 제각각이고, 그 옆에 복구용 보조 숫자가 계속 붙어 저장비가 불어나는 그림입니다. 붉은 점선 궤적은 메모리를 줄이려 할수록 오히려 그 보조 정보가 발목을 잡는 상황을 상징합니다.
오른쪽 패널은 PolarQuant 파이프라인입니다. 랜덤 전처리로 벡터를 부드럽게 섞고, 극좌표계에서 반지름 하나와 각도들을 뽑아 저장합니다. 상위 레벨 각도가 45∘45^\circ45∘ 근방으로 몰리는 모습을 초록색 집중 구간으로 표현해, 왜 적은 비트로도 안정적으로 표현되는지를 시각적으로 보여 줍니다.

KV 저장 흐름 비교

기존은 블록마다 FP16 메타가 누적되고, PolarQuant는 r·각도로 정리합니다.

블록 양자화

블록마다 ‘원래 값으로 되돌리는’ 보조 숫자가 따로 필요해, 비트는 줄어도 부담이 남습니다.
KVINT4+metaFP16× N+FP16 메타 / 블록메타데이터 부담 ↑

PolarQuant

랜덤 전처리 후 극좌표로 바꾸고, 분포가 집중되는 각도만 양자화해 메모리를 더 가볍게 만듭니다.
KVSrθcodebookr + θ codebook저장 부담 ↓

도표 기호, 이렇게 읽으면 됩니다

FP16
반정밀도 부동소수점(16비트). FP32보다 비트가 절반이라 같은 개수를 넣으면 메모리도 대략 절반, 다만 표현 눈금은 조금 거칠 수 있습니다.
양자화
연속 실수를 아주 짧은 정수 코드로 맞춰 저장하는 일입니다. 나중에 쓰려면 복원(역양자화)과, 블록마다 범위를 알려 주는 보조 숫자가 필요할 때가 많습니다.
KV
이전 토큰의 Key·Value를 담아 둔 캐시 벡터 한 덩어리입니다.
INT4
숫자를 아주 짧게(4비트)만 적어 둔 값입니다. 그대로는 쓰기 어려워 보조 정보가 필요합니다.
+meta / FP16
짧게 적어 둔 숫자를 원래 크기로 되돌리기 위해 붙이는 추가 숫자들. 보통 정밀한 형식(예: FP16)으로 따로 저장됩니다.
× N
블록이 N개면 메타데이터도 비슷하게 N번 반복된다는 뜻입니다.
S
벡터 좌표를 한 번 섞어 주는 랜덤 전처리 행렬입니다. 이후 극좌표로 바꾸기 쉽게 만듭니다.
r
극좌표에서 반지름, 즉 벡터 전체의 크기(길이)입니다.
θ
각도, 즉 방향입니다. 긴 실수 대신 코드북에서 몇 번째인지만 저장합니다.
codebook
자주 나오는 각도 후보를 적어 둔 표입니다. 팔레트 번호만 저장해 비트를 아낍니다.
PolarQuant의 아름다움은 문제를 다른 좌표계로 옮겼다는 데 있습니다. 기존 방법이 좌표축 위 숫자를 억지로 잘랐다면, PolarQuant는 랜덤 전처리로 분포를 정리한 뒤 길이와 방향으로 나누어 저장합니다. 그래서 정규화 오버헤드를 없애고도 장문맥 품질을 지키며, KV 캐시가 진짜 병목인 환경에서 특히 큰 가치를 냅니다.