포스트

딥러닝 기초 (15) - seq2seq와 어텐션

인코더-디코더 RNN이 문장 전체를 벡터 하나에 압축하며 생기는 정보 병목에서 출발해, 디코더가 인코더의 모든 상태를 필요한 곳에 집중해 참조하는 어텐션이 그 병목을 어떻게 푸는지를 정리한 딥러닝 기초 (15)편입니다.

딥러닝 기초 (15) - seq2seq와 어텐션

딥러닝 기초 시리즈의 15편입니다. 전체 목차는 0편에 있습니다. RNN 계열이 못 넘은 벽을 무너뜨리는 첫걸음, 어텐션을 다룹니다.

seq2seq의 정보 병목

번역처럼 시퀀스를 시퀀스로 바꾸는 과제는 오랫동안 인코더-디코더 RNN(seq2seq)으로 풀었습니다. 인코더가 입력 문장을 읽어 하나의 벡터로 요약하고, 디코더가 그 벡터로 출력 문장을 생성합니다.

문제는 이 요약 벡터 하나에 문장 전체를 욱여넣는다는 점입니다. 문장이 길어질수록 초반 정보가 뭉개지는 정보 병목이 생깁니다. 사람도 긴 문장을 한 번 듣고 통째로 외워 번역하기는 어렵습니다 — 앞부분을 다시 참고하게 됩니다. 14편의 LSTM으로 기억을 늘려도 이 병목은 근본적으로 남습니다.

어텐션: 필요한 곳을 직접 본다

어텐션(attention)의 발상은 단순합니다. 디코더가 매 순간 하나의 요약 벡터에만 의존하지 말고, 인코더의 모든 상태를 다시 보되 지금 필요한 위치에 더 집중하자는 것입니다. “프랑스어를 [ ]” 자리를 생성할 때 입력의 “프랑스” 부분을 골라 보는 식입니다. 요약 벡터 하나에 모든 것을 담을 필요가 없어지니, 병목이 사라집니다.

이 “필요한 곳에 집중”은 가중 평균으로 구현됩니다. 세 단계입니다.

  1. 지금 디코더 상태와 인코더의 각 위치가 얼마나 관련되는지 점수를 매긴다.
  2. 그 점수를 softmax로 가중치(합이 1)로 바꾼다.
  3. 그 가중치로 인코더 상태들을 가중 평균해, 지금 필요한 정보를 뽑는다.

관련 높은 위치에 큰 가중치가 실리므로, 디코더는 매 스텝 입력의 알맞은 부분을 “골라 보는” 셈입니다. 어느 입력 단어에 집중했는지를 시각화하면, 번역 모델이 원문과 번역문을 어떻게 정렬하는지가 실제로 드러납니다.

병목을 넘어, 순차성까지

어텐션은 처음에는 RNN을 보조하는 장치였습니다. 인코더-디코더 RNN 위에 얹어 병목을 푸는 역할이었죠. 그런데 여기서 결정적인 질문이 나옵니다. 어텐션이 임의의 두 위치를 직접 연결할 수 있다면, 굳이 순서대로 읽는 RNN이 필요한가? RNN을 걷어내고 어텐션만으로 시퀀스를 처리하면, 13편·14편이 못 넘은 순차 처리의 벽까지 무너뜨릴 수 있습니다.

그 답이 다음 편의 Transformer입니다.

정리

개념한 줄 요약
seq2seq인코더-디코더 RNN. 문장을 벡터 하나로 요약
정보 병목벡터 하나에 전체를 압축 → 긴 문장에서 손실
어텐션모든 위치를 다시 보되 필요한 곳에 집중(가중 평균)
3단계관련도 점수 → softmax 가중치 → 가중 평균
다음 질문어텐션만으로 RNN을 대체할 수 있는가

다음 글: 딥러닝 기초 (16) - Transformer: self-attention과 그 너머

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.