문장은 단어 순서가 바뀌면 의미도 달라진다. 시계열도 앞선 값과 현재 값의 관계가 중요하다. RNN·LSTM·GRU는 상태를 다음 시점으로 전달하고, Transformer는 각 위치가 필요한 위치를 직접 참고한다. 차이는 “기억한다”와 “집중한다”의 구현 방식에 있다.
이 글의 목표: RNN 계열의 순환 구조부터 Transformer의 Q·K·V 계산까지 한 흐름으로 이해하고, 어떤 상황에서 어떤 구조를 선택할지 판단한다.

긴 문장에서 멀어진 정보를 순차 상태·게이트 기억·어텐션이 처리하는 차이

같은 시퀀스를 순차 상태·게이트 기억·병렬 어텐션으로 처리하는 방식 비교
1. 시퀀스는 입력과 출력 길이부터 본다
| 구조 | 입력 → 출력 | 예시 |
|---|---|---|
| One-to-One | 하나 → 하나 | 고정 특성으로 클래스 예측 |
| One-to-Many | 하나 → 여러 시점 | 이미지 설명 문장 생성 |
| Many-to-One | 여러 시점 → 하나 | 리뷰 감성 분류 |
| Many-to-Many | 여러 시점 → 여러 시점 | 번역, 개체명 인식 |
같은 Many-to-Many라도 출력이 입력과 같은 길이인지, 한 문장을 읽은 뒤 다른 길이의 문장을 생성하는지에 따라 구현이 달라진다. 모델 이름보다 먼저 입력 텐서의 모양과 필요한 출력 시점을 정해야 한다.
2. RNN은 이전 상태를 현재 계산에 넣는다
기본 RNN은 현재 입력 x_t와 이전 은닉 상태 h_(t-1)로 새 상태 h_t를 만든다. 같은 가중치를 모든 시점에 공유하므로 길이가 달라도 같은 규칙으로 처리할 수 있다.
“영화가 지루하지 않았다”를 읽는다면 마지막 단어를 해석할 때 앞선 “지루하지”의 정보가 은닉 상태에 반영된다. 감성 분류처럼 마지막 상태 하나를 쓰기도 하고, 품사 태깅처럼 모든 시점의 상태를 출력하기도 한다.
문제는 긴 시퀀스를 역전파할 때 같은 연산이 반복된다는 점이다. 기울기가 매우 작아지면 먼 과거 정보가 학습되지 않고, 매우 커지면 학습이 불안정해진다. 기본 RNN이 장기 의존 관계에 약한 이유다.
3. LSTM과 GRU는 정보 통로를 게이트로 조절한다
LSTM: 셀 상태와 세 종류의 게이트
LSTM은 은닉 상태와 별도로 셀 상태를 둔다. 망각 게이트는 이전 기억 중 버릴 부분, 입력 게이트는 새로 저장할 부분, 출력 게이트는 현재 출력으로 드러낼 부분을 조절한다. 덧셈 중심의 셀 상태 경로가 먼 시점까지 기울기를 전달하는 데 도움을 준다.
GRU: 두 게이트로 단순화
GRU는 셀 상태와 은닉 상태를 하나로 합치고 업데이트 게이트와 리셋 게이트를 사용한다. LSTM보다 매개변수가 적어 학습과 추론이 가벼울 수 있다. 그러나 어느 구조가 항상 더 정확하다고 단정할 수는 없다. 데이터 길이, 크기, 지연 시간 조건에서 직접 비교해야 한다.
| 구조 | 핵심 상태 | 장점 | 주의점 |
|---|---|---|---|
| RNN | 은닉 상태 | 단순하고 가벼움 | 긴 의존 관계 학습이 어려움 |
| LSTM | 은닉 상태 + 셀 상태 | 장기 정보 제어가 세밀함 | 계산과 매개변수가 큼 |
| GRU | 통합된 은닉 상태 | LSTM보다 구조가 간결함 | 과제별 성능 검증 필요 |
4. Transformer는 관련 위치를 직접 찾는다
RNN은 시점을 순서대로 통과한다. Transformer의 Self-Attention은 한 층 안에서 각 토큰이 다른 모든 토큰과의 관련성을 계산한다. 학습 시 여러 위치를 병렬로 처리하기 쉽고, 멀리 떨어진 단어도 짧은 계산 경로로 연결된다.
입력 표현에 서로 다른 선형 변환을 적용해 Query, Key, Value를 만든다.
- Query(Q): 현재 위치가 찾는 정보
- Key(K): 각 위치가 가진 정보의 표지
- Value(V): 실제로 가져올 내용
Query와 모든 Key의 내적은 관련성 점수가 된다. 차원 수의 제곱근으로 나눠 값이 지나치게 커지는 것을 줄이고, softmax로 가중치 합을 1로 만든 뒤 Value를 가중합한다. 결과는 “현재 위치가 다른 위치의 정보를 얼마나 섞어 받을지”를 나타낸다.
텐서 모양: 배치 우선 표현에서 입력이 [batch, length, d_model]이라면 Q·K·V도 보통 앞의 두 축을 유지한다. 행렬곱 뒤 Attention 점수는 head별 [batch, heads, query_length, key_length]가 된다.

