부록1. 왜 트랜스포머인가: RNN에서 Mamba까지
트랜스포머 이전의 RNN이 왜 한계에 부딪혔는지. 병렬화 불가, 장거리 의존성, 고정 상태 벡터. 트랜스포머가 이걸 어떻게 해결했고, Mamba가 어디로 가고 있는지.
- 11. LLM은 텍스트를 어떻게 처리하는가
- 22. 입력 처리: 텍스트가 숫자가 되기까지
- 33. 어텐션: 새 토큰이 문맥을 얻는 과정
- 44. FFN: 지식이 저장된 곳
- 55. 조립: 토큰이 쌓이고 레이어가 깊어지는 과정
- 66. 추론: Prefill, Decode, KV 캐시
- 77. 출력 제어: 확률에서 토큰을 고르는 방법
- 88. 학습: 30억 개의 숫자가 조정되는 과정
- 99. 하드웨어: GPU, 메모리, 속도의 관계
- 1010. 모델 파일: 포맷, 양자화, 서빙 구조
- 1111. 실전 적용: 모델 선택부터 파이프라인까지
- 12부록1. 왜 트랜스포머인가: RNN에서 Mamba까지
본편에서는 트랜스포머를 "이미 존재하는 구조"로 놓고 내부 동작을 파고들었다. 이 부록에서는 한 발 뒤로 물러나서, 트랜스포머 이전에는 뭐가 있었고, 왜 바뀌었고, 이 다음에는 뭐가 올 수 있는지를 다룬다.
이전엔 뭘 썼나 — RNN
트랜스포머(2017) 이전의 주류는 RNN(Recurrent Neural Network)이었다.
RNN의 동작 방식:
"OOM" -> [상태1] -> "killer" -> [상태2] -> "가" -> [상태3] -> ...
토큰을 하나씩 순서대로 처리.
이전 토큰의 "상태"를 다음 토큰에 전달.
모든 이전 정보가 하나의 상태 벡터에 압축됨.한 줄로 정리하면, RNN은 토큰을 순서대로 처리하면서 이전 정보를 "상태 벡터"에 누적하는 구조다.
RNN의 한계 1: 병렬화 불가능
RNN 학습:
"OOM" -> [상태1] -> "killer" -> [상태2] -> ...
"killer"를 처리하려면 "OOM"의 상태1이 필요.
"가"를 처리하려면 "killer"의 상태2가 필요.
-> 순차적으로만 처리 가능. GPU 코어 16,384개가 있어도 1개만 사용.
트랜스포머 학습:
"OOM", "killer", "가", "nginx", "를" -> 동시에 처리 (행렬곱)
인과적 마스킹으로 미래 정보 차단하면서도 병렬 처리.
-> GPU 코어를 전부 활용.이건 학습 속도에서 치명적이었다. 트랜스포머가 GPU를 풀로 활용해서 수십 배 빠르게 학습할 수 있는 반면, RNN은 토큰을 하나씩 순차 처리해야 하니까 GPU가 놀고 있었다. GPU 수천 장을 사서 갖다 놔도 제대로 쓸 수 없었던 거다. 자원을 쏟아부을 수 없는 구조는 스케일링 경쟁에서 탈락할 수밖에 없다.
RNN의 한계 2: 장거리 의존성
RNN에서 "를"이 "OOM"을 참조하려면:
OOM의 정보 -> 상태1 -> 상태2 -> 상태3 -> 상태4 -> 상태5
매 단계마다 다른 정보와 섞이면서 희석됨.
토큰 100개 떨어져 있으면 100번 전달 -> 거의 소멸.
LSTM이 "게이트"로 개선했지만, 수백~수천 토큰 거리에서는 여전히 한계.
트랜스포머에서 "를"이 "OOM"을 참조하려면:
를의 Q . OOM의 K = 내적 1번. 끝.
거리 1이든 거리 10,000이든 동일한 연산.
중간 토큰을 거치지 않고 직접 참조.트랜스포머의 어텐션은 중간 토큰을 거치지 않고 직접 참조한다. 거리에 관계없이 동일한 연산이다. 이건 RNN 대비 결정적인 장점이다.
RNN의 한계 3: 고정 크기 상태 벡터
RNN:
모든 이전 정보를 하나의 "상태 벡터"에 압축.
상태 벡터 크기: 고정 (예: 1024차원)
토큰 10개의 정보 -> 1024차원에 압축 <- 아직 괜찮음
토큰 1000개의 정보 -> 1024차원에 압축 <- 병목. 정보 손실 불가피.
토큰 10만개의 정보 -> 1024차원에 압축 <- 거의 불가능.
비유: 100페이지 보고서를 포스트잇 1장에 요약하라는 것.
트랜스포머:
KV 캐시에 모든 토큰의 정보를 개별 저장.
토큰 10개 -> K,V 벡터 10개 저장
토큰 1000개 -> K,V 벡터 1000개 저장
토큰 10만개 -> K,V 벡터 10만개 저장 (메모리는 먹지만 정보 손실 없음)
비유: 100페이지를 100장 파일에 각각 보관하고, 필요할 때 꺼내보는 것.종합 비교
RNN/LSTM 트랜스포머
------------------ -------------- ------------------
학습 시 병렬화 X (순차 처리) O (행렬곱, GPU 최적)
장거리 의존성 약함 (전달 희석) 강함 (직접 참조)
정보 저장 고정 크기 벡터 토큰별 K,V 개별 저장
학습 속도 느림 빠름 (수십 배)
스케일링 한계 있음 데이터+파라미터 늘릴수록 성능 향상스케일링 법칙 — 트랜스포머의 진짜 무기
RNN은 데이터를 10배 늘려도 학습 시간이 10배 이상 걸리고, GPU를 추가해도 병렬화가 안 된다. 트랜스포머는 데이터 10배에 GPU 10배를 추가하면 학습 시간을 비슷하게 유지할 수 있다.
이 스케일링 특성 덕분에 "크게 만들수록 똑똑해진다"는 법칙이 성립했다. GPT-2(1.5B)에서 GPT-3(175B), 그리고 GPT-4로 이어지는 대규모 경쟁의 기반이 이거다.
트랜스포머의 약점
트랜스포머도 완벽하지 않다.
O(n^2) 문제:
어텐션이 모든 토큰 쌍을 계산 -> 토큰 수 제곱에 비례하는 비용.
RNN은 O(n) - 토큰이 늘어도 선형.
128K 토큰 어텐션 = 164억 번 계산 + 수십 GB 메모리.
KV 캐시 메모리:
RNN은 상태 벡터 1개만 유지 (고정 메모리).
트랜스포머는 모든 토큰의 K,V를 저장 (토큰 수에 비례).
추론 시 비효율:
Decode 단계에서 매 토큰마다 모든 W를 읽어야 하는 메모리 바운드.토큰이 늘어나면 O(n^2)로 비용이 폭증하고, KV 캐시가 VRAM을 잡아먹는다. 6편에서 다뤘듯이 128K 토큰이면 KV 캐시만 36GB다.
이후의 흐름 — Mamba/SSM
이 문제를 해결하려는 시도가 Mamba(State Space Model)다.
Mamba (State Space Model, 2023~):
RNN의 O(n) 효율성 + 트랜스포머의 장거리 의존성을 동시에 잡으려는 시도.
핵심 아이디어:
선택적 상태 공간 모델 - 입력에 따라 상태 전달 방식을 동적으로 조절.
RNN처럼 순차적으로도, 트랜스포머처럼 병렬로도 계산 가능한 구조.
장점:
- O(n) 시간 + 메모리 (토큰 수에 선형)
- 고정 크기 상태 -> 긴 시퀀스에서도 메모리 일정
- 추론 속도 빠름 (KV 캐시 불필요)
현재 상태 (2025):
- 일부 벤치마크에서 트랜스포머에 근접하거나 추월
- 하지만 대규모(70B+)에서 트랜스포머를 완전 대체하지는 못함
- 하이브리드 접근 (트랜스포머 + Mamba 혼합)이 유망
- 실무에서 쓰는 LLM은 아직 사실상 전부 트랜스포머 기반
결론: 트랜스포머는 현재의 승자이지만 영원하지 않을 수 있음.
핵심 원리(어텐션, 임베딩, FFN)를 이해해두면
구조가 바뀌어도 적응할 수 있음.Mamba가 트랜스포머를 대체할지는 아직 모른다. O(n^2)를 O(n)으로 줄이면서 성능까지 유지할 수 있다면 안 바꿀 이유가 없지 않을까? 하지만 현실은 그렇게 단순하지 않다. 이 시리즈에서 다룬 핵심 원리들, 임베딩, 어텐션의 개념, FFN의 지식 저장, 학습의 원리, 이런 것들은 구조가 바뀌어도 유효하다. 그게 내부를 이해하는 가치다.
이 글이 어떠셨나요?
관련 포스트
1. LLM은 텍스트를 어떻게 처리하는가
LLM이 텍스트 한 줄을 받아서 다음 토큰을 예측하기까지의 전체 과정을 4단계로 따라간다. 토크나이저, 임베딩, 트랜스포머 레이어, 출력까지 "OOM killer가 nginx를" 한 문장이 모델 안에서 겪는 여행.
2026. 03. 03. PM 10:00DevOps5. 조립: 토큰이 쌓이고 레이어가 깊어지는 과정
어텐션과 FFN을 조립하는 과정
2026. 03. 31. PM 10:00DevOps4. FFN: 지식이 저장된 곳
LLM의 FFN이 어텐션과 어떻게 역할을 나누는지. 확장→압축 구조가 왜 "지식 저장소"인지. 분산 표현의 원리, LayerNorm의 역할까지.
2026. 03. 24. PM 10:00뉴스레터 구독
새 글이 올라오면 이메일로 알려드려요.