LabHub

트랜스포머 — 어텐션을 손으로 계산한다 · 어텐션의 안쪽 · 이론

요즘 모델 지형과 인코더들

LabHub 에서 이어서 보기

한 줄 요약

2026년 현재 쓰이는 모델들은 어떤 마스크를 쓰는가, 무엇을 토큰으로 보는가, 계산을 어떻게 아끼는가 세 축으로 나뉜다.

왜 나눠 보아야 하는가 — 축 1, 마스크에 따른 세 계열

| 계열 | 마스크 | 잘하는 일 | 예 |
|---|---|---|---|
| 디코더 | 인과(뒤를 못 봄) | 이어 쓰기, 대화, 코드 | GPT, LLaMA, Claude, Qwen |
| 인코더 | 없음(양방향) | 분류, 검색용 임베딩 | BERT, RoBERTa, E5 |
| 인코더-디코더 | 둘 다 | 번역, 요약, 음성 인식 | T5, Whisper |

실무에서 중요한 갈림길 하나. 검색(RAG)의 임베딩에는 인코더 모델을 쓴다. 생성용 디코더 모델의 마지막 은닉 상태를 임베딩으로 쓰는 것은 대개 성능이 떨어진다 — 인과 마스크 때문에 뒤쪽 토큰만 앞을 보기 때문이다.

축 2 — 무엇을 토큰으로 보는가

트랜스포머는 텍스트 전용이 아니다. "벡터의 나열" 로 만들 수 있으면 무엇이든 넣는다. 그래서 인코더가 필요하다.

비전 인코더 (ViT 계열)

이미지를 패치로 잘라 토큰으로 만든다.

CNN 과의 차이는 국소성 가정이 없다는 것이다. CNN 은 가까운 픽셀끼리 먼저 본다는 구조를 처음부터 갖고 있다. ViT 는 첫 층부터 이미지 전체를 볼 수 있다. 그래서 데이터가 적으면 CNN 이 낫고, 많으면 ViT 가 이긴다.

CLIP 은 여기서 한 걸음 더 간다. 이미지 인코더와 텍스트 인코더를 따로 두고, 같은 쌍은 가깝게 다른 쌍은 멀게 학습한다. 그러면 이미지와 문장이 같은 공간에 놓인다. "고양이 사진" 이라는 문장 벡터로 이미지를 검색할 수 있게 되는 것이 이 때문이고, 요즘 멀티모달 LLM 대부분이 CLIP 계열 비전 인코더를 앞에 붙여 쓴다.

오디오 인코더 (Whisper 계열)

소리는 1초에 16,000개 샘플이다. 그대로 토큰으로 쓸 수 없다.

1. 로그-멜 스펙트로그램 으로 바꾼다 — 시간 × 주파수의 2차원 이미지가 된다. 멜 척도는 사람 귀가 낮은 주파수에 민감한 것을 반영한 눈금이다
2. 합성곱으로 시간축을 줄인다 — Whisper 는 stride 2 짜리 conv 로 절반으로 줄인다. 30초가 1,500 토큰이 된다
3. 그 위에 트랜스포머 인코더를 얹는다

전처리가 절반이다. 이 단계에서 정보를 어떻게 압축하느냐가 성능을 가른다. 텍스트의 토크나이저와 정확히 같은 역할이다.

Whisper 가 인코더-디코더인 이유도 여기 있다. 인코더가 소리 전체를 양방향으로 이해하고, 디코더가 글자를 하나씩 뱉는다.

그래서 멀티모달 LLM 은

이미지 → 비전 인코더 → 프로젝션 → [토큰들] ┐                                          ├→ 디코더 LLM → 글자텍스트 → 토크나이저 → [토큰들] ────────────┘

프로젝션 층 하나가 두 세계를 잇는다. 비전 인코더의 출력 차원을 LLM 의 임베딩 차원으로 맞춰 주는 작은 MLP 다. 학습할 때 이 부분만 먼저 맞추고(정렬 단계) 그다음 전체를 조금씩 푸는 방식이 흔하다.

