순환 신경망(Recurrent Neural Network; RNN)은 토큰(token)을 하나씩 처리합니다. 트랜스포머(Transformer)는 모든 토큰을 한 번에 처리합니다. 이 하나의 아키텍처(architecture) 선택이 2017년 이후 딥러닝(deep learning)의 모든 스케일링 곡선(scaling curve)을 바꾸어 놓았습니다.
유형: Learn
언어: Python
선수 강의: Phase 3 (Deep Learning Core), Phase 5 · 09 (Sequence-to-Sequence), Phase 5 · 10 (Attention Mechanism)
예상 시간: 약 45분
문제
2017년 이전에는 언어, 번역, 음성처럼 시퀀스(sequence)를 다루는 거의 모든 최첨단(state-of-the-art) 모델이 순환 신경망(Recurrent Neural Network; RNN)이었습니다. 장단기 기억(Long Short-Term Memory; LSTM)과 게이트 순환 유닛(Gated Recurrent Unit; GRU)은 반세기에 가까운 기간 동안 번역 벤치마크(benchmark)를 평정했고, 이는 이미지 분야의 ImageNet에 견줄 만한 성과였습니다. 당시에는 이것이 사실상 사용할 수 있는 유일한 도구였습니다.
하지만 RNN에는 세 가지 치명적인 약점이 있었습니다. 첫째, 순차 계산(sequential computation) 때문에 시간 축(time axis)을 따라 병렬화(parallelize)할 수 없었습니다. 토큰 t+1은 토큰 t의 은닉 상태(hidden state)가 있어야 계산할 수 있기 때문입니다. 즉 1,024 토큰 시퀀스는 한 사이클(cycle)에 1,000,000번의 부동소수점 연산(floating-point operation)을 처리할 수 있는 GPU에서도 1,024개의 직렬 단계(serial step)를 거쳐야 했습니다. 병렬 처리를 위해 설계된 하드웨어에서 학습 실측 시간(training wall-clock time)이 시퀀스 길이(sequence length)에 선형으로 끌려갔습니다.
둘째, 기울기 소실(vanishing gradient) 문제가 있었습니다. 50 토큰 전의 정보는 이미 50개의 비선형 함수(non-linearity)를 통과하며 짓눌리듯 압축된 상태였습니다. LSTM, GRU 같은 게이트 순환 유닛(gated recurrent unit)이 이 압박을 어느 정도 완화했지만 완전히 없애지는 못했습니다. "작년 여름 교토(Kyoto)로 가는 비행기에서 읽은 책은…" 같은 장거리 의존성(long-range dependency)은 자주 무너졌습니다.
셋째, 고정 폭 은닉 상태(fixed-width hidden state)였습니다. 인코더(encoder)는 디코더(decoder)가 어떤 출력도 만들기 전에, 원문 시퀀스(source sequence) 전체를 단 하나의 벡터(vector)로 우겨넣어야 했습니다. 원문이 5 토큰이든 500 토큰이든 병목(bottleneck)의 모양은 똑같았습니다.
2017년 논문 "Attention Is All You Need"는 급진적인 제안을 했습니다. 순환(recurrence)을 완전히 제거하고, 모든 위치(position)가 다른 모든 위치를 병렬로 주목(attend)하도록 하자는 것이었습니다. 1,024번의 순차 계산 대신 거대한 행렬 곱셈(matrix multiplication) 한 번으로 학습합니다.
그 결과 2026년에는 거의 모든 모달리티(modality)를 트랜스포머가 지배합니다. 언어(GPT-5, Claude 4, Llama 4), 비전(ViT, DINOv2, SAM 3), 오디오(Whisper), 생물학(AlphaFold 3), 로보틱스(RT-2)까지 입력 데이터의 종류만 다를 뿐 같은 블록(block)이 반복됩니다.
사전 테스트
2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요
1.RNN이 GPU에서 시퀀스의 모든 토큰(token)을 동시에 처리할 수 없는 이유는 무엇인가요?
2.'Attention Is All You Need'(2017) 논문이 기존 시퀀스 모델과 비교해 제안한 근본적인 변화는 무엇인가요?
0/2 답변 완료
개념
병목으로서의 순환(Recurrence as a bottleneck). RNN은 h_t = f(h_{t-1}, x_t)를 계산합니다. 각 단계는 이전 단계에 의존합니다. h_4를 계산하기 전에는 h_5를 계산할 수 없습니다. 1만 개가 넘는 병렬 코어(parallel core)를 가진 최신 GPU에서도, 긴 시퀀스에서는 실리콘(silicon)의 99%가 놀게 됩니다.
브로드캐스트로서의 어텐션(Attention as a broadcast). 셀프 어텐션(self-attention)은 모든 쌍 (i, j)에 대해 output_i = sum_j(a_ij * v_j)를 동시에 계산합니다. 전체 N×N 어텐션 행렬(attention matrix)이 단 한 번의 배치 행렬 곱셈(batched matmul)으로 채워집니다. 어떤 단계도 다른 단계에 의존하지 않습니다. GPU가 가장 좋아하는 계산 형태입니다.
속도 향상은 상수가 아닙니다. 이 차이는 O(N) 직렬 깊이(serial depth)와 O(1) 직렬 깊이의 차이입니다. 실제로 트랜스포머는 동일한 하드웨어에서 N=512일 때 에포크(epoch)당 5~10배 빠르게 학습되며, 시퀀스 길이가 커질수록 격차가 더 벌어집니다. 다만 어텐션의 O(N²) 메모리 벽(memory wall)에 부딪힐 때까지의 이야기이고, 이 문제는 이후 플래시 어텐션(Flash Attention)이 해결했습니다. Lesson 12에서 다룹니다.
트랜스포머가 치르는 비용. 어텐션 메모리는 O(N²)로 증가합니다. 2K 컨텍스트(context)까지는 괜찮지만, 128K 컨텍스트가 되면 슬라이딩 윈도우(sliding window), 회전 위치 임베딩 외삽(RoPE extrapolation), 플래시 어텐션 타일링(Flash Attention tiling), 또는 선형 어텐션 변형(linear attention variant)이 필요합니다. 순환은 시간과 메모리가 모두 O(N)이었던 반면, 트랜스포머는 메모리를 더 쓰는 대신 시간을 절약하고, 그 시간을 병렬화로 다시 압도적으로 되찾습니다.
귀납 편향의 전환(Inductive bias shift). RNN은 지역성(locality)과 최근성(recency)을 가정합니다. 트랜스포머는 어떤 것도 가정하지 않습니다. 모든 위치 쌍이 어텐션의 후보입니다. 그래서 트랜스포머는 잘 학습되기 위해 더 많은 데이터를 필요로 하지만, 데이터가 충분해지면 훨씬 멀리까지 확장됩니다. 친칠라(Chinchilla; 2022) 논문은 이를 정식화했습니다. 토큰이 충분히 많다면 같은 파라미터 수의 RNN보다 트랜스포머가 항상 이긴다는 사실입니다.
직접 만들기
여기서는 신경망(neural network)을 구현하지 않습니다. 대신 핵심 병목을 수치적으로 모사(simulation)하여 노트북에서도 그 차이를 직접 느낄 수 있게 합니다.
Step 1: 직렬 깊이 측정
code/main.py를 살펴봅니다. 두 함수를 만듭니다. 하나는 시퀀스를 덧셈 사슬(addition chain)로 인코딩합니다. RNN처럼 직렬(serial)입니다. 다른 하나는 어텐션처럼 병렬 리덕션(parallel reduction)으로 인코딩합니다. 수학적으로는 같지만, 의존성 그래프(dependency graph)가 다릅니다.
defrnn_style(xs):
h = 0.0for x in xs:
h = 0.9 * h + x # 병렬화할 수 없음: h가 이전 h에 의존return h
defattention_style(xs):
returnsum(xs) / len(xs) # 모든 x가 서로 독립적임
최대 100,000개 원소의 시퀀스에서 두 함수의 시간을 측정합니다. RNN 버전은 O(N)이며 하나의 CPU 파이프라인(pipeline)에 묶입니다. 순수 파이썬(Python)만 사용해도 어텐션 스타일 리덕션은 길이가 1,000 이상이 되면 RNN 버전을 이깁니다. 파이썬의 sum()이 C로 구현되어 있어 단계마다 발생하는 인터프리터 오버헤드(interpreter overhead) 없이 반복하기 때문입니다.
Step 2: 이론적 연산 수 세기
두 알고리즘(algorithm) 모두 N번의 덧셈을 수행합니다. 차이는 *의존성 깊이(dependency depth)*입니다. 즉 다음 연산이 시작되기 전에 반드시 순차적으로 끝나야 하는 연산이 몇 개냐는 것입니다. RNN 깊이는 N입니다. 어텐션 깊이는 트리 리덕션(tree reduction)을 쓰면 log(N), 병렬 스캔(parallel scan)을 쓰면 1입니다. GPU 시간을 결정하는 것은 총 연산 수가 아니라 깊이입니다.
Step 3: 긴 시퀀스에서의 실측 스케일링
O(N) 격차를 눈으로 확인할 수 있도록 타이밍 표(timing table)를 출력합니다. 2026년형 맥(Mac) 노트북에서 1,000개 미만의 시퀀스는 너무 빨라 측정이 어렵습니다. 100,000개 시퀀스에서는 깔끔한 선형 스캔이 보입니다. 이를 16,384 토큰의 트랜스포머와 12층 LSTM에 해당하는 규모로 확장해 보면, 왜 2016년에 학습 실측 시간이 큰 걸림돌이었는지 분명해집니다.
사용하기
2026년에도 여전히 RNN을 선택하는 것이 합리적인 상황이 있습니다.
상황
선택
한 토큰씩 스트리밍 추론(streaming inference)을 하고 메모리를 일정하게 유지해야 할 때
RNN 또는 상태 공간 모델(State-Space Model; SSM)(Mamba, RWKV)
어텐션 메모리가 폭발하는 매우 긴 시퀀스(>1M 토큰)
선형 어텐션, Mamba 2, Hyena
행렬 곱셈 가속기(matmul accelerator)가 없는 엣지(edge) 디바이스
깊이별 분리 가능 RNN(Depthwise-separable RNN)이 FLOPs/와트에서 여전히 유리함
그 외 거의 모든 경우(학습, 배치 추론, 128K까지의 컨텍스트)
트랜스포머
맘바(Mamba) 같은 상태 공간 모델(State-Space Model; SSM)은 본질적으로 구조화된 매개변수화(structured parameterization)를 적용한 RNN입니다. 그래서 두 진영의 장점을 함께 가져갑니다. 즉 O(N) 스캔 메모리와, 선택적 스캔(selective scan)을 통한 병렬 학습이 동시에 가능합니다. 트랜스포머 품질의 90%를 회복하면서도 장기 컨텍스트(long-context) 스케일링은 더 좋습니다. 2026년 기준으로 대부분의 최전선 연구소들은 SSM과 트랜스포머를 결합한 하이브리드(hybrid) 모델, 예컨대 잠바(Jamba)나 삼바(Samba) 같은 모델을 학습합니다. 순환은 죽지 않았고, 하나의 구성요소(component)로 살아남았습니다.
산출물 만들기
outputs/skill-architecture-picker.md를 봅니다. 이 스킬(skill)은 시퀀스 길이, 처리량(throughput), 학습 예산(training budget) 제약 조건이 주어졌을 때 새로운 시퀀스 문제에 맞는 아키텍처를 골라 줍니다. 1B 토큰을 초과하는 학습에 대해서는, 그 트레이드오프(trade-off)를 명시하지 않은 채로 순수 RNN을 추천해서는 안 됩니다.
연습문제
쉬움.code/main.py의 rnn_style을 가져와 스칼라(scalar) 은닉 상태를 길이 64짜리 은닉 상태 벡터로 바꿉니다. 다시 측정해 봅니다. 은닉 상태 차원(hidden-state dimension)이 커질 때 직렬 오버헤드(serial overhead)는 얼마나 커집니까?
중간. 순수 파이썬으로 병렬 누적합(parallel prefix-sum), 즉 힐리스-스틸 스캔(Hillis-Steele scan)을 구현합니다. 길이 1024에서 직렬 스캔과 동일한 수치 출력을 내는지 검증하고, 깊이가 얼마인지 계산합니다.
어려움. 어텐션 스타일 리덕션을 파이토치(PyTorch) GPU 버전으로 이식(port)합니다. 시퀀스 길이를 64에서 65,536까지 바꿔 가며 두 방식의 시간을 측정합니다. 곡선의 모양을 그래프로 그리고 그 형태가 왜 그런지 설명합니다.
핵심 용어
용어
흔한 설명
실제 의미
순환(Recurrence)
"RNN은 순차적이다"
단계 t가 단계 t-1에 의존하는 계산으로, 시간 축을 따라 직렬 실행을 강제한다.
직렬 깊이(Serial depth)
"그래프가 얼마나 깊은가"
의존적인 연산이 만드는 가장 긴 사슬이며, 하드웨어가 무한해도 실측 시간의 하한선을 결정한다.
어텐션(Attention)
"토큰끼리 서로 본다"
위치 i와 j 사이의 유사도 점수(similarity score)에서 도출되는 a_ij로 가중합 sum_j a_ij v_j를 계산하는 연산이다.
컨텍스트 윈도우(Context window)
"모델이 보는 범위"
어텐션 층이 입력으로 받을 수 있는 위치 수이며, 이차 메모리 비용은 여기서 커진다.
귀납 편향(Inductive bias)
"아키텍처에 내장된 가정"
데이터가 어떤 모양일지에 대한 사전 지식(prior)이며, 합성곱 신경망(CNN)은 이동 불변성(translation invariance), RNN은 최근성(recency)을 가정한다.
상태 공간 모델(State-space model; SSM)
"수학이 붙은 RNN"
구조화된 상태 공간 행렬(structured state-space matrix)을 통해 병렬 학습이 가능하도록 매개변수화된 순환이다.
이차 병목(Quadratic bottleneck)
"컨텍스트 비용이 큰 이유"
시퀀스 길이 N에 대해 어텐션 메모리가 O(N²)이다. 플래시 어텐션(Flash Attention)은 상수를 줄일 뿐 스케일링 자체를 없애지는 않는다.