에듀테크 프로젝트 대시보드
LSTM & GRU
일반 순환 신경망(RNN)은 같은 가중치를 계속 곱하다 보니
tanh 미분값(1보다 작음)이 여러 번 곱해져 기울기가 점점 0에 가까워진다 — 기울기 소실.
그래서 문장이 조금만 길어져도 "먼 과거"를 잊어버린다.
LSTM(Long Short-Term Memory)은 은닉 상태와는 별도로 셀 상태(cell state) c라는
"컨베이어 벨트"를 하나 더 두고, 게이트(gate) 세 개로 그 벨트에 무엇을 올리고 내릴지 조절한다.
GRU(Gated Recurrent Unit)는 게이트를 2개로 줄여 더 가볍게 만든 변형이다.
은닉 상태 h 하나만 있고, 매 스텝 tanh(...) 전체를 다시 계산 →
이전 정보가 매번 "덧칠"되어 오래된 정보일수록 흐려진다.
셀 상태 c는 게이트가 허락한 만큼만 곱하고 더할 뿐, 통째로 다시 계산하지 않는다.
필요한 정보는 거의 그대로 먼 미래까지 전달될 수 있다.
셀 상태를 따로 두지 않고 은닉 상태 h 자체를 업데이트 게이트로
"얼마나 새로 쓸지"만 조절 — 계산량이 LSTM보다 적다.
게이트는 모두 sigmoid를 써서 0~1 사이의 "밸브 개폐량"을 만든다.
0이면 완전히 잠금, 1이면 완전히 개방이다.
| 게이트 | 수식 | 역할 |
|---|---|---|
| Forget (f) | f = σ(Wf·x + Uf·h + bf) | 이전 셀 상태 중 얼마나 지울지 |
| Input (i) | i = σ(Wi·x + Ui·h + bi) | 새 후보 정보를 얼마나 받아들일지 |
| 후보 (c̃) | c̃ = tanh(Wc·x + Uc·h + bc) | 지금 들어온 정보로 만든 새 후보값 |
| Output (o) | o = σ(Wo·x + Uo·h + bo) | 셀 상태 중 얼마나 밖으로 내보낼지 |
c_t로 가는 경로에 f를 통한
덧셈이 있다. 곱셈만 반복되던 RNN과 달리, f가 1에 가까우면
오래된 정보가 거의 그대로(가산적으로) 다음 스텝까지 전달된다.
아래 문자열을 한 글자씩 넣으면서 각 게이트 값과 셀 상태가 어떻게 바뀌는지 확인해보자 (가중치는 이해를 돕기 위한 고정값이며 실제 학습된 값은 아니다). LSTM ↔ GRU 버튼으로 두 구조를 비교할 수 있다.
step 0 / 입력 문자: —
GRU는 forget/input 게이트를 업데이트 게이트(z) 하나로 합치고, "과거를 얼마나 참고할지"를 정하는 리셋 게이트(r)를 추가로 둔다. 셀 상태 없이 은닉 상태 하나로만 동작한다.
| 게이트 | 수식 | 역할 |
|---|---|---|
| Update (z) | z = σ(Wz·x + Uz·h) | 새 값으로 얼마나 갈아탈지 |
| Reset (r) | r = σ(Wr·x + Ur·h) | 과거 h를 얼마나 무시하고 새 후보를 만들지 |
| 후보 (h̃) | h̃ = tanh(W·x + U·(r⊙h)) | 리셋된 과거 + 현재 입력으로 만든 후보 |
| 갱신 | h = (1−z)·h + z·h̃ | 기존 값과 후보를 보간 |
게이트를 통과한 정보가 곱셈+덧셈으로만 이동해 먼 과거도 비교적 온전히 전달된다.
forget·input·output(LSTM) 또는 update·reset(GRU) 모두 sigmoid로 0~1 개폐량을 만든다.
게이트 4개 vs 2개. GRU가 더 가볍고 단순하지만 표현력은 과제에 따라 다르다.
그래도 시퀀스를 순서대로 처리해야 하는 한계는 남아있다 — 이를 병렬화한 것이 셀프 어텐션이다.