본문 바로가기
Review a paper

[Transformer] Attention is all need(1) Seq2Seq 한계점

by _YUJIN_ 2023. 2. 12.

트랜스포머는 2017년에 구글이 발표한 논문인 " Attention is all you need "에서 나온 모델로 기존의 seq2seq의 구조인 인코더와 디코더를 사용하면서, Attention만으로 구현한 모델이다. RNN이나 LSTM을 사용하지 않으면서 인코더 디코더 아키텍처를 활용하였는데, 성능은 RNN 보다 우수한 것을 보여주었다. 

1. 딥러닝 기반의 기계 번역 발전 과정 

  • 2021년 기준으로 최신 고성능 모델들은 트랜스포머 아키텍처를 기반으로 하고 있다.
    - GPT : 트랜스포머의 디코더 (Decoder) 아키텍처 활용
    - BERT : 트랜스포머의 인코더 (Encoder) 아키텍처 활용

Transformer 논문에서는 RNN을 사용하지 않고 오직 Attention 기반의 아키텍처를 활용하여 성능을 개선시켰다.

2. 기존의 Seq2Seq 모델

  • Seq2Seq : 한쪽 시퀀스로부터 다른 한 쪽의 시퀀스를 만들어 낸다는 의미

  • 위 그림의 인코더 부분([독일어])에서는 단어가 입력될때마다 이전까지 입력되었던 단어들의 정보를 포함하고 있는 hidden state 값을 받아 계속 갱신시켜준다. 
    • 그래서 마지막 단어(<eos>)가 들어왔을 때의 hidden state(h4)값은 소스 문장 전체를 대표하는 하나의 context vector로 사용이 된다. 
    • context vector안에는 앞에 등장한 소스 문장에 대한 "문맥적인 정보"를 담고 있다고 가정할 수 있다. 
  • 정리를 하자면, 각각의 단어들로 구성된 시퀀스 정보가 들어왔을 때  하나의 고정된 크기인 context vector로 바꿔주고, 디코더에서는 input으로 context vector를 받아 출력문장을 만들어준다.
  • 디코더 부분에서는, 출력 단어들이 들어올 때마다 context vector로부터 매번 hidden state (s)를 만들어서 출력을 내보낸다.
    ex) <sos> 출력 단어들이 들어오고 context vector을 활용하여 hidden state (s1)을 만들고, 이를 통해 "good" (y1)을 출력해준다. 그리고 (y1)인 "good"이 다시 다음단계에서 input으로 들어가고 이전 단어들의 정보를 가지고 있는 hidden state (s1)로 새로운 hidden state (s2)를 갱신해준다. 
  • 디코더 부분에서도 매번 이전 출력 단어들에 대한 정보를 가지고 hidden state를 갱신해주고, 출력값이 <eos> 가 나올 때까지 계속 반복해준다.
    ex) <eos>가 나왔을 때 "good evening" 결과로 나오게 된다.

3. Seq2Seq 한계점

  • 다양한 길이의 문장에 대해 고정된 크기의 context vector로 압축을 하는 과정에서 병목현상이 발생할 수 있다. 
  • 정보의 손실을 줄이기 위해 context vector를 RNN에서 매번 참고하게 되면 출력되는 문장이 길어진다고 해도, 각각의 출력되는 벡터에 context vector 정보를 넣어줄 수 있어서 손실 정보를 낮출수는 있다. 

  • 하지만, 여전히 소스 문장을 하나의 벡터에 압축을 해야한다. 

< 해결 방안 >

  • 최신 GPU는 많은 메모리와 빠른 병렬 처리를 지원하기 때문에, 매번 소스 문장에서의 출력 전부를 입력받게 된다면 해결할 수 있다고 판단함

4. Seq2Seq with Attention

  • 인코더는 매번 단어가 출력되어 hidden state가 나올 때마다 별도의 배열(w)에 따로 저장한다. 
    w에는 각 단어를 거치면서 나오는 h1,h2,h3,h4에 대한 정보가 모두 포함되어 있다.
  • 디코더에서 출력되는 단어의 정보에 대한 hidden state (s1)에 인코더 단어에서 출력된 정보들을 모두 참고 할 수 있도록 설계하였다. = context vector 하나가 아니라 소스 문장에 대한 모든 정보에 대해 고려할 수 있다.
  • 하지만, 각 단어들을 똑같이 참고하는 것이 아니라 각 단어별 중요도에 따라 가중치(에너지) 값을 두고 참고한다.
  • 디코더는 현재 단계의 hidden state를 만들 때 바로 이전의 hidden state 값을 이용해서 출력단의 hidden state 값과 소스 문장단의 hidden state 값을 서로 묶어 별도의 행렬곱을 수행해서 각 에너지 값을 만든다. 
    • i = 현재의 디코더가 처리 중인 인덱스
    • j = 각각의 인코더 출력 인덱스 

  • 에너지 (Energy) : 디코더가 하나의 출력 단어를 생성할 때 소스 문장에 나왔던 인코더의 모든 출력 값 중 어떤 값과 가장 연관성 있는지를 구하기 위해 수치화 한 값
    • 디코더에서 내가 이전에 출력했던 부분 (s_i-1)과 인코더의 모든 출력값 h_j와 비교해서 에너지 값을 구해준다.

5. Attention 시각화 

  • 어텐션 (attention) 가중치를 사용해 각 출력이 어떤 입력 정보를 참고했는지 알 수 있다. 
  • 어텐션 시각화 : 어텐션 가중치(a)를 이용해서 매번 출력이 나올 때마다 그 출력이 입력에서 어떤 정보를 참고했는지를 알 수 있다.
  • 각 단어들이 있을 때 불어의 단어들을 출력할 때마다 입력 영어 단어의 어떤 단어에 초점을 두었는지 확인이 가능하다.
    * 아래의 그림에서보면 밝게 표시된 부분이 확률값이 높은 부분이다. 

  • 딥러닝은 매우 많은 파라미터를 가지고 있어서 세부적인 내용을 분석해서 어떤 원리를 이용했는지 알아내기는 쉽지 않다. 
  • 어텐션 메커니즘을 사용해서 분석용으로는 확인이 가능하다. 

 

오늘은 seq2seq 한계점과 이를 해결하기 위해 발표된 Attention 기법에 대해 조금 알아보았다. 

다음 내용으로는 RNN이나 CNN을 전혀 필요로 하지 않는 트랜스포머에 대해 더 알아볼 예정이다.

참고로, 트랜스포머는 인코더와 디코더로 구성이 되어 있는데 각 내부에서는 Attention 과정을 여러 레이어에서 반복시킨다는 특징이 있다. 

 

Reference

반응형