앞서 공부한 시퀀스 투 시퀀스 모델, 인코더 디코더 모델에는 문제점이 하나 있습니다. 바로, 전체 문장을 하나의 벡터에 압축하게 된다는 점입니다.
물론 문장의 각 단어의 중요도에 따라 가중치를 다르게 부여하여 벡터에 반영하는 기법을 통해 고정된 크기의 하나의 벡터에 문장에 포함된 단어들을 잘 표현해내도록 개선하였지만, 여전히 문장이 길어지는 경우에 벡터에 저장할 수 있는 정보에 한계가 있다는 문제가 발생합니다.
짧은 문장
철수는 사과를 먹었다.
긴 문장
기나긴 세월 끝에 자신의 목적도 명분도 잊어버린 철수는 눈물로 얼룩진 매일밤을 보내다가 결국 오랜 세월이 깃들어 손때가 누덕한 냉장고 문을 열고서 과거의 죄악이 얽혀있는 사과를 꺼내들어 한 입을 베어물었다.
위 두 문장을 각각 하나의 벡터에 압축해 담는다고 가정해봅시다. 짧은 문장의 경우, 문장의 핵심인 ‘철수', ‘사과', ‘먹다' 라는 의미를 표현 벡터에 담아 전달하거나 번역에 활용할 수 있을 것입니다. 그러나, 문장의 길이가 길어질수록 표현 벡터에 담겨야 할 단어가 많아지게 되어, 이러한 방식은 실제로 적용되기는 어려울 것입니다. 또, 비슷한 이유로 문장이 길어질수록 모델의 역전파에서 그래디언트가 소실되어 학습이 힘들다는 문제점도 있습니다.
실제로 사람이 문장을 번역할 때는 이렇게 문장 전체를 하나의 표현으로 변환한 뒤, 이를 바탕으로 번역하지 않습니다. 오히려, 문장에서 관련 있는 부분들만 살피며 번역을 수행하는 것이 훨씬 자연스럽습니다.
문장번역
Today, Charles gave apple to Bora
오늘 철수는 보라에게 사과를 주었다.
위 예시에서, ‘보라에게' 라는 단어를 번역하기 위해서 사람은 ‘to’, ‘Bora’라는 단어에 집중합니다. 문장의 다른 단어들은 해당 부분을 번역할 때 큰 관련이 없기 때문입니다. 즉, 사람은 출력을 생성하기 위해서 관련된 입력 부분에만 집중하여 생각합니다. NLP 모델이 생각하는 방식을 사람이 생각하는 방식과 유사하게 만든 것이 바로 어텐션 메커니즘 입니다.
어텐션 매커니즘을 적용한 덕분에 기계가 집중하고자 하는 부분에만 초첨을 맞추고 연산을 수행할 수 있어 메모리 용량과 성능 면에서 큰 발전을 이루게 됩니다. 2015년에 어텐션 메커니즘이 등장한 이후로 최근까지도 본 방식을 소개한 논문이 15,000번 넘는 인용 수를 보여줄 정도로 큰 영향력을 보여주고 있고, BERT나 GPT같은 딥러닝 모델 뿐만 아니라 구글 번역기나 파파고 등의 다양한 서비스에서도 어텐션 메커니즘을 적용되어지고 있습니다.
이렇게 중요한 어텐션 매커니즘이 어떻게 작동하고, 왜 기존보다 좋은 성능을 낼 수 있게 되었는지를 아래에서 자세히 알아보겠습니다.
어텐션의 작동 방식
먼저, 인코더-디코더 모델이 작동하는 방식을 다시 한 번 간단히 살펴보면 아래와 같습니다.
인코더-디코더 모델은 문장을 하나의 벡터로 압축한 뒤, 이를 번역 과정에 활용하게 됩니다. 그러나 표현 벡터가 고정된 크기의 벡터 한 개이기 때문에, 번역(디코딩) 과정에서 문장이 길어질 수록 벡터가 가진 단어에 대한 의미들이 여러 개의 RNN을 거치면서 희석되어 긴 문장을 잘 번역해내지 못하게 됩니다.
이러한 단점을 개선하기 위해 디코딩에서 모든 RNN 셀이 표현 벡터를 참고하도록 만든 구조도 존재합니다.
그러나 이 모델에서도 동일하게 ‘단 한 개의 고정된 크기의 표현 벡터에 문장을 압축해야 한다'는 단점이 있습니다. 이 문제를 어텐션 매커니즘에서는 모든 디코더의 RNN이 인코더의 각 타임 스텝마다 RNN의 결과 값인 출력을 참고하는 방식으로 해결합니다. 다음은 어텐션 메커니즘을 적용한 인코더-디코더 모델을 간단하게 나타낸 것입니다.
위 그림에서 초록색으로 표현한 부분에서 볼 수 있듯이, 어텐션 메커니즘에서는 인코더 RNN의 출력 값들을 모두 따로 빼서 배열에 담아놓고, 디코더 RNN에게 이 값들을 입력으로 전달합니다. 디코더 RNN들은 단순히 표현 벡터만으로 번역을 수행하는 것이 아니라, 모든 단어가 각각 입력되었을 때의 은닉 벡터 값(hidden state 값)들을 함께 참고하여 번역을 수행합니다. 여기에서, 모든 은닉 벡터 값들을 동일한 비율로 참고하여 번역하는 것이 아닌, 현재 작업을 수행하려는 문장의 부분과 가장 관련 높은 벡터들에 높은 가중치를 주는 방식으로 연관된 단어에만 초점을 맞추어 연산할 수 있습니다.
위 과정 중에서 ‘ate’를 번역하는 타임 스텝에 대해서 모델의 연산에 대해서 그려보면서, 어텐션 메커니즘에 필요한 연산을 조금 더 소개해보겠습니다.
우선 각 인코더 RNN의 결과(은닉 벡터)가 현재 처리하고자 하는 단어와 얼마나 관련 있는지에 대한 정보인 에너지 값을 구해줍니다. 이 에너지는 인코더 RNN의 출력인 은닉 벡터와 디코더 RNN의 출력벡터 간에 코사인 유사도(내적)을 통해 “벡터 간의 비슷한 정도”로 찾아내게 됩니다. 그 다음, 구한 에너지 값들의 합이 1이 되도록 softmax 함수를 통해 0과 1 사이의 값으로 에너지 값들을 변환해 가중치로 만들어줍니다. 이제, 각 은닉 벡터들에 가중치를 곱한 값을 합하여 디코더 RNN에게 입력으로 전달해줍니다. 디코더 RNN은 표현 벡터 정보와 인코더 RNN의 출력에 대한 정보를 이용하여, 적절하게 번역을 수행할 수 있게 됩니다. 이것이 어텐션 매커니즘이 작동하는 방식입니다.
오른쪽 그래프는 문장 길이에 따른 여러 모델들의 처리 성능을 보여주고 있습니다. 어텐션 매커니즘을 추가하기 전까지는 문장 길이가 길어질수록 모델의 성능이 저하되는 문제가 많이 발생했습니다. 그러나, 어텐션 메커니즘을 추가한 모델(실선)의 경우, 문장 길이가 길어지더라도 성능이 떨어지지 않는 것을 볼 수 있습니다.
디코더의 각각의 RNN 들은 문장의 모든 단어에 대한 은닉 벡터값들에 가중치를 곱하고 연산을 수행해야 하기 때문에, 어텐션 매커니즘을 적용한다면 기존 방식보다 확실히 연산량이 많이 늘어날 수 밖에 없습니다. 그러나 실제로는 어텐션 매커니즘의 계산 복잡도가 RNN 방식보다 낮고, 기술의 발전으로 연산 능력 자체도 빨라지고 병렬 처리를 다루는 기술도 발전하여, 긴 문장이라도 어텐션의 연산을 충분히 빠르게 수행할 수 있습니다.
어텐션 매커니즘의 종류
인코딩 과정의 각각 타임스텝에 대한 출력인 은닉 벡터들을 참고해 디코딩 과정의 출력을 결정한다는 어텐션 매커니즘은 자연어처리, 음성, 이미지 등 여러가지 분야에서 다양하게 활용되어집니다. 각각의 분야에 조금 더 적합하게 활용하기 위해 어텐션 매커니즘을 약간씩 수정하여 적용하게 됩니다.
1. 지도 어텐션 Supervised Attention
일반적으로 기계 번역에 대한 데이터는 번역된 결과인 정렬 정보를 훈련 데이터로 제공해줍니다. 이러한 경우에는 이 정답 데이터를 활용하여, 동시에 훈련되어지는 또 다른 신경망을 활용해 어텐션 함수를 학습하는 지도 어텐션 매커니즘을 구성할 수 있습니다.
2. 멀티헤드 어텐션 Multiheaded Attention
멀티헤드 어텐션이란 앞서 이미지로 보여주었던 어텐션 벡터가 여러개로 구성된 네트워크를 구성하여 병렬적으로 동시에 연산이 수행한 뒤 연산값들을 합쳐 한 번의 어텐션보다 더 좋은 결과를 출력하도록 만든 구조입니다. 멀티헤드 어텐션을 통해 각 어텐션마다 가중치를 다르게 가져 문장을 이해하는 ‘관점'을 다양하게 가져간다고 볼 수 있습니다.
고양이는 쥐를 먹지 않았다. 그것이 맛이 없었기 때문이다.
1. 그것 = 고양이 … 고양이가 맛이 없었나?
2. 그것 = 쥐 … 쥐가 맛이 없었나?
다양한 관점의 해석(가중치)를 합쳐 가장 좋은 결과를 만들어낸다.
3. 셀프 어텐션 Self Attention
셀프 어텐션은 이름에서도 볼 수 있듯이, 자기 자신에 대한 어텐션입니다. 셀프 어텐션은 하나의 문장 속에서 다른 단어들과의 관계가 얼마나 잘 표현하고 있는지, 한 부분이 다른 부분에 얼마나 영향을 미치고 있는지를 학습하는 매커니즘입니다. NLP에서 셀프 어텐션은 현재 읽고있는 단어가 문장 속 단어와 얼마나 연관성을 띄는지를 학습합니다. 셀프 어텐션을 통해 모델은 task를 처리할 때 문장의 어느 부분에 주목해야 하는지를 학습하고, 이 정보를 task 수행에 활용할 수 있게 됩니다.
아래 이미지에서, 붉은 색으로 표현된 현재 단어와 관련있는 단어일수록(memory가 activate 될 수록) 푸른 색으로 표현되고 있는 것을 볼 수 있습니다.
셀프 어텐션은 NLP 분야 뿐만 아니라, 음성이나 이미지 등의 다양한 분야에도 적용되어 좋은 성능을 보여주고 있습니다. 멀티헤드 어텐션과 셀프 어텐션은 딥러닝에 지대한 영향을 미친 모델이라 볼 수 있는 트랜스포머(Transformer) 모델에 사용됩니다. 해당 논문을 접하기 전에 이 정도의 간단한 역할을 이해한다면, 읽는데 어느정도 도움이 될 것이라 생각합니다.
4. 멀티모달 어텐션 Multimodal attention
모달이라는 단어는 데이터의 형태를 의미합니다. 앞서 소개했던 모델들과 어텐션 매커니즘들은 텍스트라는 한가지 형태의 데이터만을 다루는 단일 모달(single modal) 모델이였습니다. 그러나, 우리 주변에 데이터는 텍스트 뿐만 아니라 이미지, 음성, 움직임 등 다양한 형태로 존재합니다. 이런 다양한 형태의 데이터를 입력으로 활용하여 문제를 해결하는 방법을 멀티모달 이라고 부릅니다. 텍스트에서 처리한 것과 유사하게, 다양한 종류의 데이터에 어텐션 매커니즘을 적용하여 분석하고 원하는 결과를 출력하는 멀티모달 어텐션을 구성하고 활용하는 방법을 제시한 논문이 다양하게 제시되어 있습니다.
이전 글 읽기
다음 글 읽기