버티의 블로그

[자연어처리 #05] Attention & Transformer 본문

AI/자연어처리

[자연어처리 #05] Attention & Transformer

ㅤ버티ㅤ 2024. 7. 1. 22:28
728x90

Attention

기존 seq2seq는 encoder에서 나오는 context vector모든 정보가 함축되어 있어 원래 단어에 대한 정보 손실이 발생할 수도 있고, 이 context vector을 단어 생성 시마다 모두 사용하므로 비효율적이다. 이를 개선하기 위해 탄생한 메커니즘이 Attention이다.

Attention Mechanism in Seq2seq

 

Attention은 seq2seq와 동일한 구조를 기반으로 하는데, 차이점은 decoder에서 번역 단어를 예측할 때 decoder의 hidden state와 encoder의 hidden state를 내적해서 유사도를 파악한다. 이 값을 Attention Score라고 하고 이후 softmax를 붙여 정규화를 진행하면 이 값들을 확률적으로 접근할 수 있기 때문에 일종의 가중치로 사용할 수 있다.

 

그럼 다시 encoder의 hidden state각각의 가중치를 모두 곱해서 전부 더하는 weighted sum을 진행하여 fully connected layer(FCL)에 전달한다.

 

그럼 FCL에는 가중치와 weighted sum된 encoder의 hidden statedecoder의 hidden state까지 2가지를 갖게 되고 이를 모두 활용해서 최종 단어를 예측한다.

 

이렇게 가중치를 통해 입력의 특정 부분에 집중할 수 있는 메커니즘인 것이다. 여기서 encoder의 hidden statekey(h), decoder의 hidden statequrey(s), key와 가중치를 weighted sum한 부분을 value라고 한다.

Attention Score (Dot Product 방법)


Transformer

Transformer Architecture

 

이제 위 attention을 적용한 대표적인 딥러닝 모델인 Transformer을 알아보자. Transformer로 모델을 training해서 모델의 문장 번역 능력을 기존보다 크게 향상시킬 수 있었다.

 

1) Input of Encoder

Positional Encoding

 

Encoder에서는 번역하려는 원문 문장(source sentence)를 입력으로 넣어주는데, 위치 정보를 같이 주기 위해 인코딩 정보를 같이 더해서 넣어주는 Positional Encoding을 진행한다. 여기서 pos각 단어의 인덱스 번호를, i각 단어의 임데빙 벡터의 위치를 나타내며 이렇게 계산한 Positional Encoding값과 원래 임베딩 벡터를 각각 더하여 입력으로 넣어준다.

 

2) Encoder

보통 Transformer의 encoder는 크게 Multi-Head Attention - Residual Learning - FFN 구조로 되어있고 이런 encoder을 N번 반복하는 형태를 취한다. 또한 마지막 encoder의 output은 decoder로 넘겨주게 된다. 보통 N은 6번을 사용한다. 이제 각 단계를 살펴보자.

Self-Attention

 

우선 Multi-Head Attention에서는 받은 input을 가지고 self-attention을 수행하여 각 단어들이 서로에게 어떤 연관성이 있는지 체크한다.

self-attention에서는 query, key, value 모두 같은 값을 갖고 학습해서 서로 다른 위치 정보가 서로에게 가중치를 부여하도록 만들어서 하나의 시퀀스에 대한 representation을 효과적으로 학습하고 표현할 수 있도록 한다.

Multi-Head Attention Structure

 

그럼 query와 key, value를 위 그림과 같은 방식으로 구해서 각 head별로 attention score을 구하고, 이 attention score들을 모두 Concat하게 되면 최종 output이 된다.

Residual Connection

 

이후 Residual Learning을 한다. 여기서는 원래의 Input Matrix를 그대로 한번 더 더해서 보내준다. 그러면 다음 encoder에서 잔여된 부분만 학습할 수 있어 학습 난이도가 하락하고 성능이 향상된다.

 

여기까지 진행한 값을 이용해서 FFN을 거치고 한번 더 Residual Learning을 하면 encoder의 한 싸이클이 완성되고, 이를 반복해주는 것이다.

 

3) Decoder

 

Decoder의 입력으로는 번역 문장(target sentence)를 입력으로 넣어주고 똑같이 positional encoding을 하여 받는다. 이제 self-attention을 수행하는데, 첫번째 self-attention만 Decoder의 입력값으로 query, key, value를 구성해서 진행하고, 두번째 부터는 encoder의 마지막 출력 정보를 이용하여 self-attention을 한다.

  • query : 기존 decoder의 입력값
  • key, value : 마지막 encoder에서 나온 출력값

이렇게 해서 source sentence가 target sentence로 번역되기 위해 어떤 정보에 보다 초점을 맞춰야 하는지 계산하는 것이다. 나머지는 encoder와 구조가 동일하며 최종 출력은 기존 Seq2seq와 같이 dense layer와 softmax를 거쳐 최종 결과를 만들어낸다.

 

 

 

 

'AI > 자연어처리' 카테고리의 다른 글

[자연어처리 #06] BERT and GPT  (0) 2024.07.02
[자연어처리 #04] Seq2Seq  (0) 2024.06.30
[자연어처리 #03] RNN and LSTM  (4) 2024.06.30
[자연어처리 #02] Text Mining  (0) 2024.06.23
[자연어처리 #01] Text Preprocessing  (0) 2024.06.23