제1부 기반: 언어모델과 트랜스포머
1.6 현대 아키텍처 변형 — MoE·GQA/MQA/MLA·롱컨텍스트·SSM
1.4의 트랜스포머 블록은 놀랍도록 잘 작동한다. 그런데 그 블록을 그대로 프런티어 규모로 확장하려는 순간, 세 방향에서 장벽에 부딪힌다. 파라미터를 늘려 더 많은 지식을 담으려 하면 토큰마다 그 파라미터를 전부 계산해야 해서 학습·추론 비용이 함께 폭증한다. 어텐션 헤드를 그대로 둔 채 컨텍스트를 늘리면 KV 캐시가 서빙 메모리를 소모한다 — 5.1에서 이 장벽을 이미 기가바이트와 밀리초로 봤다. 컨텍스트 자체를 길게 하면 어텐션 계산이 시퀀스 길이의 제곱으로 증가하고, 게다가 학습 때 본 적 없는 먼 위치에서 품질이 붕괴한다.
이 장은 실전 대형 모델들이 이 세 장벽을 우회하려고 1.4의 기본형에 추가한 변형들을 다룬다 — FFN을 전문가로 분할하는 전문가 혼합, KV 캐시를 줄이는 어텐션 변형(MQA·GQA·MLA), 학습 길이를 넘겨 컨텍스트를 늘리는 기법들, 그리고 어텐션을 아예 다른 시퀀스 연산으로 교체하는 대안(선형 어텐션·SSM). 미리 한 문장으로 명시하자면, 이 변형들은 하나도 무비용이 아니다. 전부 한 축의 비용을 낮추는 대신 그 비용을 다른 축으로 옮긴다. MoE는 계산을 아끼고 메모리·통신을 지불하며, KV 축소는 메모리를 아끼고 품질 위험을 지불하고, 희소 어텐션은 계산을 아끼고 먼 거리 참조를 지불한다. 그래서 "무엇이 최고냐"가 아니라 "지금 내 병목이 어느 축이고, 그 축을 깎는 대가로 어느 축을 내줄 수 있느냐"가 이 장 내내 반복되는 질문이다.
1.6.1 용량과 계산은 원래 한 몸이다
먼저 왜 기본 트랜스포머를 손대야 하는지를 정확히 지적하자. 1.4.15에서 순전파가 토큰당 대략 파라미터 수의 두 배 FLOP을 쓴다는 규칙($2P$)을 유도했다. 이 한 줄이 문제의 핵심이다 — 모델을 더 똑똑하게 만들려고 파라미터 $P$ 를 두 배로 키우면, 지식 저장 용량만 두 배가 되는 것이 아니라 모든 토큰을 처리하는 계산량도 정확히 두 배가 된다. 학습에서도, 추론에서도. 용량(capacity)과 토큰당 계산(compute)이 같은 조정 변수에 묶여 있는 것이다.
만약 이 둘을 떼어낼 수 있다면 — 파라미터는 10배로 키우되 토큰당 계산은 거의 그대로 두는 방법이 있다면 — 낮은 비용으로 큰 모델을 얻는다. 이것이 MoE가 파라미터 축에서 시도하는 일이다. 어텐션 쪽에는 다른 결합이 있다. 표현력을 위해 헤드를 많이 두면, 추론에서 그 헤드 수만큼 키·값을 캐시에 이고 다녀야 한다(1.4.8에서 예고했다). 표현력과 KV 메모리가 헤드 수라는 하나의 조정 변수에 묶여 있고, 이것을 떼려는 것이 MQA·GQA·MLA다. 컨텍스트 축에는 또 다른 결합이 있다. 컨텍스트를 늘리면 능력만 느는 것이 아니라 어텐션이 $O(L^2)$ 로 증가하고 KV가 $O(L)$ 로 자라며 위치 인코딩이 학습 범위를 벗어난다.
| 무엇을 키우면 | 늘어나는 능력 | 함께 폭증하는 비용 | 이 장의 대응 |
|---|---|---|---|
| FFN 파라미터 | 지식 저장 용량 | 토큰당 FLOP(학습·추론 둘 다) | MoE — 희소 활성 |
| 어텐션 헤드 | 표현력 | 디코드 KV 캐시(메모리·대역폭) | MQA·GQA·MLA |
| 컨텍스트 길이 $L$ | 긴 문서·대화·코드 | 어텐션 $O(L^2)$, KV $O(L)$, 위치 외삽 붕괴 | RoPE 확장·희소 어텐션·SSM |
세 변형군은 결국 같은 발상의 세 측면이다 — 원래 묶여 있던 두 양을 억지로 떼어내고, 그 대가로 새 비용을 감수한다. 이 관점을 쥐고 하나씩 내려가자.
1.6.2 dense FFN을 여러 전문가로 분할하다
기본 트랜스포머에서 한 층의 FFN은 모든 토큰이 똑같이 통과하는 하나의 2층 MLP다(1.4.13). 1.4의 표기를 그대로 쓰면
$$\text{FFN}(x) = \sigma(x W_1)\,W_2, \qquad W_1 \in \mathbb{R}^{d_{model}\times d_{ff}},\ W_2 \in \mathbb{R}^{d_{ff}\times d_{model}}$$
이고 $W_1, W_2$ 가 그 층 파라미터의 3분의 2를 차지한다(1.4.15에서 FFN이 어텐션의 두 배임을 셌다). 파라미터를 키우는 가장 자연스러운 곳이 바로 여기인데, 이 FFN을 단순히 넓히면 모든 토큰의 계산이 같이 커진다.
전문가 혼합(Mixture of Experts, MoE)의 발상은 단순하다. FFN을 하나만 두지 말고 $N$ 개의 독립된 FFN을 복제해 두자 — 이 복제본 각각을 전문가(expert)라 부른다. 그리고 토큰마다 이 $N$ 개 중 소수 $k$ 개(보통 1~2개)만 통과시킨다. 어느 전문가로 보낼지는 작은 라우터(router, 게이트)가 토큰마다 정한다. 어텐션은 손대지 않는다 — 토큰 간 정보 교환은 그대로 두고, 토큰별 계산을 담당하는 FFN만 조건부로 켜는 것이다.
효과를 한 줄로 요약하면 이렇다. 파라미터(용량)는 $N$ 배로 늘어나지만, 토큰당 계산(활성 FLOP)은 $k$ 개 전문가 몫만 든다. 8개 전문가에 top-2라면 FFN 파라미터가 8배로 늘어도 토큰당 FFN 계산은 대략 2배 수준에 머문다. "많은 파라미터, 적은 활성 계산" — 이것이 MoE의 전부이고, GPT-4·Mixtral·DeepSeek 계열을 비롯한 여러 프런티어 모델이 이 구조로 알려져 있다(구체 구성은 버전마다 다르고 상당수는 비공개다).
왜 하필 FFN을 분할하고 어텐션은 두는가. 두 가지 이유가 겹친다. 첫째, 앞서 봤듯 파라미터의 대부분이 FFN에 있으니 여기를 변경해야 용량이 실제로 커진다. 둘째, FFN을 "학습으로 축적한 사실·연상을 저장하는 키-값 메모리"로 보는 해석(1.4.13)이 맞다면, 전문가를 여럿 두는 것은 서로 다른 종류의 지식을 다른 전문가에 나눠 담고 토큰에 맞는 것만 꺼내 쓰는 그림이 된다. 어텐션은 "누가 누구를 보나"라는 관계 계산이라 토큰마다 다른 전문가를 둘 자연스러운 이유가 약하다. 그래서 MoE는 거의 항상 FFN을 표적으로 삼는다.
1.6.3 라우터 — top-k 게이팅과 이산 선택의 문제
라우터는 토큰의 히든 벡터 $x$ 를 받아 $N$ 개 전문가에 대한 점수를 낸다. 가장 단순한 형태는 학습되는 선형층 하나에 softmax를 씌운 것이다.
$$g(x) = \text{softmax}(x W_g) \in \mathbb{R}^{N}, \qquad W_g \in \mathbb{R}^{d_{model}\times N}$$
여기서 점수가 가장 높은 $k$ 개 전문가만 골라(top-k) 그 출력들을 게이트 가중치로 섞는다.
$$y = \sum_{i \in \mathcal{T}} \tilde g_i(x)\, E_i(x), \qquad \mathcal{T} = \text{TopK}\big(g(x),\, k\big)$$
$E_i$ 는 $i$ 번째 전문가 FFN이고, $\tilde g_i$ 는 선택된 전문가들에 대해서만 다시 정규화한 게이트 가중치다(선택된 $k$ 개의 $g_i$ 를 그들끼리 합이 1이 되도록 다시 나눠 쓰는 것이 흔하다). $k=1$ 이면 각 토큰이 전문가 하나만 통과하는 Switch Transformer 스타일로 가장 저렴하고, $k=2$ 가 계산과 품질의 흔한 절충이다. 최근 설계는 전문가를 잘게 분할해(fine-grained) $N$ 을 수십~수백까지 늘리고 top-k도 키우며, 일부는 공유 전문가(shared expert) — 모든 토큰이 항상 통과하는 전문가 — 를 한둘 두어 공통 지식을 담게 한다. 세분화가 통하는 직관은, 같은 활성 파라미터라도 큰 전문가 2개를 고르는 것보다 작은 전문가 8개를 고르는 편이 조합이 많아 표현이 유연해지기 때문이다.
여기서 학습을 어렵게 만드는 근본 문제가 하나 있다. top-k는 이산(discrete) 선택이라 미분이 안 된다. 어느 전문가가 뽑히느냐는 argmax 계열 연산이고, 입력을 미세하게 바꿔도 선택은 튀거나 그대로일 뿐 부드럽게 변하지 않는다 — 1.4.3에서 딕셔너리 조회가 미분 불가능했던 것과 똑같은 장벽이다. 실무의 우회법은 선택 자체는 미분하지 않고, 선택된 전문가의 출력에 게이트 가중치 $\tilde g_i(x)$ 를 곱해 그 곱을 통해서만 그래디언트가 흐르게 하는 것이다. 즉 "어느 전문가를 고를지"는 학습하지 못하고 "고른 전문가를 얼마나 섞을지"만 학습한다. 라우터가 더 나은 전문가를 고르도록 배우는 신호는 오직 이 게이트 가중치를 통해 간접적으로만 온다. 이 간접성 때문에 라우팅 학습은 본질적으로 불안정하고, 다음 절의 로드 밸런싱 장치가 없으면 곧장 붕괴한다.
한 가지 실무 디테일을 덧붙이면, 라우터의 로짓 $x W_g$ 자체가 학습 중 커지면 softmax가 포화해(1.4.6과 같은 문제) 라우팅이 극단으로 굳는다. 그래서 라우터 로짓의 크기를 억제하는 보조항(router z-loss)을 함께 적용하는 것이 흔하다 — 로짓 제곱을 벌하는 작은 항으로, 라우팅이 지나치게 뾰족해지는 것을 막는다. 작은 장치지만 대규모에서 라우터가 발산하는 것을 막는 데 실질적이다.
1.6.4 활성 파라미터와 총 파라미터를 직접 세기
MoE를 이해하는 핵심은 두 개의 파라미터 수 — 메모리에 상주해야 하는 총 파라미터와, 토큰당 실제 계산에 참여하는 활성 파라미터 — 를 분리해 세는 것이다. 1.4의 예시 모델을 그대로 MoE로 바꿔 직접 세어 보자. $d_{model}=4096$, $d_{ff}=16384$, 층 $L=32$, 어휘 $V=128{,}000$ 이고, 각 층의 FFN을 크기가 같은 전문가 8개로 복제하고 top-2로 라우팅한다고 하자.
먼저 부품별 크기를 1.4.15에서 가져온다. 층당 어텐션은 $4 d_{model}^2 \approx 6710$ 만, 전문가 하나(=dense FFN 하나)는 $2\, d_{model}\, d_{ff} = 8 d_{model}^2 \approx 1$ 억 3400만이다. 어텐션과 임베딩은 복제되지 않고 항상 켜지는 공유부다. 이제 두 수를 센다.
$$\text{층당 총} \approx \underbrace{67\text{M}}_{\text{어텐션}} + \underbrace{8 \times 134\text{M}}_{\text{전문가 8개}} = 67\text{M} + 1{,}074\text{M} \approx 1{,}141\text{M}$$
$$\text{층당 활성} \approx \underbrace{67\text{M}}_{\text{어텐션}} + \underbrace{2 \times 134\text{M}}_{\text{뽑힌 전문가 2개}} = 67\text{M} + 268\text{M} \approx 335\text{M}$$
이것을 32층으로 쌓고 임베딩 $V\times d_{model} \approx 5$ 억 2천만(언임베딩과 공유하면 한 벌)을 더한다.
$$\text{총 파라미터} \approx 32 \times 1{,}141\text{M} + 524\text{M} \approx 37.0\text{B}$$ $$\text{활성 파라미터} \approx 32 \times 335\text{M} + 524\text{M} \approx 11.3\text{B}$$
같은 32층 dense였다면(1.4.15) 약 7B였다. MoE로 전문가를 8개 둔 결과, 메모리에 이고 다녀야 할 파라미터는 37B로 5배 넘게 불었지만, 토큰 하나를 처리하는 계산은 11.3B 규모의 모델과 같다. 메모리 비용은 총 파라미터가, 계산 비용은 활성 파라미터가 지배한다 — 이 둘의 분리가 MoE의 전부다.
비율을 주목하라. 활성/총 $\approx 11.3/37.0 \approx 0.31$ 이다. 순진하게는 top-2 of 8이니 $k/N = 2/8 = 0.25$ 를 기대하지만 실제로는 0.31로 더 높다. 차이는 공유부(어텐션 + 임베딩)에서 온다 — 이 부분은 전문가와 무관하게 항상 활성이라, 전문가 파라미터만 놓고 보면 $k/N$ 이 맞지만 공유부를 더하면 활성 비율이 올라간다. 공유부가 클수록(작은 모델일수록, 또는 어텐션 비중이 큰 설계일수록) 활성/총이 $k/N$ 에서 위로 벌어진다. 실제 공개된 예로 Mixtral 8×7B는 총 약 46.7B에 토큰당 활성 약 12.9B로 알려져 있는데, "8×7=56B가 아닌 46.7B"인 이유가 바로 이것이다 — 어텐션·임베딩 같은 공유부는 8벌 복제되지 않기 때문이다.
이 회계가 서빙에 던지는 함의는 5.1.12에서 이미 다뤘지만 여기서 분명히 하자. MoE는 디코드에서 오히려 불리해질 수 있다. 디코드는 대역폭 바운드라 스텝 시간이 "읽어야 할 가중치 바이트 ÷ 대역폭"으로 정해지는데(5.1.6), 배치 안 토큰들이 서로 다른 전문가로 흩어지면 결국 여러 전문가의 가중치를 읽게 되어, FLOP은 활성 파라미터(11B)만큼인데 읽는 바이트는 그보다 훨씬 많아진다. "계산은 11B, 메모리 트래픽은 37B에 가까울 수 있음"이 MoE 서빙의 불편한 진실이다.
1.6.5 라우팅 붕괴와 로드 밸런싱 보조손실
MoE의 고질병은 라우팅 붕괴(routing collapse)다. 학습 초기에 우연히 조금 더 잘 뽑히는 소수 전문가로 토큰이 몰리면, 그 전문가만 더 많은 그래디언트를 받아 더 좋아지고, 그래서 더 몰린다 — 전형적인 부익부다. 나머지 전문가는 토큰을 거의 못 받아 학습이 멈추고, 결국 살아 있는 전문가 몇 개만 일하는 사실상 dense 소형 모델로 퇴화한다. 파라미터는 37B를 이고 다니는데 실제로는 몇 개 전문가만 쓰는, 최악의 낭비다.
여기에 하드웨어 제약이 겹친다. GPU에서 각 전문가는 미리 정해 둔 고정 용량(capacity)만큼만 토큰을 처리한다 — 배치가 정해지면 텐서 모양이 고정돼야 하기 때문이다. 그래서 인기 전문가로 용량을 넘겨 몰린 토큰은 버려지거나(token dropping) 계산 없이 잔차로 그대로 통과하고, 반대로 한산한 전문가는 빈 슬롯만큼 계산을 낭비한다. 불균형은 품질과 효율을 동시에 잠식한다.
대책의 핵심은 라우팅을 고르게 퍼뜨리도록 유도하는 로드 밸런싱 보조손실(auxiliary loss)을 주손실에 더하는 것이다. Switch Transformer 계열의 형태를 개념적으로 쓰면
$$\mathcal{L}_{\text{aux}} = \alpha \cdot N \sum_{i=1}^{N} f_i\, P_i$$
이고, 여기서 $f_i$ 는 이 배치에서 실제로 전문가 $i$ 로 라우팅된 토큰의 비율(하드, 이산), $P_i$ 는 전문가 $i$ 에 대한 라우터 확률의 배치 평균(소프트, 미분 가능)이다. 왜 하필 $f_i$ 와 $P_i$ 를 곱하는지가 이 식의 묘미다. 우리가 정말 균등하게 만들고 싶은 것은 부하 $f_i$ 지만, $f_i$ 는 argmax에서 나온 이산량이라 미분이 안 된다 — 그래서 학습으로 직접 밀 수가 없다. 그래서 미분 안 되는 부하 $f_i$ 를, 미분 되는 확률 $P_i$ 와 짝지어 곱한다. 어떤 전문가가 실제로 과부하($f_i$ 큼)라면, 그 전문가의 확률 $P_i$ 에 큰 계수가 붙어 그래디언트가 라우터로 하여금 그 전문가의 확률을 낮추도록 민다. 결국 $f_i$ 는 "어디가 과부하인지 알려주는 미분 불가능한 신호"이고, $P_i$ 는 "그 신호를 받아 실제로 조정되는 미분 가능한 손잡이"인 셈이다. 합 $\sum_i f_i P_i$ 는 부하와 확률이 특정 전문가에 동시에 쏠릴수록 커지고, 완전 균등($f_i = P_i = 1/N$)에서 최소가 된다.
세기 계수 $\alpha$ 가 상충 관계의 조정 변수다. 너무 작으면 붕괴를 못 막고, 너무 크면 라우터가 품질보다 균형에만 신경 써 "아무 전문가나 고르게" 되어 주손실(=언어모델 품질)을 저하시킨다. 주손실과 보조손실 사이의 이 긴장이 MoE 학습 튜닝에서 가장 예민한 지점이다. 여기에 용량 계수(capacity factor)라는 조정 변수가 하나 더 있다 — 전문가당 용량을 $\text{cap\_factor} \times (\text{배치 토큰 수}/N)$ 로 설정하는데, 1보다 키우면 쏠림을 더 받아주는 대신 메모리·계산이 늘고, 작게 설정하면 토큰 드롭이 늘어난다.
최근에는 보조손실이 품질을 잠식하는 부작용 자체를 피하려는 흐름도 있다. 보조손실로 라우터를 직접 벌하는 대신, 라우터 점수에 전문가별 편향(bias)을 하나씩 두고 그 편향만 관측된 부하에 따라 조정해 균형을 맞추는 방식(auxiliary-loss-free load balancing, DeepSeek 계열이 제안)이다. 과부하 전문가의 편향을 내려 덜 뽑히게 하는 식이라, 주손실의 그래디언트를 오염시키지 않는다. "보조손실보다 품질 손해가 적다"는 것은 그 논문들의 주장이며 설정에 의존하지만, 방향 — 균형을 강제하되 언어모델 손실을 변경하지 않으려는 — 은 분명하다.
1.6.6 MoE가 계산을 아낀 대가
MoE는 계산을 아꼈지만 그 비용은 사라진 것이 아니라 다른 축으로 이동했다. 어디로 갔는지를 정확히 알아야 MoE를 언제 쓸지 판단할 수 있다.
가장 크게 이동한 것은 메모리(VRAM)다. 활성은 $k$ 개뿐이어도 어느 전문가가 뽑힐지는 토큰마다 다르므로, 모든 전문가의 파라미터가 항상 메모리에 상주해야 한다. 앞 절의 예시 모델은 계산은 11B급이지만 메모리는 37B급을 요구한다 — "계산은 소형, 메모리는 대형"인 기묘한 모델이다. 그래서 MoE는 dense보다 VRAM 압박이 훨씬 크고, 양자화(5.2)나 전문가 오프로딩이 더 절실해진다. 단일 GPU나 엣지처럼 메모리가 부족한 환경에서는 MoE의 이점이 그대로 약점이 된다.
두 번째는 통신이다. 전문가가 많아지면 한 GPU에 다 못 적재하므로 전문가들을 여러 GPU에 나눠 배치하는데(전문가 병렬, expert parallelism, 2.4), 그러면 각 토큰이 자기가 뽑은 전문가가 있는 GPU로 가야 한다. 이 이동이 매 MoE 층마다 all-to-all 통신을 부른다 — 모든 GPU가 모든 GPU로 토큰을 주고받는, 인터커넥트 대역폭을 크게 차지하는 패턴이다. FFN 계산 자체는 싸졌는데 그 앞뒤로 토큰을 흩뿌리고 다시 모으는 통신이 추가되어, 대역폭이 좁은 클러스터에서는 이 통신이 스케일링을 제한한다. 계산에서 아낀 것을 통신에서 일부 토해내는 셈이다.
세 번째는 서빙의 부하 불균형과 예측 불가능성이다. 배치 안 토큰들이 서로 다른 전문가로 흩어지면 전문가별 실효 배치 크기가 불균일해져, 어떤 전문가는 가득 차고 어떤 전문가는 텅 빈 채로 계산해 GPU 활용도가 떨어진다. 게다가 라우팅이 입력에 의존하니 어느 요청이 어느 전문가들을 깨울지, 따라서 얼마나 걸릴지를 미리 알기 어렵다 — 연속 배칭·프리픽스 캐시(5.3)와의 상호작용이 dense보다 훨씬 복잡해진다. 마지막으로 학습 안정성도 대가다. 이산 라우팅·토큰 드롭·보조손실 튜닝이 겹쳐 dense보다 손실 스파이크와 발산이 잦다(2.6).
정리하면, MoE는 학습·추론 FLOP이 실제 병목이고 그것을 감당할 메모리·통신 인프라(멀티 GPU·빠른 인터커넥트)가 갖춰졌을 때 빛난다. 반대로 VRAM이 부족하거나 배치가 작아 all-to-all이 불리한 환경에서는 같은 활성 파라미터의 dense가 운영이 훨씬 단순하다. 내 견해로는, "MoE = 무조건 큰 모델을 싸게"라는 인상은 위험하다 — 계산만 저렴하고, 메모리·통신·운영 복잡도라는 비용이 뒤에서 날아온다. 인프라가 그 비용을 감당할 수 있을 때에만 MoE가 남는 장사다.
1.6.7 KV 캐시라는 병목 — 어텐션 변형이 왜 필요한가
이제 두 번째 축, 어텐션으로 넘어간다. 그전에 왜 어텐션의 메모리가 문제인지를 산식으로 확정해야 한다 — MQA·GQA·MLA의 존재 이유가 전부 여기서 나온다. 상세는 5.1이지만 결론만 가져오자.
자기회귀 디코드에서 새 토큰 하나를 만들 때, 그 토큰의 질의는 과거 모든 토큰의 키·값과 어텐션한다. 인과 마스킹 덕에 과거 토큰의 키·값은 미래에 바뀌지 않으므로(1.4.10), 매번 재계산하는 대신 KV 캐시에 저장해 재사용한다. 이 캐시의 크기가 5.1.4의 산식대로
$$\text{KV 캐시 바이트} = 2 \times n_{\text{layers}} \times n_{\text{kv-heads}} \times d_{\text{head}} \times b \times L \times B$$
이다. 앞의 2는 키와 값, $n_{\text{kv-heads}}$ 는 KV 헤드 수, $b$ 는 정밀도 바이트(fp16이면 2), $L$ 은 시퀀스 길이, $B$ 는 배치다. 이 식에서 두 가지가 결정적이다. 첫째, KV 캐시는 $L$ 과 $B$ 에 선형으로 자란다 — 긴 컨텍스트·큰 배치에서 캐시가 모델 가중치보다 큰 메모리를 차지할 수 있다. 둘째, 디코드는 대역폭 바운드라 매 스텝 이 캐시 전체를 읽어야 하므로(5.1.6), 캐시가 크면 토큰당 속도까지 느려진다. 용량과 대역폭, 두 방향으로 동시에 제약한다.
이 식에서 우리가 손댈 수 있는 인자를 보자. 2, $b$, $L$, $B$ 는 어텐션 구조로 바꾸기 어렵거나(2는 K·V라 고정, $L$·$B$ 는 워크로드가 정함) 다른 장의 몫이다($b$ 는 양자화, 5.2). $n_{\text{layers}}$ 도 모델 크기가 정한다. 남는 것은 $n_{\text{kv-heads}}$ 다. KV 헤드 수 하나만 줄이면 캐시가 그 비율로 곧장 줄어든다. 1.4.8에서 봤듯 어텐션 헤드는 상당히 중복이라, 품질을 크게 잃지 않고 이 인자를 줄일 여지가 있다는 관찰 — 이것이 이어지는 세 변형의 공통 출발점이다.
1.6.8 MHA에서 MQA·GQA로 — KV 헤드를 줄이다
1.4의 멀티헤드 어텐션(MHA)은 질의·키·값을 각각 $n_{\text{heads}}$ 개 헤드로 나눠 독립 어텐션을 병렬 수행한다. 즉 질의 헤드 수 = 키/값 헤드 수 = $n_{\text{heads}}$ 다. 표현력은 최고지만 KV 헤드가 많아 캐시가 크다. 핵심 관찰은 이것이다 — 어텐션 품질의 상당 부분은 질의 헤드의 다양성에서 나오고, 키·값은 여러 질의 헤드가 공유해도 생각보다 손실이 작다. 그렇다면 질의 헤드 수는 그대로 두고 키·값 헤드만 줄이자.
MQA(Multi-Query Attention)가 가장 극단이다. 질의 헤드는 $n_{\text{heads}}$ 개 그대로 두되 키·값 헤드는 단 하나로 만들어, 모든 질의 헤드가 그 하나의 키·값을 공유한다. KV 캐시가 $n_{\text{heads}}$ 분의 1로 줄어든다. 그런데 이렇게까지 줄이면 키·값의 다양성이 사라져 품질이 떨어질 수 있고, 특히 MHA로 학습한 모델을 사후에 MQA로 바꾸면 학습이 불안정해지고 성능이 떨어진다는 보고가 있다. 그래서 처음부터 MQA로 학습하거나, 아래 GQA로 절충한다.
GQA(Grouped-Query Attention)는 MHA와 MQA를 잇는 조정 변수다. 질의 헤드를 $g$ 개 그룹으로 묶고 그룹마다 키·값 헤드 하나를 공유한다. $g = n_{\text{heads}}$ 면 MHA, $g=1$ 이면 MQA이고, 그 사이를 매끄럽게 고를 수 있다. 극단의 품질 손실 없이 캐시를 몇 배 줄일 수 있어, 최근 오픈 웨이트 모델의 사실상 기본값이 됐다(Llama 2 70B와 Llama 3 계열 등이 GQA를 쓴다).
절감량을 5.1의 산식으로 수계산해 보자. 5.1.4의 8B 예시 모델을 그대로 쓴다 — $n_{\text{layers}}=32$, 질의 헤드 32개, $d_{\text{head}}=128$, fp16($b=2$). MHA면 $n_{\text{kv-heads}}=32$ 라 토큰당 KV는
$$2 \times 32 \times 32 \times 128 \times 2 = 524{,}288\ \text{bytes} = 512\ \text{KB/토큰}$$
이다. 여기서 질의 헤드 32개를 8그룹으로 묶는 GQA 4:1(질의 4개당 KV 1개, $n_{\text{kv-heads}}=8$)로 바꾸면, 산식에서 32를 8로 바꾼 것뿐이라
$$2 \times 32 \times 8 \times 128 \times 2 = 131{,}072\ \text{bytes} = 128\ \text{KB/토큰}$$
으로 정확히 4분의 1이 된다. 컨텍스트 $L=8192$, 배치 $B=32$ 에서 계산하면 MHA는 128 GB, GQA 4:1은 32 GB다 — 같은 80 GB GPU에서 가중치 16 GB를 빼고 남는 60 GB 안에 MHA는 겨우 배치 15가량, GQA는 배치 60가량이 들어간다. KV를 4배 줄이면 같은 GPU로 4배의 동시 요청을 처리한다(5.1.5). 처리량이 배치에 크게 좌우되므로(5.1.8), 이것이 GQA가 서빙에서 그토록 중요한 이유다. MQA로 끝까지 밀면 $n_{\text{kv-heads}}=1$ 이라 토큰당 16 KB, MHA의 32분의 1까지 내려간다.
MHA로 학습한 모델을 소량의 추가 학습으로 GQA로 변환(uptraining)해 사후에 캐시를 줄이는 것도 가능하다고 보고된다. 다만 이것은 무비용 스위치가 아니라 재학습이 드는 변환이라는 점 — 아무 모델이나 서빙 시점에 GQA로 바꿔 캐시를 줄일 수 있다는 오해는 위험하다.
1.6.9 MLA — 잠재 공간에 KV를 압축하다
MQA·GQA가 "KV 헤드 수를 줄이자"였다면, MLA(Multi-head Latent Attention, DeepSeek-V2/V3 계열)는 접근이 다르다. KV 헤드 수는 손대지 않고, 대신 키·값을 저차원 잠재 벡터로 압축해 캐시에는 그 잠재 벡터만 저장하고, 어텐션을 계산할 때 필요한 키·값을 잠재에서 즉석으로 복원한다. 저랭크 투영으로 KV를 병목에 통과시키는 셈이다.
$$c = W_{\text{down}}\, x \ (\text{작은 차원 } d_c), \qquad K \approx c\, W_K^{\text{up}}, \quad V \approx c\, W_V^{\text{up}}$$
핵심은 캐시 크기가 헤드 수가 아니라 잠재 차원 $d_c$ 로 정해진다는 점이다. 여러 질의 헤드의 다양성은 상향투영 $W_K^{\text{up}}, W_V^{\text{up}}$ 이 잠재에서 각 헤드의 키·값을 서로 다르게 펼쳐 되살리므로 유지되면서, 저장하는 것은 압축된 $c$ 하나뿐이다. GQA가 "여러 헤드가 같은 KV를 공유"해 다양성을 희생하며 캐시를 줄인 것과 달리, MLA는 "다양성은 상향투영으로 복원하되 캐시는 압축본만"이라는 다른 절충을 노린다.
절감량을 앞과 같은 8B 설정에서 대략 세어 보자. MHA는 토큰당 층마다 키·값 원소가 $2 \times 32 \times 128 = 8192$ 개다. 잠재 차원을 $d_c = 512$ 로 설정하면(여기에 위치용 작은 성분이 더 붙는다, 아래) 캐시에 남는 것은 층마다 약 $512{+}64 \approx 576$ 개 원소로, MHA의 8192개 대비 대략 14분의 1이다. GQA 4:1이 층마다 $2\times 8\times 128 = 2048$ 개였으니, MLA는 그보다도 약 3.5배 작다. 32층·fp16으로 환산하면 MHA 512 KB/토큰, GQA 4:1 128 KB/토큰, MLA 대략 36 KB/토큰 수준이다(정확한 값은 $d_c$ 설정에 따라 달라진다).
여기 걸림돌이 하나 있다 — RoPE다. 1.5의 RoPE는 위치에 따라 키에 회전을 가하는데, 이 회전은 잠재 압축과 명료하게 교환되지 않는다(위치별 회전을 저랭크 상향투영에 흡수시킬 수 없다). 그래서 MLA는 위치 정보를 나르는 작은 키 성분을 분리(decoupled RoPE)해, 압축 대상인 내용 성분과 별도로 위치 성분을 따로 캐시한다. 위 계산의 "+64"가 이 분리된 RoPE 성분이다. 또 하나의 실무 디테일은, 상향투영 행렬을 질의·출력 투영에 미리 흡수(absorb)해 두면 디코드 때 전체 키·값을 실제로 재구성하지 않고도 어텐션을 계산할 수 있어 계산 부담을 관리한다는 점이다. 이 두 장치 때문에 MLA는 GQA보다 구현이 확실히 복잡하다.
"MLA가 GQA/MQA보다 작은 캐시로 MHA에 준하는 품질을 낸다"는 것은 이를 제안한 논문들의 주장이며, 재현과 일반화는 설정에 의존한다. 확실한 것은 트레이드오프의 성격이다 — MLA는 "작은 캐시 + 높은 품질"을 동시에 노리되, 그 대가로 상향투영·분리 RoPE·행렬 흡수라는 구현·학습 복잡도를 지불한다.
1.6.10 네 변형을 언제 쓰나
네 어텐션 변형을 한 표로 놓고 축을 읽어 보자. 위에서 아래로 내려갈수록 KV 캐시는 대체로 작아지고, 키·값 다양성은 대체로 줄어든다 — MLA만이 이 대각선을 깨려는 시도다.
| 변형 | KV 헤드 | KV 캐시(8B 예시, 토큰당) | 품질 성향 | 구현 | 대표 예 |
|---|---|---|---|---|---|
| MHA | $n_{\text{heads}}$ | 512 KB (1×) | 최고 | 단순 | 초기 GPT·BERT 계열 |
| GQA | $g$ 그룹 | 128 KB (4:1일 때 1/4×) | MHA에 근접, 그룹으로 조절 | 단순 | Llama 2 70B·Llama 3 |
| MQA | 1 | 16 KB (1/32×) | 하락 가능 | 단순 | PaLM 등 |
| MLA | (잠재 $d_c$) | 약 36 KB | MHA 근접 주장 | 복잡(상향투영·분리 RoPE) | DeepSeek-V2/V3 |
실무 다수는 GQA로 안전하게 절충한다. 4:1이나 8:1 정도로 캐시를 몇 배 줄이면서 품질 손실은 작게 가져가는 것이 지금의 기본값이다. 캐시가 극단적으로 병목이고(엣지 배포나 초대형 배치) 품질 여유가 있으면 MQA를 고려하고, 처음부터 MQA로 학습해 안정성을 확보한다. 작은 캐시와 높은 품질을 둘 다 원하고 그 복잡도를 감당할 팀이라면 MLA가 후보인데, 이것은 프런티어 규모에서 인프라를 직접 운용하는 소수에게 어울리지 이제 막 서빙을 구축하는 팀이 첫 카드로 꺼낼 것은 아니다. 이 선택이 서빙 처리량·메모리에 어떻게 반영되는지는 5.1·5.6에서 다시 만난다.
1.6.11 롱컨텍스트 — RoPE는 왜 학습 길이 밖에서 붕괴하나
세 번째 축은 컨텍스트 길이다. 여기엔 서로 다른 두 문제가 겹쳐 있다 — 위치 인코딩이 학습 길이 밖에서 깨지는 외삽(extrapolation) 문제와, 길이에 따라 비용이 폭증하고 품질이 변동하는 문제. 먼저 외삽부터 보자.
1.5의 RoPE는 위치 $m$ 에서 질의·키 벡터를 주파수별 각도만큼 회전시킨다. 차원 쌍 $i$ 의 회전 속도는 $\theta_i = b^{-2i/d}$ 로, 흔히 base $b = 10000$ 을 쓴다($i$ 가 클수록 저주파, 즉 천천히 회전). 어텐션 점수가 두 위치의 상대 각도에 의존하므로, 위치 $m$ 과 $n$ 사이의 어텐션은 결국 $\cos((m{-}n)\theta_i)$ 와 $\sin((m{-}n)\theta_i)$ 를 통해 상대 거리 $m{-}n$ 에만 의존한다.
문제는 학습이 상대 거리를 $L_{\text{train}}$ 범위 안에서만 봤다는 데 있다. 저주파 성분($\theta_i$ 가 작은 쌍)은 이 범위 안에서 각도가 아주 조금밖에 회전하지 않는다 — 모델은 이 성분의 큰 각도를 학습 중 한 번도 본 적이 없다. 숫자로 살펴보자. $d_{\text{head}}=128$, $b=10000$ 에서 가장 느린 쌍($i=63$)의 회전 속도는
$$\theta_{63} = 10000^{-126/128} \approx 10000^{-0.984} \approx 1.15\times 10^{-4}\ \text{rad/위치}$$
이다. 이 성분의 한 바퀴(주기)는 $2\pi/\theta_{63} \approx 54{,}600$ 위치나 된다. 학습 길이가 $L_{\text{train}}=4096$ 이면 이 성분이 학습 중 도달한 최대 각도는 $4096 \times 1.15\times10^{-4} \approx 0.47$ rad — 한 바퀴의 채 8%도 안 된다. 그런데 컨텍스트를 128K로 밀면 이 각도가 $128000 \times 1.15\times10^{-4} \approx 14.7$ rad, 약 2.3바퀴에 이른다. 학습에서 0.47 rad까지만 본 성분에 갑자기 14.7 rad를 넣으니, 어텐션이 완전히 분포 밖(out-of-distribution) 값을 마주해 출력이 붕괴한다. 4K로 학습한 모델에 32K를 그대로 넣으면 급격히 나빠지는 이유가 이 각도 계산에 있다.
그래서 "컨텍스트 확장"이란 곧 먼 위치의 회전 각도를 학습이 본 범위 안으로 어떻게 되돌리느냐의 문제가 된다. 위치를 없앨 수는 없으니, 각도를 재배치하는 것이다.
1.6.12 위치 보간·NTK·YaRN
세 가지 대표 기법이 있고, 모두 RoPE 각도를 조정해 긴 위치를 학습 범위로 되돌린다는 공통 골격 위에 있다.
위치 보간(Position Interpolation, PI)은 위치 인덱스 자체를 선형으로 압축한다. 목표 길이 $L'$ 를 학습 길이 $L$ 안으로 압축해 넣도록
$$m \ \longrightarrow\ m \cdot \frac{L}{L'}$$
로 바꿔 모든 각도를 $L/L'$ 배 줄인다. 앞 절의 예로 128K를 4K 학습 범위로 되돌리려면 위치를 32분의 1로 압축하는 셈이라, 저주파 성분의 최대 각도가 다시 학습이 본 0.47 rad 근처로 내려온다. 단순하고 안정적이지만 대가가 있다 — 인접 토큰 사이의 각도 차도 같이 조밀해져, 가까운 위치(고주파)의 해상도가 떨어진다. 바로 옆 토큰과 몇 칸 떨어진 토큰을 구별하는 세밀함을 희생하는 것이다. 보통 소량의 파인튜닝이 뒤따라야 품질이 회복된다.
NTK-aware 스케일링은 "모든 주파수를 똑같이 누르는 게 손해"라는 관찰에서 출발한다. 고주파 성분(가까운 위치를 담당, 이미 학습 중 여러 바퀴 회전해 잘 샘플링됨)은 건드릴 필요가 없고, 문제는 저주파뿐이다. 그래서 PI처럼 위치를 압축하는 대신 RoPE의 base $b$ 를 키운다. base를 키우면 저주파는 더 느려져(각도가 거리에 따라 더 천천히 늘어 학습 범위 안에 머묾) 확장되지만 고주파는 거의 그대로라, 세밀함을 덜 희생하며 범위를 넓힌다("NTK"는 신경 탄젠트 커널 직관에서 온 이름일 뿐, 여기선 base 조정이 핵심이다). 파인튜닝 없이(dynamic NTK) 어느 정도 되는 경우가 있다는 점이 매력이지만 극단적 확장에서는 한계가 있다.
YaRN(Yet another RoPE extensioN)은 주파수 대역을 나눠 band별로 다르게 처리하고(NTK-by-parts — 어떤 대역은 보간, 어떤 대역은 외삽), 여기에 어텐션 온도(스케일) 보정을 더한다. 각도를 늘리면 어텐션 분포의 뾰족함이 미묘하게 달라지는데, 온도를 보정해 이를 되돌리는 것이다. "더 적은 파인튜닝 토큰으로 더 길게, 더 잘"이 YaRN이 내세우는 것이다.
| 기법 | 무엇을 조정 | 파인튜닝 | 대가 |
|---|---|---|---|
| PI(선형 보간) | 위치 인덱스를 선형 압축 | 보통 필요 | 가까운 위치 해상도↓ |
| NTK-aware | RoPE base $b$ 확대 | 없이도 일부 가능 | 극단 확장서 한계 |
| YaRN | band별 조정 + 온도 보정 | 소량 | 구현 복잡 |
셋의 우열은 길이·모델·데이터·평가셋에 따라 갈린다. "YaRN이 항상 최고"가 아니라 PI는 단순·안정, NTK는 무학습 편의, YaRN은 효율이라는 성향으로 기억하는 편이 정확하다. 그리고 어떤 방식이든 학습 길이를 크게 넘기면 품질이 서서히 저하된다 — 각도 재배치는 없던 능력을 만들지 않고, 학습 범위 밖으로 밀수록 근사가 나빠진다.
1.6.13 슬라이딩 윈도우·희소·블록 어텐션
RoPE 확장이 "위치를 어떻게 인코딩하나"를 다뤘다면, 이쪽은 다른 질문을 던진다 — 정말 모든 토큰이 모든 토큰을 봐야 하나? 풀 어텐션은 질의 $L$ 개 × 키 $L$ 개 = $O(L^2)$ 이라 길이가 늘면 프리필이 제곱으로 비용이 커진다(1.4.15에서 $n$ 이 대략 $6 d_{model}$, 즉 이 책 예시로 2만 4천 토큰을 넘으면 어텐션 항이 전체 계산을 지배함을 셌다). 대부분의 의존은 국소적이라는 관찰에서, 어텐션 범위를 제한한다.
슬라이딩 윈도우 어텐션은 각 토큰이 직전 $w$ 개만 보게 한다 — 계산이 $O(L\cdot w)$ 로 선형이 된다. 한 층에서는 $w$ 칸만 보지만, 층을 쌓으면 수용 범위가 깊이에 비례해 커진다. 층 $\ell$ 개면 유효 범위가 대략 $\ell \cdot w$ 로, 층을 거쳐 먼 정보가 간접적으로 전달된다 — 1.4.1에서 CNN이 층을 쌓아 수용장을 넓히던 것과 같은 원리다. 로컬 + 전역 토큰 방식은 대부분 토큰은 국소만 보되 소수의 특별 토큰(요약용·문장 시작 토큰 등)은 전체를 보고 전체가 그것을 보게 해, 국소성과 전역 소통을 함께 얻는다. 희소 패턴(strided·dilated)은 고정 간격으로 띄엄띄엄 보게 해 계산을 더 낮춘다.
대가는 분명하다 — 창 밖 토큰과의 직접 상호작용이 사라져, 아주 먼 거리의 정밀한 참조(앞부분의 정의를 뒷부분에서 정확히 인용하는 것 같은)에는 약해진다. 층을 거친 간접 전달은 있지만, 어텐션의 원래 강점인 "임의의 두 토큰을 $O(1)$ 경로로 직접 잇기"(1.4.1)를 국소성과 맞바꾼 것이다. 그래서 실무는 일부 층만 풀 어텐션으로 두고 나머지는 윈도우로 실행하는 식으로 섞는다 — 국소 처리는 저렴하게 하되 몇 개 층에서 전역 참조를 살리는 절충이다. 1.4.9에서 본 어텐션 싱크가 여기서 다시 실무 문제로 온다는 점도 기억할 만하다. 슬라이딩 윈도우로 오래된 토큰을 캐시에서 버릴 때 싱크 토큰(보통 맨 앞)까지 버리면 어텐션 분포가 망가지므로, 롱컨텍스트 서빙은 첫 몇 토큰을 항상 남긴다(5.6).
1.6.14 광고 컨텍스트와 유효 컨텍스트
컨텍스트를 늘릴 수 있게 됐다고 추가 비용 없이 좋아지는 것이 아니다. 두 종류의 비용이 남는다 — 계산·메모리 비용과, 더 미묘한 품질 비용이다.
계산·메모리 쪽은 이미 여러 번 봤다. 프리필이 $O(L^2)$ 라 프롬프트가 길수록 첫 토큰 지연(TTFT)이 제곱으로 커지고(5.1.9), KV 캐시가 $O(L)$ 라 128K 컨텍스트면 KV만 수십 GB에 이른다(5.1.4에서 8B MHA로 64 GB를 셌다). 그래서 롱컨텍스트 서빙에서는 GQA·MLA로 KV 헤드를 줄이고, KV를 양자화하고, 프리픽스 캐시로 공유 프롬프트를 재사용하고, 오프로딩까지 동원하는 것이 특히 절실하다(5.6). 컨텍스트 길이는 무료 기능이 아니라 서빙 비용을 정면으로 높이는 조정 변수다.
품질 쪽이 더 자주 오해받는다. 길게 넣을 수 있다고 길게 잘 쓰는 것은 아니다. 몇 가지 구체적 현상이 있다. 하나는 "lost in the middle"이라 불리는 경향으로, 긴 컨텍스트에서 모델이 맨 앞과 맨 뒤의 정보는 잘 쓰지만 중간에 묻힌 정보는 놓치는 패턴이 여러 연구에서 보고됐다. 이것은 물리 법칙이 아니라 모델·프롬프트·평가 방식에 의존하는 경향이며, 최신 모델들은 상당히 개선됐다는 보고도 있으니 "긴 컨텍스트 모델은 항상 중간을 못 본다"고 단정해선 안 된다 — 반대로 "완전히 극복됐다"도 단정할 수 없다. 둘은 벤치마크의 함정이다. 긴 문서에 문장 하나를 심어 두고 찾게 하는 "바늘 찾기(needle-in-a-haystack)" 테스트를 통과해도, 여러 곳의 정보를 종합·추론하는 능력은 별개다. 쉬운 회수(retrieval)만 재는 벤치마크는 실전 이해를 과대평가한다.
여기서 마케팅과 실측을 갈라야 한다. "1M 토큰 지원"은 "1M 전체를 균일하게 잘 활용"과 다르다 — 광고된 최대 길이와, 실제로 품질이 유지되는 유효 길이는 별개다. 내 견해로는, 컨텍스트를 맹목적으로 채우는 것은 대개 나쁜 전략이다. 비용은 $O(L^2)$·$O(L)$ 로 정직하게 오르는데 품질이 중간에서 저하되기 때문이다. 관련 정보를 추려 눈에 띄는 앞·뒤 위치에 배치하고(RAG·리랭크, 6.3·6.4) 정말 필요한 만큼만 넣는 편이 비용·품질 양쪽에 낫다. "길게 넣으면 알아서 잘하겠지"는 검증되지 않은 낙관이다.
1.6.15 어텐션을 버리는 길 — 선형 어텐션과 SSM
지금까지는 어텐션을 유지한 채 메모리·범위를 손봤다. 더 근본적인 갈래는 $O(L^2)$ 어텐션 자체를 다른 시퀀스 연산으로 교체하는 것이다. 목표는 둘 — 시퀀스 길이에 선형($O(L)$)인 스케일링과, 디코드 때 길이에 안 커지는 고정 크기 상태(즉 KV 캐시가 없는 세상). 깊은 수학은 1.4과 후속 연구에 넘기고 여기서는 무엇을 얻고 무엇을 내주는지를 본다.
선형 어텐션은 어텐션의 병목이 $\text{softmax}(QK^\top)$ 가 $L\times L$ 행렬을 만드는 데 있다는 데서 출발한다. softmax를 커널 특성맵 $\phi$ 로 근사하면 결합법칙을 바꿔 쓸 수 있다.
$$\text{softmax}(QK^\top)V \ \approx\ \phi(Q)\big(\phi(K)^\top V\big)$$
오른쪽에서 $\phi(K)^\top V$ 를 먼저 계산하면 이것은 $L$ 에 무관한 작은 행렬($d_k\times d_v$)이고, 여기에 $\phi(Q)$ 를 곱하는 비용이 $O(L d^2)$ 다 — $L\times L$ 행렬을 아예 만들지 않으므로 길이에 선형이다. 더 중요한 건 디코드에서다. 이 작은 행렬을 상태 $S$ 로 보고 토큰마다 $S_t = S_{t-1} + \phi(k_t) v_t^\top$ 로 누적하면, 어텐션이 고정 크기 상태를 갱신하는 순환(RNN)처럼 동작한다. 상태 크기가 컨텍스트 길이와 무관하니 KV 캐시가 없다. 대가는 softmax를 버린 것이다 — softmax의 날카로운 선택성(한 토큰에 급격히 쏠리는 능력)이 사라져, 정확한 회상과 표현력이 약해지는 경향이 있다.
상태공간모델(State Space Model, SSM)과 Mamba는 시퀀스를 선형 순환으로 본다.
$$h_t = A\, h_{t-1} + B\, x_t, \qquad y_t = C\, h_t$$
$h_t$ 는 고정 크기 상태로 길이에 안 커진다. 단순히 이렇게 두면 옛 RNN의 기울기 소실 문제(1.4.1)로 되돌아가지만, S4 계열은 $A$ 를 특별히 구조화(HiPPO 등)해 긴 의존을 안정적으로 담게 했다. Mamba는 여기서 한 걸음 더 나아가 $A, B, C$ 를 입력에 의존(selective)하게 만든다 — 어떤 토큰을 기억하고 어떤 토큰을 버릴지를 내용에 따라 정하게 해 표현력을 높이고, 이를 GPU에서 빠르게 실행되는 하드웨어 인지 스캔으로 계산한다. 서빙 이점이 크다. 학습은 병렬 스캔으로 $O(L)$, 디코드는 고정 크기 상태만 갱신해 토큰당 상수 시간·상수 메모리다 — 1.6.7에서 본 KV 캐시의 메모리·대역폭 장벽을 원천적으로 피한다.
트레이드오프는 한 문장으로 요약된다. SSM·선형 계열의 약점은 정확한 회상과 복사 — "앞에서 본 임의의 토큰을 뒤에서 정확히 집어내기"다. 어텐션은 과거 전체를 캐시에 들고 직접 참조하므로 이런 작업에 강하지만, 과거를 고정 크기 상태로 요약하는 SSM은 세부를 흘릴 수 있다(과제에 따라 다르다는 것이 연구들의 관찰이다). 반대로 긴 시퀀스의 처리량과 메모리는 SSM이 확실히 유리하다. 결국 무엇을 회상해야 하느냐가 갈림길이다.
1.6.16 하이브리드, 그리고 무엇을 언제
그래서 현재의 현실적 답은 어느 한쪽의 전면 승리가 아니라 섞는 것이다. 대부분의 층은 Mamba나 선형 어텐션으로 두어 저렴하고 길이에 강하게 가고, 몇 개 층만 풀 어텐션으로 두어 정확한 회상을 담당시킨다. Jamba·Zamba 같은 하이브리드가 이 방향이다. "SSM이 트랜스포머를 대체한다"보다 "어텐션의 부담을 나눠 진다"가 지금의 정직한 그림이고, 1.4.17에서 어텐션 대안을 두고 "차세대 구조가 트랜스포머를 완전히 대체했다는 서사는 과장"이라 한 것과 같은 결론이다.
| 접근 | 길이 스케일링 | 디코드 상태 | 강점 | 약점 |
|---|---|---|---|---|
| 풀 어텐션 | $O(L^2)$ | KV 캐시 $O(L)$ | 정확한 회상·표현력 | 길수록 비용·메모리 폭증 |
| 선형 어텐션 | $O(L)$ | 상수 상태 | 저렴하고 순환 추론 | 선택성·품질 손실 |
| SSM/Mamba | $O(L)$ | 고정 크기 상태 | 긴 시퀀스·상수 메모리 | 정확한 회상 약함 |
| 하이브리드 | 대부분 $O(L)$ + 일부 어텐션 | 혼합 | 비용·회상 절충 | 설계 복잡 |
이 장을 관통한 규칙을 마지막으로 다시 쥐자. 이 변형들은 전부 비용을 없애는 것이 아니라 옮긴다. MoE는 계산을 파라미터 메모리·통신으로, KV 축소는 메모리를 품질 위험으로, 희소 어텐션은 계산을 먼 참조로, SSM은 KV 캐시를 정확한 회상으로 바꾼다. 그래서 "지금 무엇이 최고냐"는 잘못된 질문이다 — 옳은 질문은 "내 병목이 어느 축이고, 그 축을 깎는 대가로 어느 축을 내줘도 되느냐"이다. 대부분의 실무는 극단이 아니라 절충값을 고른다. FLOP이 장벽이고 인프라가 받쳐 주면 MoE, KV가 서빙을 조이면 GQA(중간값이 안전하다), 긴 컨텍스트가 필요하면 RoPE를 확장하되 유효 길이의 한계를 인정하고 RAG로 보완하며, 초장문 처리량이 핵심이면 하이브리드를 본다. 그리고 특정 모델의 구성·우열은 몇 달 단위로 바뀌니, 외울 것은 모델 이름이 아니라 이 트레이드오프 축들이다.
이렇게 구성한 모델이 실제로 토큰을 출력하는 단계 — 이 확률분포에서 무엇을 어떻게 고를지 — 가 1.7다. 아키텍처가 "무엇을 계산하나"였다면, 다음은 "그 계산이 낸 분포에서 무엇을 샘플링하나"다.