Q·K·V 계산과 Self·Cross·Multi-Head Attention의 입력 관계
5. Self·Cross·Multi-Head Attention은 입력 관계가 다르다
Self-Attention
Q, K, V가 같은 시퀀스에서 나온다. 문장 안에서 대명사가 어느 명사를 가리키는지, 코드의 함수 호출이 어느 정의와 연결되는지처럼 내부 관계를 학습한다.
Cross-Attention
Q는 한 시퀀스, K와 V는 다른 시퀀스에서 나온다. 번역 모델의 디코더가 원문 표현을 참고하거나, 이미지 질문 모델이 텍스트 Query로 이미지 특징을 찾는 상황이 예다. Cross-Attention은 특정 “디코더 전용 기능”이 아니라 서로 다른 정보원을 연결하는 방식이다.
Multi-Head Attention
입력을 여러 head의 작은 공간으로 투영해 Attention을 병렬 계산한다. 각 head는 Q만 여러 개 만드는 것이 아니라 Q, K, V 각각에 다른 투영을 적용한다. 어떤 head는 가까운 문법 관계, 다른 head는 먼 의미 관계를 학습할 수 있다. 모든 head의 결과를 이어 붙인 뒤 다시 선형 변환한다.
6. Attention만으로는 순서를 알 수 없다
Self-Attention은 위치 정보를 별도로 넣지 않으면 같은 단어 집합의 순서를 구분하지 못한다. 그래서 입력 임베딩에 고정 또는 학습 가능한 위치 표현을 더한다. 긴 문맥을 다룰 수 있는 범위는 모델의 위치 표현, 학습 설정, 메모리 제한에 따라 달라지며 무제한이 아니다.
생성 모델은 미래 토큰을 미리 보면 안 된다. Causal mask는 현재 위치가 뒤쪽 위치를 참고하지 못하게 Attention 점수를 가린다. 패딩 토큰을 제외하는 padding mask와 목적이 다르므로 둘을 구분한다.
7. PyTorch로 출력 형태를 확인한다
GRU: 마지막 상태로 문장 분류
import torch
from torch import nn
batch, length, input_size = 4, 12, 32
x = torch.randn(batch, length, input_size)
gru = nn.GRU(
input_size=input_size,
hidden_size=64,
batch_first=True
)
outputs, last_hidden = gru(x)
print(outputs.shape) # [4, 12, 64]
print(last_hidden.shape) # [1, 4, 64]Multi-Head Attention: 모든 위치의 표현 갱신
attention = nn.MultiheadAttention(
embed_dim=64,
num_heads=4,
batch_first=True
)
x = torch.randn(4, 12, 64)
updated, weights = attention(
query=x,
key=x,
value=x,
need_weights=True
)
print(updated.shape) # [4, 12, 64]
print(weights.shape) # [4, 12, 12]실전에서는 Attention 뒤에 잔차 연결과 정규화, 피드포워드 네트워크가 이어진다. 위 코드는 핵심 입력·출력 모양을 확인하기 위한 최소 예제다.
8. 어떤 모델을 선택할까
| 조건 | 먼저 검토할 구조 | 이유 |
|---|---|---|
| 센서 값을 한 시점씩 즉시 처리 | GRU·LSTM | 상태를 유지하며 스트리밍하기 쉬움 |
| 긴 문서의 문맥 관계 | Transformer 계열 | 먼 위치를 직접 연결 |
| 작은 데이터·낮은 지연 시간 | 작은 GRU와 기준 모델 비교 | 구조와 연산이 비교적 단순 |
| 대규모 병렬 학습 | Transformer 계열 | 시퀀스 위치의 병렬 처리에 유리 |
- “Transformer는 항상 더 빠르다”: 학습 병렬성은 좋지만 긴 시퀀스의 기본 Attention은 메모리와 연산량이 길이의 제곱에 비례한다.
- “GPT는 Transformer 전체 구조다”: GPT 계열은 대표적인 decoder-only, BERT 계열은 encoder-only 구조다.
- “Multi-Head는 Query만 여러 개다”: 각 head가 Q·K·V 모두를 별도 공간으로 투영한다.
- “Attention 그림이 곧 설명이다”: 가중치는 모델 내부 관계를 보여주는 단서지만, 단독으로 인과 설명이 되지는 않는다.
핵심 요약
- RNN은 이전 은닉 상태를 순서대로 전달한다.
- LSTM과 GRU는 게이트로 유지·삭제할 정보를 조절한다.
- Transformer는 Q·K·V로 필요한 위치의 정보를 가중합한다.
- Cross-Attention은 서로 다른 시퀀스나 모달리티를 연결한다.
- 모델 선택은 정확도뿐 아니라 길이, 지연 시간, 메모리, 스트리밍 조건으로 결정한다.
'실전 개발 노트 > 개발 가이드' 카테고리의 다른 글
| 컴퓨터 비전 학습 로드맵: 영상처리·CNN·YOLO·ViT를 한 흐름으로 (0) | 2026.07.30 |
|---|---|
| 개발팀 기술 논쟁 줄이는 법: 코드 리뷰·ADR·작은 실험으로 결정하기 (0) | 2026.07.30 |
| AI 시대 개발팀 운영법: DESIGN.md·테스트·알림을 하나의 검증 흐름으로 (0) | 2026.07.29 |
| Redis 토큰 버킷으로 API 레이트 리밋 설계하기: 429 응답부터 Lua 구현까지 (0) | 2026.07.29 |
| 생성형 AI 활용능력 핵심 정리: 프롬프트·검증·보안·저작권 (0) | 2026.07.29 |