딥러닝 기초 (15) - seq2seq와 어텐션
인코더-디코더 RNN이 문장 전체를 벡터 하나에 압축하며 생기는 정보 병목에서 출발해, 디코더가 인코더의 모든 상태를 필요한 곳에 집중해 참조하는 어텐션이 그 병목을 어떻게 푸는지를 정리한 딥러닝 기초 (15)편입니다.
딥러닝 기초 시리즈의 15편입니다. 전체 목차는 0편에 있습니다. RNN 계열이 못 넘은 벽을 무너뜨리는 첫걸음, 어텐션을 다룹니다.
seq2seq의 정보 병목
번역처럼 시퀀스를 시퀀스로 바꾸는 과제는 오랫동안 인코더-디코더 RNN(seq2seq)으로 풀었습니다. 인코더가 입력 문장을 읽어 하나의 벡터로 요약하고, 디코더가 그 벡터로 출력 문장을 생성합니다.
문제는 이 요약 벡터 하나에 문장 전체를 욱여넣는다는 점입니다. 문장이 길어질수록 초반 정보가 뭉개지는 정보 병목이 생깁니다. 사람도 긴 문장을 한 번 듣고 통째로 외워 번역하기는 어렵습니다 — 앞부분을 다시 참고하게 됩니다. 14편의 LSTM으로 기억을 늘려도 이 병목은 근본적으로 남습니다.
어텐션: 필요한 곳을 직접 본다
어텐션(attention)의 발상은 단순합니다. 디코더가 매 순간 하나의 요약 벡터에만 의존하지 말고, 인코더의 모든 상태를 다시 보되 지금 필요한 위치에 더 집중하자는 것입니다. “프랑스어를 [ ]” 자리를 생성할 때 입력의 “프랑스” 부분을 골라 보는 식입니다. 요약 벡터 하나에 모든 것을 담을 필요가 없어지니, 병목이 사라집니다.
이 “필요한 곳에 집중”은 가중 평균으로 구현됩니다. 세 단계입니다.
- 지금 디코더 상태와 인코더의 각 위치가 얼마나 관련되는지 점수를 매긴다.
- 그 점수를 softmax로 가중치(합이 1)로 바꾼다.
- 그 가중치로 인코더 상태들을 가중 평균해, 지금 필요한 정보를 뽑는다.
관련 높은 위치에 큰 가중치가 실리므로, 디코더는 매 스텝 입력의 알맞은 부분을 “골라 보는” 셈입니다. 어느 입력 단어에 집중했는지를 시각화하면, 번역 모델이 원문과 번역문을 어떻게 정렬하는지가 실제로 드러납니다.
병목을 넘어, 순차성까지
어텐션은 처음에는 RNN을 보조하는 장치였습니다. 인코더-디코더 RNN 위에 얹어 병목을 푸는 역할이었죠. 그런데 여기서 결정적인 질문이 나옵니다. 어텐션이 임의의 두 위치를 직접 연결할 수 있다면, 굳이 순서대로 읽는 RNN이 필요한가? RNN을 걷어내고 어텐션만으로 시퀀스를 처리하면, 13편·14편이 못 넘은 순차 처리의 벽까지 무너뜨릴 수 있습니다.
그 답이 다음 편의 Transformer입니다.
정리
| 개념 | 한 줄 요약 |
|---|---|
| seq2seq | 인코더-디코더 RNN. 문장을 벡터 하나로 요약 |
| 정보 병목 | 벡터 하나에 전체를 압축 → 긴 문장에서 손실 |
| 어텐션 | 모든 위치를 다시 보되 필요한 곳에 집중(가중 평균) |
| 3단계 | 관련도 점수 → softmax 가중치 → 가중 평균 |
| 다음 질문 | 어텐션만으로 RNN을 대체할 수 있는가 |