이제 데이터 공부 안하는 블로그

어텐션(Attention) 본문

딥러닝

어텐션(Attention)

공사노비 2021. 8. 21. 11:11

 * 제가 공부하기 위해 만든 자료입니다. 혹시 틀린 부분이 있다면 댓글로 알려주시면 수정하겠습니다.

 

기존 RNN 의 단점은 기울기 소실로부터 나타나는 장기 의존성(Long-term dependency) 문제이다. 장기 의존성 문제는 문장이 길어질 경우 앞 단어의 정보를 잃어버리는 현상을 말한다. 이러한 장기 의존성 문제를 해결하기 위해 LSTM과 GRU이 등장했다.

RNN 기반 모델 (LSTM, GRU)이 단어를 처리하는 방법은 아래와 같다. 인코더에서 입력 시퀸스를 컨텍스트 벡터라는 하나의 고정된 크기의 벡터로 압축하고, 디코더는 이 컨텍스트 벡터를 통해 출력 시퀸스를 만들어낸다.

 

위 구조의 문제는 고정 길이의 hidden-state 벡터에 모든 단어의 의미를 담아야 한다는 점이다. LSTM, GRU가 장기 의존성 문제를 어느 정도 개선하기는 했으나 문장이 너무 긴 경우에는 고정길이의 hidden-state 벡터에 다 담기가 어렵다. 하나의 고정된 크기의 벡터에 모든 정보를 압축하다보면 정보 손실이 발생한다. 그리고 RNN의 고질적인 문제인 기울기 소실 문제도 발생한다. 위와 같은 문제들을 해결하기 위해서 고안된 것이 Attention 이다. Attention 은 신경망들의 성능을 높이기 위한 메커니즘이자 트랜스포머의 기반이 되는 메커니즘이다. 

 

 

 

어텐션(Attention)

Attention은 디코더에서 출력 단어를 예측하는 매 시점마다 인코더에서의 전체 입력 문장을 다시 한 번 참고한다. 다만, 전체 입력 문장을 전부 동일한 비율로 참고하지 않고 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분에 더 집중(attention)해서 참고한다.

 

디코더에서 Attention이 동작하는 방법

  • 디코더의 각 time-step 마다의 hidden-state 벡터는 쿼리(query)로 작용한다. 
  • 인코더에서 넘어온 N개 hidden-state 벡터를 키(key)로 여기고 이들과의 연관성을 계산한다.
  • 디코더의 은닉 벡터(hidden state vector)와 인코더의 Time-step 별 은닉 벡터들을 내적한 값이 Attention score가 된다.

 

 

위의 사진은 디코터 첫 단어에 대한 어텐션 가중치가 구해지는 과정이다. 

  1. 쿼리(Query)인 디코더의 hidden-state 벡터, 키(Key)인 인코더에서 넘어온 hidden-state 벡터를 준비합니다.
  2. 각각의 벡터를 내적한 값을 구합니다.
  3. 이 값에 소프트맥스(softmax) 함수를 취해줍니다.
  4. 소프트맥스를 취하여 나온 값에 밸류(Value)에 해당하는 인코더에서 넘어온 hidden-state 벡터를 곱해줍니다.
  5. 이 벡터를 모두 더해줍니다. 이 벡터의 성분 중에는 쿼리-키 연관성이 높은 밸류 벡터의 성분이 더 많이 들어있게 됩니다.
  6. (그림에는 나와있지 않지만) 최종적으로 5에서 생성된 벡터와 디코더의 hidden-state 벡터를 사용하여 출력 단어를 결정하게 됩니다.

 

디코더는 인코더에서 넘어온 모든 Hidden state 벡터에 대해 위와 같은 계산을 한다. 그래서 Time-step 마다 출력한 단어가 어떤 인코더의 어떤 단어 정보와 연관되어 있는지, 즉 어떤 단어에 집중(attention)할 지 알 수 있다. 이렇게 attention을 활용하면 디코더가 인코더에 입력되는 모든 단어의 정보를 활용할 수 있기 때문에 장기 의존성 문제를 해결 할 수 있다.