2017년 전까지는 RNN(순환 신경망)과 그 게이트 버전인 LSTM이 시퀀스 데이터의 기본 무기였어. 텍스트, 음성, 시계열, 음악까지 — 거의 다 RNN/LSTM이 깔았지. 트랜스포머가 왜 큰 사건이었는지 이해하려면, RNN이 잘하던 게 뭐고 어디서 막혔는지부터 봐야 돼.
RNN은 시퀀스를 한 칸씩 읽어들이면서 hidden state를 계속 업데이트해. 이 벡터 하나가 "지금까지 본 거 다 압축한 거"야. 매 스텝마다 현재 입력 + 직전 hidden state를 섞어서 다음 hidden state를 만들지.
LSTM은 여기에 게이트를 붙였어. forget gate / input gate / output gate가 "뭘 잊을지 / 뭘 새로 쓸지 / 뭘 내보낼지"를 명시적으로 학습해. 그래서 장기 의존성을 그나마 잡을 수 있게 됐는데 — 본질적인 "한 칸씩"은 그대로야.
진짜 문제 세 가지
전부 "한 칸씩 처리"에서 파생되는 문제들이야:
- 시퀀스 안에서 병렬화 불가능. 위치 100의 hidden state를 구하려면 99가 끝나야 해. 99는 98이 있어야 하고. GPU는 행렬곱을 병렬로 돌리고 싶어 죽겠는데, RNN은 그걸 시켜주질 않아.
- gradient vanishing / exploding. LSTM 게이트로도 수백 스텝 넘어가면 gradient가 0에 수렴하거나 폭발해. 실전에서 200토큰 넘는 의존성은 거의 못 잡아.
- 정보 병목. 현재 스텝보다 앞에 있던 모든 정보가 hidden state 벡터 하나를 통과해야 해. 멀어지면 흐려져.
이게 옛날 얘기 같지만, RNN/LSTM은 2017년까지 구글 번역(2016), 초기 Siri 음성 인식, 대부분의 production NLP를 굴리던 현역이었어. 망가진 걸 트랜스포머가 갈아치운 게 아니야 — 잘 굴러가지만 본질적으로 막혀 있던 걸 갈아치운 거지.