그런데 이러한 구조에는 문제가 하나 있습니다. 그림 18-10의 ➋와 같이 입력 값의 길이가 너무 길면 입력받은 셀의 결과들이 너무 많아진다는 것입니다. 입력이 길면 선두에서 전달받은 결괏값이 중간에 희미해지기도 하고, 문맥 벡터가 모든 값을 제대로 디코더에 전달하기 힘들어지는 문제들이 생기겠지요.
이를 처리하기 위해 사람들은 아이디어를 짜기 시작했습니다. 그리고 효과적인 방법을 찾았습니다.
그림 18-11 | 어텐션의 구현 원리
그림 18-11은 어텐션이 어떤 원리로 구현되었는지 보여 줍니다. 먼저 인코더와 디코더 사이에 층이 하나 생깁니다. 새로 삽입된 층에는 각 셀로부터 계산된 스코어들이 모입니다. 이 스코어를 이용해 소프트맥스 함수를 사용해서 어텐션 가중치를 만듭니다. 이 가중치를 이용해 입력 값 중 어떤 셀을 중점적으로 볼지 결정합니다. 예를 들어 첫 번째 출력 단어인 ‘당신께’ 자리에 가장 적절한 단어는 4번째 셀 ‘you’라는 것을 학습하는 것이지요. 이러한 방식으로 매 출력마다 모든 입력 값을 두루 활용하게 하는 것이 어텐션입니다. 마지막 셀에 모든 입력이 집중되던 RNN의 단점을 훌륭히 극복해 낸 알고리즘입니다.