본문 바로가기
ML & DL (Machine Learning&Deep Learning)/Deep Learning (DL)

[Deep Learning] Transformer - Attention is All You Need (NIPS 2017)

by 초코칩프라푸치노 2022. 2. 26.

⊙ 개요

현 자연어 처리 모델 중 State of the Art로 활용되는 GPT, BERT 등의 모델의 기반이 되는 Transformer 아키텍처 논문(Attention is All You Need)에 대해 알아보겠습니다.

 

⊙ NMT (Neaural Machine Translation)

NMT는 자동화된 언어 번역을 위한 End-to-End Learning 접근 방식입니다. NMT는 기존의 구문 기반 통계(Counting) 기계 번역 시스템의 여러 가지 약점을 극복할 수 있습니다. 기계 번역은 지난 몇 년간 큰 성공을 거뒀지만 여전히 어려운 작업으로 남아 있습니다.

NMT와 언어 이해 모델의 최근 역사를 살펴보겠습니다.

NLP의 발전 과정

2017년에 소개된 Transformer 아키텍처는 NMT에 중대한 이정표를 제공했습니다.  또한 Transformer는 그 이후에 개발되어 광범위한 NLP 작업에 사용되고 있는 수많은 모델의 기반이 되었기에 , 이렇게 Transformer 작동 방식을 자세히 살펴겠습니다.

 

⊙ Transformer Architecture 개요

Transformer는 RNN(순환 뉴럴 네트워크)을 활용한 다양한 시퀀스 모델링 작업을 수행하는 모델을 대체할 수 있는 경쟁력을 갖고 있습니다. 이는 Transformer의 연산이 순차적이라는 RNN의 중대한 단점을 해결해 주기 때문입니다. RNN은 한 번에 한 단어를 읽어야 하므로 인접한 단어의 의미적 연관성에 대한 결과를 얻으려면 여러 단계를 수행해야 합니다. 

반면, Transformer는 문장의 모든 단어 사이의 관계를 직접 모델링하는 Self-Attention 메커니즘에 의존합니다. 맥락 정보를 포함하는 각 입력 기호(단어 등)에 대해 벡터가 계산됩니다. 네트워크는 보다 쉽게 병렬화되므로 더 효율적입니다. Transformer는 Self-Attention 메커니즘과 Feed forward 연결을 통해 번역 품질과 속도 모두에 있어서 NMT 분야를 한층 더 발전시켰습니다.

Encoder-Decoder at Transformer Architecture

 

⊙ 인코더(Encoder)

Transformer에서 인코더와 디코더 모두 각각 6개의 동일한 레이어로 구성되므로 총 레이어는 12개입니다. 6개의 인코더 레이어에는 각각 2개의 하위 레이어가 있습니다. 첫 번째 하위 레이어는 Multi-Head Self Attention 메커니즘이고, 두 번째 하위 레이어는 단순한 Fully connected feed forward 네트워크입니다.  

인코더는 소스 문장을 숨겨진 상태 벡터로 인코딩하는 데 사용되며, 디코더는 상태 벡터의 마지막 표현을 사용하여 대상 언어의 문자를 예측합니다. 인코드 블록 안에서 어떤 일이 일어나고 있는지 살펴보겠습니다. 

Encoder

⊙ Positional Encoding 

기존 RNN 기반의 아키텍처는 RNN을 사용하는 것으로 각각의 단어가 순서에 맞게 들어가기 때문에 자동으로 Hidden State에 순서의 값을 가지게 됩니다. 하지만, Transformer 모델은 RNN을 사용하지 않으므로 각각의 단어의 위치를 알려줄 필요가 있습니다. 이것을 해결하기 위해 입력 Sequence와 같은 차원을 가지는 Positional Encoding을 통해 임베딩에 사용됩니다. 


PE에는 주파수가 서로 다른 sin 및 cos 함수를 사용합니다.

Positional Encoding

여기에서 pos는 입력 문장에서의 위치이고, i는 임베딩 벡터 내의 차원의 인덱스입니다. d는 Transformer의 모든 층의 출력 차원을 의미하는 하이퍼 파라미터입니다. 본 논문에서는 512를 사용하고 있습니다.

