brunch

seq2seq의 단점을 극복한 Attention

chatGPT를 위한 NLP 기초 :Attention

by 별똥별 shooting star


들어가며

지금까지 RNN을 통해 문장을 생성하고 2개의 RNN을 연결한 seq2seq를 통해서 새로운 시계열 데이터로 변환도 해보았다. 오늘 배울 내용은 seq2seq의 문장이 길어질수록 성능이 저하되는 한계를 극복하여 더 강력한 seq2seq로 만드는 어텐션 메커니즘에 대해서 살펴보도록 하겠다.



1. seq2seq의 문제점

seq2seq의 한계로 문장이 길어질수록 성능이 저하된다고 하였다. 왜냐하면 seq2seq에서 Encoder의 출력은 고정 길이의 벡터이다. 그렇기 때문에 긴 문장이 입력되더라도 똑같은 길이의 벡터로 밀어 넣어야 하기 때문에 필요한 정보가 다 담기지 못하게 되는 것이다. 그래서 Encoder와 Decoder를 어텐션 메커니즘으로 개선하여 보다 더 개선된 seq2seq를 구성할 수 있다.


image.png

출처 : 밑바닥부터 시작하는 딥러닝2



2. Attention

image.png

출처 : https://arxiv.org/pdf/1812.02303.pdf


1) Encoder 개선

기존의 seq2seq는 LSTM 계층의 마지막 hidden state만 Decoder에 전달했었다. 하지만 어텐션 메커니즘은 Encoder 모든 time step의 hidden state의 정보를 컨텍스트 벡터에 반영되도록 한다. 이렇게 해서 하나의 고정 길이 벡터에서 벗어나게 된다. 그리고 주목해야 할 것은 LSTM 계층의 은닉 상태 내용인데 각각의 벡터는 입력된 해당 단어에 대한 정보를 많이 포함한다. 이렇게 해서 hs 행렬은 각 단어에 해당하는 벡터들의 집합이 된다.


image.png


2) Decoder 개선

Encoder에서 형성된 컨텍스트 벡터는 Decoder로 전달되는데 모든 hidden state가 동일한 비중으로 반영되지는 않는다. 각 hidden state의 중요도를 나타내는 가중치 a와 Encoder에서 받아온 각 hidden state를 가중합하여 벡터를 얻는다. 이를 맥락 벡터라고 부르고 기호는 c로 표기한다.


image.png


그렇다면 의문이 하나 들 것이다. hs 값은 Encoder에서 받아 왔다. 그런데 중요도를 판단하는 가중치 a는 어디에서 나온 것일까?


image.png


가장 단순한 방법으로는 내적을 통해서 두 벡터의 유사도를 표현하는 것이다. 위의 그림을 보면 내적을 통해서 h와 hs의 각 단어 벡터와의 유사도를 구한다. 그렇게 해서 나온 결괏값이 s이다. 이 s는 또다시 소프트맥스 함수를 이용해서 0~1 사이의 값으로 만들어 최종 a의 값을 얻을 수 있다.


추가적으로 hs와 a를 가중합 하기 위해서는 a의 형태를 아래와 같이 변형시킬 필요가 있다.

image.png


정리하면 Encoder가 출력하는 각 단어의 벡터 hs에 해당 단어의 가중치 a를 구한다. 이어서 a와 hs의 가중합을 구하고 그 결과로 맥락 벡터 c로 출력한다. 즉, Encoder의 hidden state의 중요도를 취합한 컨텍스트 벡터를 디코더의 time step 별로 계산을 하는 것이다.



마치며

위에서 배운 Attention은 기본적인 Attention이다. 하나의 Weight를 사용하는 Attention으로 발전하기도 하고 트랜스포머에서 사용되는 self-Attention, Scaled Dot Product Attention 등으로도 발전되기도 하였다. 다음 시간부터는 트랜스포머의 개념과 활용되는 Attention을 중점적으로 살펴보도록 하겠다.

keyword
매거진의 이전글RNN의 단점을 극복한 seq2seq