축 3 — 계산을 어떻게 아끼는가

KV 캐시. 생성할 때마다 앞의 모든 토큰의 K·V 를 다시 계산할 필요가 없다. 저장해 두고 새 토큰 것만 더한다. 그래서 추론 메모리의 대부분은 모델 가중치가 아니라 KV 캐시다. 컨텍스트가 길어질수록 이게 지배적이 된다.

GQA(그룹 질의 어텐션). Q 헤드는 32개인데 K·V 헤드는 8개만 두고 4개씩 공유한다. KV 캐시가 4분의 1이 된다. 품질 손실이 거의 없어서 요즘 오픈 모델 대부분이 쓴다.

MoE(전문가 혼합). 각 층에 FFN 을 여럿 두고 토큰마다 2개쯤만 켠다. 총 파라미터는 크지만 한 토큰이 쓰는 계산은 작다. 다만 메모리에는 전부 올라가야 해서, 서빙 비용이 파라미터 수와 무관하다는 뜻은 아니다.

양자화. 가중치를 8비트나 4비트로 줄인다. 정확도 손실은 생각보다 작고 메모리는 크게 준다. 다만 KV 캐시는 별도로 양자화해야 효과가 난다.

FlashAttention. 근사가 아니다. 큰 점수 행렬을 통째로 메모리에 올리지 않고 타일 단위로 계산해 GPU 의 느린 메모리 접근을 줄인다. 수학적으로 정확히 같은 값이 나오면서 몇 배 빠르다.

컨텍스트를 어떻게 늘렸나

RoPE 가 열쇠다. 절대 위치를 더하는 대신 Q·K 를 각도만큼 회전시키면, 두 자리의 내적이 거리에만 의존하게 된다. 그러면 학습 때 본 적 없는 길이에도 어느 정도 통한다.

다만 컨텍스트가 길다는 것과 잘 쓴다는 것은 다르다. 긴 문맥의 중간에 있는 정보를 놓치는 현상(lost in the middle)이 잘 알려져 있다. 검색으로 필요한 조각만 넣는 편이 100k 를 통째로 넣는 것보다 정확한 경우가 많다.

고를 때 실제로 보는 것

1. 무엇을 마스크하는가 — 생성인가 이해인가
2. KV 캐시가 얼마나 드는가 — GQA 인가, 컨텍스트가 얼마나 긴가
3. 인코더가 무엇을 받는가 — 이미지·소리를 넣는다면 앞단 인코더의 전처리가 성능을 가른다
4. 양자화했을 때 무너지는가 — 배포 환경이 정해져 있다면 이게 첫 질문이다

파라미터 수는 넷 중 어디에도 없다. 실제로 서빙 비용과 품질을 가르는 것은 위의 넷이다.

현장에서

모델을 고르는 자리에서 실제로 오가는 질문은 성능 순위표가 아니라 이런 것들입니다. 검색에 쓸 임베딩인데 디코더 모델을 골라도 되는가, 문서가 한국어인데 이 토크나이저가 몇 배로 부풀리는가, 컨텍스트 128k 를 지원한다는데 그 길이에서 실제 지연이 얼마인가.

그리고 이 축들을 알면 벤더 문서를 읽는 속도가 달라집니다. '슬라이딩 윈도우 어텐션' 이라고 적혀 있으면 긴 문서의 앞부분을 잊는다는 뜻이고, 'GQA' 는 추론 메모리가 작다는 뜻이며, '인코더-디코더' 는 번역이나 요약에 강하다는 뜻입니다. 새 모델이 나올 때마다 처음부터 배우는 대신 이 좌표에 놓아 보면 됩니다.

사내에 올릴 모델을 고른다면 마지막으로 하나 더 봅니다 — 라이선스와 가중치 공개 범위입니다. 성능이 아무리 좋아도 상업적 사용이 막혀 있으면 후보에서 빠집니다.