참고 자료 출처: 딥러닝을 이용한 자연어 처리 입문
앞서 배운 seq2seq 모델은 인코더에서 입력 시퀀스를 컨텍스트 벡터라는 하나의 고정된 크기의 벡터 표현으로 압축하고, 디코더는 이 컨텍스트 벡터를 통해서 출력 시퀀스를 만들어냅니다.
하지만 이러한 RNN에 기반한 seq2seq 모델에는 크게 두 가지 문제가 있습니다.
즉, 결국 기계 번역 분야에서 입력 문장이 길수록 번역의 질이 떨어지는 현상이 발생했습니다. 이를 위한 대안으로 나온 것이 어텐션입니다.
어텐션은 디코더에서 출력 단어를 예측하는데 매 시점(time step)마다 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 점입니다.
단, 전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아닌 해당 시점에서 예측해야 할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 봅니다.
어텐션 함수를 표현하면 다음과 같습니다.
Attention(Q, K, V) = Attention Value
어텐션 함수는 주어진 '쿼리(Query)'에 대해서 모든 '키(key)'와의 유사도를 구합니다. 구해낸 유사도를 키와 맵핑 되어있는 각각의 '값(value)'에 반영해줍니다. 유사도가 반영된 '값(value)'을 모두 더해서 리턴합니다. 이를 어텐션 값(Attention Value) 이라 합니다.
트랜스포머 어텐션에 함수에 사용되는 Query, Key, Value는 기본적으로 '단어(정보를 함축한) 벡터'입니다.
'단어 벡터'란 초기 입력으로 사용되었던 임베딩 벡터가 아닌 트랜스포머의 여러 연산을 거친 후의 단어 벡터입니다.
트랜스 포머에서 사용되는 어텐션은 세 가지 종류가 있습니다.
셀프 어텐션은 인코더에서 이루어지고 Query, Key, Value가 동일한 경우를 말합니다.
마스크드 셀프 어텐션은 디코더에서 이루어지고 Query, Key, Value가 동일한 경우를 말합니다.
주의할 점❗
여기서 Query, Key 등이 같다는 것은 벡터의 값이 같다는 것이 아니라 벡터의 출처가 같다는 의미
Query가 디코더의 벡터인 반면에 Key와 Value가 인코더의 벡터이므로 셀프 어텐션이라고 부르지 않습니다.
위 그림은 트랜스포머의 아키텍처에서 세 가지 어텐션이 각각 어디에서 이루어지는지를 보여줍니다. 세 개의 어텐션에 추가적으로 '멀티 헤드'라는 이름이 붙어 있는데요. 이는 트랜스포머가 어텐션을 병렬적으로 수행하는 방법을 의미합니다.