티스토리 뷰
딥러닝 기초학습 7: LSTM과 GRU — RNN의 기억력 문제를 해결한 ‘게이트 설계’의 정수
RNN을 쓰다 보면 꼭 이런 순간이 옵니다.
“분명 앞에서 중요한 정보가 있었는데… 왜 모델이 기억을 못 하지?”
이 질문에 대한 답이 바로
LSTM(Long Short-Term Memory) 과 GRU(Gated Recurrent Unit) 입니다.이 둘은 RNN의 실패를 인정하고,
“그럼 기억을 제대로 관리하자”라는 발상에서 출발했습니다.
이번 글에서는
- RNN이 왜 기억을 못 했는지
- LSTM이 어떻게 기억을 유지했는지
- GRU는 왜 더 단순해졌는지
를 구조 중심으로 차근차근 풀어봅니다.
1. RNN은 왜 ‘장기 기억’을 못 했을까?
문제의 핵심은 하나입니다.
모든 정보를 같은 방식으로 계속 덮어쓴다
기본 RNN은 매 시점마다 이렇게 계산합니다.
h_t = f(Wx_t + Uh_{t-1})
이 구조에서는
- 중요한 정보
- 덜 중요한 정보
- 이미 필요 없는 정보
이 모든 것이 동일한 h_t 하나에 섞여 들어갑니다.
그리고 시간이 길어질수록
- 중요한 정보는 희석되고
- gradient는 사라집니다 (vanishing gradient)
그래서 “긴 문장”, “장기 패턴”을 기억하지 못했습니다.
2. LSTM의 핵심 아이디어: 기억을 따로 관리하자
LSTM의 혁신은 단순하지만 강력합니다.
“은닉 상태 말고,
진짜 기억 전용 공간을 하나 더 만들자”
그래서 LSTM에는 두 개의 상태가 있습니다.
- h_t : 현재 출력(단기 기억)
- c_t : 셀 상태(Cell State, 장기 기억)
이 c_t가 LSTM의 본질입니다.
3. LSTM의 3가지 게이트 (Gate)
게이트는 “열지 / 닫을지”를 결정하는 장치입니다.
모두 sigmoid(0~1) 로 동작합니다.
① Forget Gate — 무엇을 잊을 것인가
f_t = σ(W_f · [h_{t-1}, x_t])
- 0 → 완전히 잊음
- 1 → 완전히 유지
👉 이 게이트가 LSTM의 혁신 포인트입니다.
RNN에는 “잊는 기능” 자체가 없었습니다.
② Input Gate — 무엇을 새로 기억할 것인가
i_t = σ(W_i · [h_{t-1}, x_t])
ĉ_t = tanh(W_c · [h_{t-1}, x_t])
- i_t : 얼마나 쓸지
- ĉ_t : 어떤 내용을 쓸지
③ Cell State 업데이트 — 기억의 핵심
c_t = f_t * c_{t-1} + i_t * ĉ_t
이 식이 왜 중요한지 보세요.
- 곱셈 + 덧셈 구조
- 미분 시 gradient가 잘 유지됨
- 정보가 “그대로 흐를 수 있는 길”이 생김
👉 이것이 기울기 소실 문제를 해결한 구조적 이유입니다.
④ Output Gate — 무엇을 밖으로 보여줄 것인가
o_t = σ(W_o · [h_{t-1}, x_t])
h_t = o_t * tanh(c_t)
- 기억(c_t) 중에서
- 지금 시점에 필요한 정보만 출력
4. LSTM을 한 문장으로 요약하면
“기억(c)은 따로 보존하고,
입력·출력·삭제를 게이트로 조절한다.”
그래서 LSTM은:
- 긴 문장 이해 가능
- 장기 의존성 학습 가능
- 번역, 음성 인식, 시계열에서 성공
5. 그런데… LSTM은 너무 복잡했다
LSTM의 단점도 분명했습니다.
- 파라미터 많음
- 연산 느림
- 구조 복잡 → 튜닝 어려움
그래서 나온 질문:
“이거… 조금만 단순하게 못 하나?”
그 답이 GRU 입니다.
6. GRU — LSTM을 ‘현실화’한 구조
GRU는 LSTM을 이렇게 정리합니다.
LSTMGRU
| Cell state(c) | 없음 |
| 3개 게이트 | 2개 게이트 |
| 복잡 | 단순 |
| 안정적 | 빠름 |
GRU는 c_t와 h_t를 하나로 합칩니다.
7. GRU의 두 가지 게이트
① Update Gate (z)
z_t = σ(W_z · [h_{t-1}, x_t])
- 과거를 얼마나 유지할지 결정
- LSTM의 forget + input 역할을 동시에 수행
② Reset Gate (r)
r_t = σ(W_r · [h_{t-1}, x_t])
- 과거 정보를 얼마나 무시할지 결정
- 문맥을 “리셋”하는 역할
③ GRU 상태 업데이트
h̃_t = tanh(W · [r_t * h_{t-1}, x_t])
h_t = (1 - z_t) * h_{t-1} + z_t * h̃_t
👉 구조는 단순하지만
👉 기억 유지 능력은 LSTM에 매우 근접
8. LSTM vs GRU, 실무에서는?
정답은 없습니다. 다만 경향은 있습니다.
상황추천
| 데이터 많고 복잡 | LSTM |
| 속도 중요, 구조 단순 | GRU |
| 모바일 / 경량 모델 | GRU |
| 연구/기준 모델 | LSTM |
요즘은 둘 다
Transformer 이전 세대의 핵심 모델로 자리 잡았습니다.
9. PyTorch로 LSTM / GRU 사용 예제
실제로 가장 많이 쓰는 형태입니다.
LSTM
import torch
import torch.nn as nn
lstm = nn.LSTM(
input_size=10,
hidden_size=20,
batch_first=True
)
X = torch.randn(5, 7, 10)
out, (h_n, c_n) = lstm(X)
print(out.shape) # (5, 7, 20)
GRU
gru = nn.GRU(
input_size=10,
hidden_size=20,
batch_first=True
)
out, h_n = gru(X)
print(out.shape) # (5, 7, 20)
✔ 실무에서 그대로 쓰는 코드
✔ 오류 없이 실행됩니다
10. 그런데… 왜 결국 Transformer로 갔을까?
LSTM/GRU도 결국 한계를 가졌습니다.
- 여전히 순차 계산 → 느림
- 긴 문장에서는 메모리 병목
- 병렬화 어려움
그래서 나온 질문:
“굳이 순서대로 계산해야 할까?”
“모든 단어를 한 번에 보게 하면 안 될까?”
이 질문의 답이 바로 Attention,
그리고 Transformer 입니다.
11. 요약 정리
개념한 줄 요약
| RNN | 기억이 약한 순환 구조 |
| LSTM | 기억을 따로 관리하는 게이트 모델 |
| GRU | LSTM을 단순화한 실용 모델 |
| 핵심 해결 | 기울기 소실 + 장기 기억 |
| 한계 | 순차 계산 |
딥러닝,LSTM,GRU,RNN,게이트구조,시계열,NLP,장기기억,딥러닝기초,PyTorch
'study > ML' 카테고리의 다른 글
| 딥러닝 기초학습 9: Transformer 구조 완전 해부 — Encoder·Decoder·Multi-Head Attention이 왜 이렇게 생겼는가 (0) | 2025.12.22 |
|---|---|
| 딥러닝 기초학습 8: Attention의 등장 — “기억하지 말고, 필요할 때 찾아보자” (0) | 2025.12.16 |
| 딥러닝 기초학습 6: RNN의 탄생 — 순차 데이터를 이해하기 위해 만들어진 첫 번째 딥러닝 모델 (0) | 2025.12.01 |
| 딥러닝 기초학습 5: CNN의 탄생 — 이미지가 가진 ‘공간 구조’를 이해하면 CNN이 보인다 (0) | 2025.11.28 |
| 딥러닝 기초학습 4: 활성화 함수의 진짜 의미 — 왜 ReLU가 딥러닝을 지배하게 되었는가? (0) | 2025.11.27 |
- Total
- Today
- Yesterday
- Redis
- LangChain
- node.js
- 압박면접
- Docker
- Python
- DevOps
- ai철학
- 백엔드개발
- JWT
- flax
- 딥러닝
- Prisma
- Express
- Next.js
- 쿠버네티스
- NestJS
- kotlin
- llm
- JAX
- nextJS
- fastapi
- SEO최적화
- 개발블로그
- seo 최적화 10개
- CI/CD
- rag
- PostgreSQL
- 웹개발
- REACT
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |

