본문 바로가기

NLP

Attention is all you need 리뷰

Attention is All You Need 는 딥러닝을 활용한 자연어 처리에서 현재 가장 중요한 논문입니다.

 

이 논문 이후로 더 이상 RNN, CNN등을 활용한 자연어 처리 연구는 거의 이루어지지 않다고 봐도 무관합니다.

 

딥러닝을 활용하여 자연어 처리를 한다면, 앞으로는 해당 논문에서 제시한 Transformer 구조나, 이를 변형한 BERT등의 구조를 사용함이 바람직합니다.

 

 

3줄 요약.

Transformer 는 Attention 이 적용된 Seq2Seq에서 RNN 계열(RNN, LSTM, GRU 등)을 제거한 모델입니다. 대신 굉장히 깊은 층의 self-attention layer를 사용하게 됩니다.

 

Transformer 에 적용된 기술로는 , scaled dot-product attention(), multi head attention, position-wise FeedForward Nueral Net(FFNN), Embedding and softmax, Positional Encoding 등이 있고, 여기에 사용되는 Layer는 몇가지 연산이 적용되는 Affine(완전연결계층)이 전부입니다.

 

※Affine : Pytorch: Linear(), Keras : Dense()

 

(기술 하나하나를 놓고 보면 별 것 아니지만, 이어진 모양은 환장하게 어렵습니다.)

 

Transformer와 RNN의 결정적인 차이는 연산속도에 있고, 그를 뒷받침 하는 것은 병렬화, 계산 복잡도 총합, 의존성 최대 길이 입니다.

 

(RNN은 병렬 연산이 엄밀히 말해 불가능합니다.)

 

 

 

0. 요약

 

그동안 시퀀스의 생성에 관한 작업(Transduction Task)에는 RNN계열의 신경망이 사용되었습니다.

 

이런 신경망 모델에는 아주 복잡한 RNN 혹은 CNN이 포함되며, 구조로는 encoder와 decoder를 이어둔 것을 사용합니다.

 

이러한 구조는 이전의 NLP 생성에 있어서 지배적이었습니다.

 

가장 성능이 좋은 모델 역시 어텐션 메커니즘을 통해 encoder와 decoder를 연결한 모델이며 여기에도 당연히 encoder와 decoder가 포함됩니다.

 

이에 본 논문에서는 어텐션 메카니즘에 기인한 아주 간단하고 새로운 모델인 "Transformer"를 제안합니다.

 

이 모델로 우리는 다양한 시퀀스의 생성에 관한 작업(Transduction Task)에서 역대 최고의 성능을 거둘 수 있었습니다.

 

예를 들어 영어-독일어 번역 태스크에서는 28.4 BLEU를, 영어-프랑스어 번역 테스크에서는 31.2BLEU 를 기록하였습니다.

 

이러한 모델을 학습하는 데에는 NVIDIA P100 사양의 GPU 8장으로 3.5일 밖에 걸리지 않았습니다.

(NVIDIA P100은 GPU 서버에 올라간 NIVIDIA V100의 딱 절반 성능입니다.)

 

또한 이 모델은 다른 종류의 과업에도 충분히 잘 적용되는 것을 확인할 수 있었습니다.

 

 

 

1. 초록

 

RNN 계열의 모델들은 최첨단의(state of the art, 이하 SOTA) 성능을 보여왔습니다.

 

근래 수 년간 Encoder-Decoder 구조를 활용한 RNN 계열의 모델(단적으로 말해 Seq2Seq입니다.)은 연구의 주류를 이루어 왔습니다.

 

RNN 모델은 전형적으로 입력과 출력 심볼의 위치를 따라가며 계산을 진행합니다.

 

입력위치를 따라가며 이전 위치에 영향을 받는 다음 위치의 'hidden state'를 생성하는 방식입니다.

 

이런 방식은 본질적으로 병렬화 연산을 배제하여 mini-batch 화 연산이 불가능하다는 치명적인 단점을 가집니다.

 

특히나 긴 문장을 처리할 때 이 속도는 더더욱 느려집니다.

 

최근의 연구에서는 factorization trick(문장을 일정 길이로 분해하는 기법입니다.)으로 성능을 높이는 시도가 있었습니다.

 

또한 조건부 연산 기법(https://arxiv.org/abs/1511.06297) 역시 큰 기여를 했습니다.

 

그러나, 길이가 다른 Seq의 연산에 대한 본질적인 제약은 여전히 남아있습니다.

 

 

Attention은 여러가지 Task의 시퀀스 생성모델에 있어서 굉장히 중요한 부분이 되었습니다

 

Attention 모델은 멀리 떨어진 토큰(단어, 형태소 등)의 의존관계를 모델링 할 수 있게 해줌으로써 중요한 하나의 요소로 자리잡게 됩니다.

 

그러나 이 좋은 어텐션이 기껏해야 RNN계열의 "접속사" 수준의 역할 밖에 하지 못하는 것에 저자는 비탄을 금치 못합니다!

 

 

이 논문에서는 RNN을 피하고, 대신 Attention에만 의지한 새로운 모델인 Transformer를 제안합니다.

 

P100 GPU 8대로 SOTA 성능을 달성한 빠르고 좋은 알고리즘입니다!

 

 

 

 

2. 이전 연구.

 

CNN

 

Seq2Seq 이후, Transformer 이전의 연구들의 죄다 CNN을 접목시켜 RNN계열의 연산량을 줄이려 했습니다.

 

(실제로 한국어 연구도 많은 경우 그렇게 진행했습니다. 한국어는 음소단위 CNN이 꽤 좋은 성능을 보여줍니다. 음소는 ㄱ, ㅏ, ㄷ 같은 낱글자 하나하나를 말합니다.)

이러한 연구의 예시는 ByteNet, ConvS2S등이 있습니다. 모두 CNN을 적극적으로 사용합니다.

 

이 두 모델은 입력과 출력의 길이 N 에 대해서 계산 복잡도가 O(N) 입니다.

 

하지만, Transformer는 계산 복잡도가 O(1) 밖에 되지 않습니다.(But, 처리 과정에서 줄어든 계산량이 다시 늘어나긴 합니다.)

 

 

 

Self-Attention, 혹은 infra-Attention

 

단일 시퀀스 Representation(표현이 아니라 벡터화에 가깝습니다.)을 계산하기 위한 어텐션 메커니즘입니다.

 

다양한 NLP Task에서 좋은 좋능을 보여주었습니다.

 

 

 

End-to-End Memory Network

 

Attention의 순환 접근입니다. 소수의 태스크에서 좋은 성능을 보입니다.

(한마디로 Attention의 결과물로 RNN을 돌린 녀석입니다.)

 

 

적어도 저자가 아는 한에서는 Transformer는 RNN과 CNN을 사용하지 않고 전적으로 Attention 만을 사용한 최초의 알고리즘 입니다.

 

 

 

3. Model Architecture

 

Transformer는 세부 기술들이 이어진 하나의 통합 구조입니다.

 

들어가는 세부 기술들만 나열하자면 아래와 같습니다.

 

scaled dot-product attention(), multi head attention, position-wise FeedForward Nueral Net(FFNN), Embedding and softmax, Positional Encoding, Encoder-Decoder, no Peaking Mask, Padding Mask

 

이 구조들을 이해하기 위해서 필수로 알아야할 선수 과목은 아래와 같습니다.

 

=> Deep learning 기초 (Affine 연결, Adam, relu,softmax)

 

 

 

=> 코사인 유사도

 

=> Attention

 

 

=> Seq2Seq

 

 

 

 

=> word-piece tokenizing

 

 

경쟁력이 있는 생성 알고리즘의 거의 대부분은 encoder-decoder 구조를 차용합니다.

 

소스와 타겟에 대해서 모델은 자기 회귀 하며, 이전의 토큰 표현을 "소비"하여 다음의 기호를 만드는 구조를 가집니다.

(링크는 걸어두었습니다만.... 꼭 알아야 하는 것은 아닙니다.)

 

Transformer도 이러한 모델의 구조를 따라가되, point-wise 스택과 self attention 스택을 가지는 차이점이 있습니다.

 

(Transformer 구조 개관, 상상 이상으로 복잡합니다.)

 

 

3.1 Encoder and Decoder Stack

 

바로 윗 그림에서 왼쪽이 Encoder, 오른쪽이 Decoder 입니다. Nx 라고 마크되어 있는 박스 부분이 하나의 작은 층을 구성하며,

 

Encoder와 Decoder 모두 저 작은 층을 6개씩 이어 붙인 모델입니다.

 

Encoder에서 나온 출력은 Decoder의 입력으로 사용되는데, 이 입력으로 사용되는 연결 자체도 완전연결로 구성됩니다.

 

이 구조에서 Decoder를 떼고, Encoder의 끝에 Gloval Average Pooling 만 연결해도 분류기가 하나 완성됩니다.

 

뒤 이어 나올 내용들을 이해하기 전에 우선 전체적인 구조를 반드시 이해해야 합니다.

 

(Attention => Add & Norm => FFNN => Add & Norm) X 6회

 

 

 

3.2 Attention

 

Transformer 에서 사용되는 Attention 계층은 모두 3종류가 있고, 처리의 방식이 다릅니다.

 

인코더의 Attention, 디코더의 Attention, 디코더의 Masked Attention이 그것입니다.

 

일단 3 Attention 계층의 기본 구조부터 훑어봅니다.

 

 

 

3.2.1 Scaled Dot-Product Attention ☆☆

 

 

 

Attention Layer로 들어온 값을 I 라고 하겠습니다.

 

이 값은 3개의 Affine 으로 동시에 '복사'되어 들어가게 됩니다.

 

그리고 그걸 통과하면 Q, K, V의 값이 나옵니다.

 

본질적으로 Q, K, V는 같은 값으로 만들어집니다. 이때, 3개의 Affine은 각기 다른 값을 지녀 Q, K, V를 다른 역할을 하도록 만듭니다.

 

그 다른 역할은 다음과 같습니다.

 

Q: Query

 

K: Key

 

V: Value

 

이 값들은 이렇게 활용합니다. Q를 이용해서 K에 대해 묻고, 그 닶을 V와 비교하여 최고의 V를 뽑아내는 것이 목적입니다.

 

실제로 출력으로써 사용하는 값은 V 입니다. Q와 K로는 연관성을 검출합니다.

 

먼저 Q와 K의 전치행렬을 곱합니다. 이는 벡터의 내적을 구하는 것으로, 코사인 유사도를 구하는 것과 같습니다!

 

그리고 K의 길이 값으로 나누어 스케일을 줄여줍니다.

 

Q와 K의 전치행렬을 곱하면 Seq의 최대길이(한마디로 단어의 숫자 입니다.) 크기를 가진 정방행렬이 나옵니다.

 

이 정방행렬로 softmax를 하면 각 단어의 "중요도" 즉 Attention이 구해집니다. 여기서 스케일을 줄인 효과로 정확도가 높아집니다.

 

이 값은 딱 Seq의 최대 길이 만큼 있으므로, 이 값들을 V 에 곱함으로써 V의 중요도를 반영, 결과가 Self-Attention되게 됩니다.

 

이걸 그림으로 설명하면 아래와 같습니다.

 

 

이렇게 구해진 값들을 다시 batch 사이즈에 따라서 다시 하나의 행렬로 모으면(concat), 이 자체로써 이미 훌륭한 병렬 연산인 셈입니다.

 

 

3.2.2 MultiHead Attention

 

이렇게 concat을 하는 것이 바로 MultiHead Attention 입니다. Scaled Dot-Product 가 이해되었다면 아래 그림으로 완벽히 설명이 가능합니다.

 

 

중간에 보라색 박스를 묶는 h 가 바로 mini batch의 크기가 되어, h만큼 병렬 연산이 가능합니다.

 

이 기술은 실제 구현시에는 concat이 아니라 reshape를 통해서 구현합니다. Tensorflow나 Pytorch 에서도 모두 같은 방식으로 구현합니다.

 

여기서 한가지 맹점이 있다면, h의 수가 늘어날 수록 정확도가 떨어진다는 점입니다.(논문에 나온 내용은 아닙니다.)

 

h의 수는 논문에서 제시한 8이 적절합니다.

 

 

 

 

3.2.3 Attention의 적용.

 

Attention 파트에 대해 설명하며 Transformer 에는 3가지 종류의 Attention이 있다고 설명하였습니다.

 

실제로, 3가지 종류의 어텐션이 어떻게 다른지 살펴보는 파트입니다.

 

 

인코더의 Attention, 디코더의 Attention, 디코더의 Masked Attention은 모두 다르게 동작합니다!

 

 

=> 첫번째. 디코더의 Attention.

 

디코더의 Attention은 Encoder에서 오는 정보를 받아들이는 가교 역할을 합니다.

 

디코더의 Attention은 매우 극적으로 동작합니다.

 

Scaled dot Product Attention에서 같은 인풋을 다른 Affine에 통과시켜 Q와 K와 V를 나누었습니다.

 

그러나, 디코더의 Attention은 Q와 K는 Encoder로부터, V는 Decoder로 부터 옵니다.

 

즉, Self-Attention을 활용하여 출력 단어의 중요도를 구하게 되는 것입니다.

 

 

 

그림으로는 이렇게 표현되어 있습니다.

 

즉, Input으로 들어온 단어에 대해서 자기 자신의 코사인 유사도를 구하고, 이를 중요도로 활용하여, 실제 출력값이 될 V를 찾는 메카니즘입니다.

 

 

 

=> 인코더의 어텐션, 디코더의 마스크 어텐션

 

 

(ConvS2S의 어텐션 전달 과정. 재생이 조금 느릴 수 있습니다.)

 

 

 

(Transformer의 Attention 전달 과정. 재생이 조금 느릴 수 있습니다.)

 

 

인코더의 어텐션은 모든 신호가 다 전달이 됩니다. 하지만, 디코더의 신호는 모든 신호가 전달되어서는 안됩니다.

 

우리가 문장을 생성할때, 앞에서부터 하나씩 차례대로 단어를 구성해 나가기 때문입니다.

 

더 뒤에 나올 단어의 어텐션이 그 앞에 나올 단어를 결정할 때 사용할 어텐션에 전달되어서는 안됩니다!

 

이를 위해서 인코더의 어텐션과 디코더의 마스크 어텐션은 다르게 동작합니다.

 

scaled dot-product attention에 아무런 변형도 가하지 않으면 그 자체로 인코더의 어텐션입니다.

 

거기에 No Peacking Mask를 적용하면 디코더의 마스크 어텐션이 됩니다.

 

 

 

=> No Peaking Mask

 

실제 적용되는 No Peaking Mask의 예시입니다.

 

참조해야할 Attention 만을 표시한 것이죠. Attention Mask는 Boolean 타입을 자료형으로 가지는 Tensor를 사용합니다.

 

만약 False 라면 음의 무한대를 곱해서, softmax를 거치면 신호가 0이 되어 신호를 차단하는 트릭입니다.

 

 

 

 

 

 

3.3 Position Wise Feed Forward Networks

 

 

트랜스 포머의 네트워크는 기본구조기 6개 이어진 형태입니다.

 

그리고 이 기본구조에는 multihead attention과 FFNN이 들어가 있습니다.

 

multi head attention을 거친 신호는 그 이후 한번의 신경망을 거쳐 다음 attention layer로 전달됩니다.

 

FFNN 은 그냥 단순한 2층 짜리 Affine 계층이 붙어 있는 것입니다.

 

이때의 노드 수는 2048개 입니다.

 

 

 

3.4 Embeddings and Softmax

 

특별할 것 없는 레이어 들입니다. Embedding은 항상 그렇듯 첫 번째 입력층에, Softmax는 Sacaled dot product Attention 에 적용되어 있습니다.

 

 

 

3.5 Positional Encoding  ☆☆

 

Transeformer는 순환(RNN)도, 합성곱(CNN)도 사용하지 않았기 때문에 시퀀스의 순서를 고려하려면 다른 처리가 필요합니다.

 

Embedding 을 거친 입력값에 대해서, 코사인 함수와 사인 함수를 적용하는 것으로 이 시퀀스의 순서를 고려하게 됩니다.(단순히 위치값을 해당 함수에 대입한 후 곱해주는 것이 전부입니다.)

 

Transformer에서 이 부분은 많은 비판을 받은 부분으로, 이 이후에 나온 대부분의 모델들은 위치값을 전혀 다른 임베딩 레이어에 흘려보내는 방법을 사용합니다.

 

예를 들어서, BERT는 3개의 임베딩을 사용하는데, 각기 토큰번호, 문장번호, 위치번호 를 다른 임베딩에 흘려보내는 방식을 차용합니다.

 

 

 

 

 

4. 왜 Self-Attention인가?

 

Self-Attetion은 다음 3가지 측면에서 RNN 혹은 CNN에 비하여 우월합니다.

 

=> 신경망 각 층의 계산 복잡도

=> 병렬연산이 가능한 계산의 총량

=> 멀리 떨어진 토큰의 의존성 고려

 

그리고 부가적인 효과로 시각화가 매우 쉬워 그 구조를 파악하기 좋다는 장점이 있습니다.

 

 

위와 같은 식으로 각각의 토큰들이 어떤 출력을 보이는지 한눈에 파악이 가능합니다.

 

 

 

 

5, 6 실험 및 검증, 한계점

 

이 부분은 생략하겠습니다.

 

이 한계점을 극복한 모델이 BERT계열임베딩이고, 모든 부분의 실험결과에서 BERT가 압도적입니다.

 

'NLP' 카테고리의 다른 글

google ads 관련 논문  (0) 2021.05.05
Laser Tagger 논문 리뷰  (0) 2021.04.05