pos = 1, i = 2, d = 4

⊙ 잔차 학습 (Residual Learning)

임베딩 이후, 값을 반복적으로 층을 통해 학습하는 것이 아닌 특정 층을 건너뜁니다. 특정 층을 건넘 뜀으로써 네트워크는 기존 정보를 입력받으면서 추가적으로 잔여된 부분만 학습하게 됩니다. 역전파의 의한 손실과 전반적인 학습 난이도가 낮아지고 초기에 모델 수렴 속도고 높게 되고 그로 인해서 Global Optima를 찾을 확률이 높게 됩니다.

 

⊙ Self Attention

인코더와 디코더에서 모두 사용되며, Self Attention을 통해 매번 입력 문장에서 각 단어가 다른 어떤 단어와 연관성이 높은지 계산할 수 있습니다.

Self Attention을 계산하는 첫 번째 단계는 인코더의 각 입력 벡터(임베딩)에서 3개의 벡터를 만드는 것입니다. 각 단어에 대해 Query 벡터, Key 벡터 및 Value 벡터를 만듭니다. 이제 어텐션 값이 어떻게 계산되는지 살펴보겠습니다. 어텐션 함수는 아래와 같이 정의됩니다.

Attention Function

Q, K, V 행렬이 어떻게 계산되는지 살펴보겠습니다. 트랜스포머는 인코딩 된 입력 표현을 Key-Value 쌍(K, V) 세트(모두 차원 dk)로 인식합니다.

1. 각 단어에 대해 Query 벡터(qi), Key 벡터(ki) 및 Value 벡터(vi)를 만듭니다. 이러한 벡터는 단어의 임베딩에 트레이닝 프로세스 중에 트레이닝된 3개의 행렬을 곱해서 만듭니다. 
2. 각 단어의 Self-Attention Energy 계산합니다. 첫 번째 단어 점수는 q1.k1이고, 두 번째 단어 점수는 q2.k2입니다.
3. 점수를 8로 나눕니다(문서에 사용된 Key 벡터 sqrt(d)의 차원 제곱근).
4. 결과가 SoftMax 연산을 거치게 합니다.
5. 각 Value 벡터에 SoftMax 점수를 곱합니다(SoftMax x 값).
6. 가중치가 적용된 Value 벡터를 합산합니다. 그러면 이 위치에 첫 번째 단어에 대한 Self-Attention이 출력됩니다.

 

Self-Attention 행렬 계산에 대해 살펴보겠습니다.
아래 그림은 Self-Attention의 행렬 계산을 보여줍니다(이를 위의 Attention 함수와 비교). 먼저, 임베딩을 행렬 X로 패킹합니다. 행렬 X의 각 행에는 입력 시퀀스의 각 단어의 임베딩 값이 포함됩니다(즉, X = [x1x2, ..., xn]). 여기에서 각 xi는 단어 i를 나타내는 임베딩 값의 벡터입니다.

Self Attention Matrix Calcuation

이때 나오는 z를 Attention head라고 칭합니다.

 

⊙ Multi Head Attention

Multi-Head Attention은 기본적으로 병렬로 여러 번 반복되는 Attention입니다. 위에서 개략적으로 설명한 것과 동일한 Self-Attention 계산을 수행할 경우 h = 8이므로 횟수와 가중치가 서로 다른 8개의 Z 행렬로 Attention이 계산됩니다.

Multi-Head Attention Architecture

보시다시피 싱글 Attention 헤드는 구조가 단순합니다. 싱글 Attention 헤드(z)는 고유한 선형 변환을 입력 Query, Key, Value에 적용하고 각 Query와 Key 사이의 Attention 점수를 계산한 다음 이를 사용해 값에 가중치를 적용하고 합산합니다. Multi-Head Attention 블록은 여러 개의 블록을 병렬로 Concatenate하고 출력을 연결한 후에 하나의 단일 선형 변환을 적용합니다. 결국 Multi-Head Attention의 결과가 입력 행렬과 같은 차원을 유지합니다.

 

⊙ 디코더(Decoder)

디코더는 인코더와 유사한 방식으로 작동하지만 왼쪽에서 오른쪽으로 한 번에 한 단어를 생성합니다. 이전에 생성된 다른 단어뿐 아니라 인코더에서 생성된 최종 표현도 처리합니다. 

인코딩 단계를 완료한 후 디코딩 단계가 시작됩니다. 마지막 인코더 레이어의 출력이 모든 디코더 레이어에 입력됩니다. 디코더를 여러 번 사용하여 <eos>가 나올 때까지 반복합니다. 디코더는 인코더와 매우 유사한 구조를 갖고 있습니다. 각 인코더 레이어의 2개의 하위 레이어 외에도 디코더는 인코더 스택의 출력에 대해 Multi-Head Attention을 수행하는 세 번째 하위 레이어를 삽입합니다. 인코더와 마찬가지로 각 하위 레이어 주위에 Residual Connection이 있으며 뒤이어 레이어 정규화가 진행됩니다.

 

⊙  Masked Multi Head Attention

디코더에 "Masked-Multi-Head Attention" 레이어가 있음을 알 수 있습니다. 디코더의 Self Attention 레이어는 디코더의 각 위치가 해당 위치를 포함해 디코더의 모든 위치를 처리할 수 있게 해 줍니다. 디코더에서 자동 회귀 속성을 유지하기 위해 왼쪽 방향 정보 흐름을 방지해야 합니다. 출력 임베딩이 하나의 위치로 오프셋 된다는 사실을 고려할 때 이 마스킹은 i 미만의 위치에서 알려진 출력에 따라서만 위치 i에 대한 예측이 이루어질 수 있도록 합니다. 다시 말해서, 미래의 단어가 어텐션의 일부가 되지 않도록 Masked-Multi-Head Attention이 적용됩니다.

 

⊙ Attentions

Attentions

다양한 Attention들이 소개되었습니다. 위의 그림처럼 병렬화를 위해 Multi-Head Attention이 기본으로 진행됩니다. 빨간색은 임베딩된 문장에서 단어 사이의 연관성을 찾기 위해 Selt Attention이 진행되며 파란색은 Encoder의 마지막 head를 참고하여 디코더에서 단어를 생성하는 Encoder-Decoder Attention이 진행됩니다.

 

⊙ Q&A

1. 기존 RNN 기반 모델인 Seq2Seq의 단점은?

고정된 크기의 Context Vector로 의한 병목 현상 (벡터로 압축할 때의 데이터 손실)

RNN의 고질적은 기울기 소실 문제

 

2. 인코더와 디코더 layer 개수는?

6개

 

3. Multi-head attention의 장점은?

Attention 연산을 병렬로 처리하여 속도면에서 이득을 취할 수 있습니다.

 

4. Multi-head masked attention이 Multi-head attention과 대비되는 차이점은?

디코더에서 어떠한 단어가 이전 단어만 참고할 수 있도록 마스킹됩니다.

 

5. Positional Encoding으로 cos, sin함수를 사용하는 이유는?

-1과 1 사이의 값으로 가지고 있어 상대적인 위치를 나타낼 수 있으며, 입력 Sequence의 아무리 길이가 길어도 영향을 받지 않습니다.

 

6. 패딩 마스크는 어떤 역할을 하나요?

입력 문장에 <PAD> 토큰이 있을 경우 Attention에서 사실상 제외하기 위한 연산입니다.

 

7. 디코더에 Label Smoothing을 적용한 이유는?

One-Hot Encoding은 0 또는 1로 표현하는 반면, Label Smoothing은 정답은 1에 가까운 값, 오답은 0에 가까운 값으로 변화시킵니다. 모델이 학습 시 데이터에 너무 치중되지 않도록 보완하는 기술입니다. 같은 데이터의 서로 상이한 결괏값(감사합니다, 고맙습니다)이 One-Hot Encoding으로 존재할 경우 학습이 원활하지 않습니다. 이처럼, Label이 Noisy한 경우에 성능 향상에 효과적일 수 있습니다.

 

⊙ Original Paper

https://arxiv.org/abs/1706.03762

 

Attention Is All You Need

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new

arxiv.org

 

반응형

댓글