본문 바로가기
논문리뷰

[논문리뷰] Transformer 논문 리뷰

by 단깅수 2024. 6. 26.
728x90

오늘은 Transformer 논문 리뷰를 가져왔습니다.

 

 

해당 논문은 2017년에 발표된 논문입니다.

 

논문 : Attention Is All You Need

저자 : Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin

[1] Background

1-1. 기존 Seq2Seq 모델의 한계점 (RNN 등 사용)

출처 : 깃허브, 동빈나

  • 기존의 인코더 - 디코더 구조 : 인코더에서 고정된 크기의 context vector를 생성해 디코더의 입력으로 넣어주는 형식
  • context vector를 만들다보니 인코더의 모든 소스 문장에 대한 정보가 압축되어 병목 현상이 발생하고 입력 문장 전체를 순서대로 받아야 하기 때문에 병렬 처리를 하기에도 어려움이 있었음
  • 그래서 디코더가 매번 context vector를 참고하도록 방향성을 바꿔보았지만 인코더에서 context vector를 생성해야 하는 문제는 여전하기 때문에 병목 현상에 대한 해결 방안은 되지 않았음
  • 그래서 차라리 매 시점마다 새로운 Context Vector를 만들어서 참고하도록 하면 번역 성능이 더 올라가지 않을까? 하는 아이디어가 Attention 알고리즘

 

1-2. 초기 Attention의 여전한 문제점

RNNSearch(초기 Attention) Architecture

  • Attention 등장 이후에는 Decoder의 매 시점마다 Encoder 중 어느 부분에 가장 주목할지 계산 → 어텐션의 본질
  • 하지만 여전히 RNN 기반의 모델이기 때문에 시간의 제약에 자유롭지 않음  갈수록 흐려지는 정보에 Attention 해야 함;;
  • 그리고 Attention에는 동음이의어를 처리할 방법이 따로 없다고 함
    • 예를 들어, "쓰다"라는 동사를 번역할 때 주변 단어에 따라 글을 쓰다(write), ~을 쓰다(use), 맛이 쓰다(bitter) 등 주변 단어를  확인해야 하는데 RNN을 사용하면 주변 단어의 정보가 흐릿하게 있기 때문에 제대로 알기가 힘듦
  • 즉, 거리에 영향을 받을수밖에 없는 RNN, LSTM, GRU 등의 모델들을 가지고 번역한다면 좋지 않다는 얘기고, 이를 해결하기 위해 본 논문에서는 Self-Attention 개념이 들어간 Transformer 모델을 제시함

[2] Model Architecture

1) Self Attention

저번 포스팅에서 Attention 알고리즘은 가중합을 통해 어디에 집중할지 알아보는 알고리즘이라고 설명했습니다.

그런데 Self Attention이란? "스스로 Attention 연산을 수행한다"는 얘기인데 무슨 말인지 예시를 통해 알아보겠습니다.

 

Attention 간단 알고리즘

 

만약 S4 시점의 Context Vector를 구한다고 한다면

C4 = <S4, h1> h1 + <S4, h2> h2 + <S4, h3> h3 가 됩니다.

 

현재 예시에서는 길이가 짧지만 길이가 긴 경우에 h2의 Hidden Vector에는 h10, h20 등등의 정보를 온전히 담고 있지 못합니다.

따라서 Hidden Vector를 구할 때에도 스스로 어텐션 연산을 수행하자는 겁니다.

즉,  Self Attention을 적용한 h2의 Hidden Vector는

h2 = <h2, h1> h1 + <h2, h2> h2 + <h2, h3> h3 가 됩니다.

 

그래서 각 Hidden State에 정보를 담을 때에도 내적을 통한 가중합으로 문맥을 고려할 수 있도록 하자는 아이디어가 Self Attention 입니다.

 

2) Encoder

Transformer(left) / Encoder(right)

 

Transformer의 Encoder 구조를 보면 Input Embedding 이후 Positional Encoding 개념이 등장합니다.

 

Positional Encoding이란?

말 그대로 위치 정보를 알려주는 작업을 말하는데, Self-Attention을 통해 맥락 정보는 알았지만 그 단어가 어디에 위치해 있는지에 관한 정보는 내적을 통해 알아낼 수 없기 때문에 이 작업이 필요합니다.

 

Positional Encoding

 

단어의 순서에 따라 고유한 벡터를 더해주는 방식으로 Positional Encoding을 적용합니다.

각 순서의 고유 벡터는 시퀀스의 길이나 Input 에 상관없이 항상 동일한 벡터값이어야 하고, 값이 너무 크면 안되며(단어보다 위치 정보가 커지는 상황 발생) 스칼라 값이 아닌 Embedding Vector와 같은 차원의 벡터여야 합니다.

 

Multi-Head Attention?

 

Multi-Head Attention

좌측은 Scaled Dot Product Attention 이고, 우측은 Multi--Head Attention 입니다.

 

- Query(쿼리) = 질문 (유사도를 구하고자 하는 주체)

- Key(키) = 질문의 대상 (쿼리와 곱해질 예정)

- Value(밸류) = 질문의 대상 (기본적으로는 키와 동일한데 키는 쿼리와 곱해지고 밸류는 구해진 가중치가 곱해짐 - Weighted Sum의 대상)

 

각각 단어 토큰이라고 생각하면 이해가 쉬울듯 합니다.

 

순서대로 보면, Query Matrix와 Key Matrix (Transpose)가 곱해진 후 정규화, 필요하다면 Masking하고 Softmax 함수를 취하고 Value Matrix에 가중합되면서 Attention 연산이 마무리됩니다.

 

그리고 이 연산이 Head의 개수만큼 연산되어 나중에 Concat되는 것이 Multi-Head Attention입니다.

 

여기서 Head의 수는 사용자가 임의로 설정할 수 있으며 Task나 데이터 요구 사항 등에 맞춰서 조정됩니다.

 

Addition and Normalization

Multi-Head Attention 연산 이후에 Add + Norm Layer 가 등장합니다.

이 단계에서는 Addition (잔차 연결) + Normalization(정규화) 작업이 수행됩니다.

 

- Addition : 각 서브 레이어의 출력에 입력을 더함으로써 입력 정보가 네트워크 깊게 도달되도록 합니다.

→ 즉, 입력 벡터 x와 어텐션의 출력 벡터 F(x)가 더해져 최종적으로 x + F(x) 를 다음 레이어에 전달

→ 덧셈을 굳이 사용한 이유는 계산적으로 간단하고 효율적이기 때문

 

- Normalization : 더해진 결과에 층 정규화를 적용합니다. (평균, 분산 계산해 정규화)

→ 안정적인 학습 + 과적합 방지를 위해 사용

 

이후 FC Layer와 Add + Norm Layer를 한번씩 더 거치면서 인코더 연산이 종료됩니다.

 

3) Decoder

Transformer(left) / Decoder(right)

Masked Multi-Head Attention

Decoder 파트에서는 인코더와 동일하게 Embedding 후 Positional Encoding으로 시작합니다.

그 후 Masked Multi-Head Attention이라는 새로운 개념이 등장하는데

 

이는 Decoder에 입력되는 Target 문장 혹은 단어들도 각각의 맥락 정보가 필요하기에 Self Attention 연산을 수행합니다.

그래서 만약 Decoder에 S1, S2, S3, S4, S5가 입력되었다면

S4 = <S4, S1> S1 + <S4, S2> S2 + <S4, S3> S3 + <S4, S4> S4 + <S4, S5> S5 가 되겠죠?

 

하지만 Decoder에서는 다음 단어를 예측해서 생성해야 하기 때문에 S4 입장에서는 S5의 정보를 몰라야 합니다.

 

다음 단어를 예측하는데 정답을 알려줘버리면 S1 ~ S4까지의 내적을 할 이유가 없기 때문이죠.

그래서 위 식을 다시 쓰자면

S4 = <S4, S1> S1 + <S4, S2> S2 + <S4, S3> S3 + <S4, S4> S4 + <S4, S5> S5 가 됩니다.

 

Multi-head Attention

그 다음에 Multi-head Attention이 한 번 더 등장하는데, 여기서는 Encoder의 정보를 참고합니다.

위에서 설명한 Query, Key, Value가 여기서는 아래와 같이 설정되겠죠.

 

- Query = 물어보는 주체(t 시점의 디코더 단어)

- Key = 질문의 대상 (Encoder 각 단어들)

- Value = 질문의 대상 (Encoder 각 단어들) 

 

따라서, 디코더의 각 단어마다 인코더 단어들과 Attention 연산을 수행하고 FC Layer를 거쳐 정규화 작업이 일어난 후 선형변환을 통해 출력되는 구조로 이루어져 있습니다.

 

4) Model Architecture

Transformer의 Encoder

모델 구조를 정리하자면

  • 전체적인 모델 구조
    • 인코더 - 디코더 구조로 되어 있고 본 논문에서는 각각 6개의 층으로 구성해 사용했다고 함
  • 인코더 구조
    • Multi-Head Self-Attention : 입력 데이터 내에서 각 요소의 맥락 정보 파악
    • Positional Encoding : 각 위치에 독립적인 위치정보 벡터 추가
    • Add & Norm : 잔차 학습 + 정규화
  • 디코더 구조
    • Masked Multi-Head Self-Attention : 출력 시퀀스 생성을 위해 이전 출력 등 맥락 정보 파악 + 다음 정보 누설을 방지하기 위해 Masking 사용
    • Multi-Head Attention over the encoders's output : 인코더 출력에 대해 어텐션 연산
    • Positional Encoding : 각 위치에 독립적인 위치정보 벡터 추가
    • Add & Norm : 잔차 학습 + 정규화

 


[3] Why Self - Attention?

연산량 및 계산량 비교

다음 섹션에서는 Self-Attention과 RNN 기반 모델, CNN 기반 모델, 제한된 Self-Attention 모델과 연산량, 병렬 처리 가능 여부, 각 단어 요소 간 최대 경로 길이에 대해 비교합니다.

 

RNN 계열 모델들은 각 시점에서 이전 시점의 상태를 기억하면서 순차적으로 입력을 처리하기 때문에 이전 시점의 계산이 완료되기 전에는 다음 시점의 계산을 시작할 수 없다는 문제점이 존재합니다.

이 때문에 병렬처리에 어려움이 생기고, 긴 시퀀스가 들어온다면 더더욱 시간은 오래걸리는데 성능은 저하되는 현상이 나타납니다.

 

반면 Self-Attention은 한 단어가 다른 단어와 Attention 연산을 통해 점수를 계산하는데 이 때 각 계산은 독립적으로 수행되고 그렇기 때문에 병렬 처리가 가능합니다.

따라서 GPU만 있다면 학습 시간을 최대한 줄일 수 있게 되는 것이고, 각 단어끼리의 최대 길이 또한 내적을 수행하기 때문에 매우 짧아집니다.

 

그리고 위 표에서 서술한 Self-Attention (restricted) 는 r이라는 제한된 영역을 설정해서 그 부분만 가지고 어텐션 연산을 수행하는 겁니다.

n보다 작은 최적의 r을 설정한다면 계산 복잡도를 줄여주고, 처리속도를 빠르게 할 수 있다는 게 장점이지만, 최적의 r을 찾는 작업이 필요하고 정보의 범위가 제한되기에 성능이 다소 낮아질 위험성이 존재하다는 단점이 있습니다.

 


[4] Training & Experiments

1) Training Strategy

  • Data and Batch
    • 학습 데이터는 WMT 2014 영어-독일어, 영어-프랑스어 데이터를 사용함
    • 문장 쌍은 시퀀스 길이에 따라 비슷한 길이의 문장을 같은 배치에 두어 계산 효율성을 올리는 전략 활용
  • Hardware
    • NVIDIA P100 GPU 8개로 실험
    • 기본 모델의 경우 한 step 당 0.4초 소요, 약 12시간 동안 훈련
    • 큰 모델의 경우 한 step 당 1초 소요, 약 3.5일 동안 훈련
  • Optimizer
    • Adam Optimizer 사용
    • 4000 step 동안 학습률을 선형적으로 증가시키고 점차 줄여나가는 방식으로 학습률 조정
  • Regularzation
    • Multi-head Attention의 출력에 0.1의 Dropout 적용
    • 훈련 중에 0.1의 Label Smoothing 사용 (실제 정답을 0.9, 나머지를 0.1로 설정)

 

2) Machine Translation

BLUE Benchmark

  • Transformer 는 영어-독일어, 영어-프랑스어 등 WMT 2014 번역 Task에서 기존 모델에 비해 점수를 크게 앞서며, 훨씬 낮은 훈련 비용으로 새로운 최고 BLEU Score를 기록함
  • 큰 모델은 훈련 비용이 기존 최고 모델의 1/4 미만이면서 높은 성능을 보였으며, 기본 모델도 모든 이전 모델을 초과하는 성능

 

3) Model Variations

Model Variation

  • Transformer의 다양한 구성 요소의 중요성을 평가하기 위해 newstest 2013 영어-독일어 번역 성능 변화를 측정
  • (A) : 멀티헤드 어텐션의 헤드 수와 key, value 등의 차원 크기를 변화시켰고 head가 16, 차원이 32일 때 가장 성능이 좋았음
  • (B) : key, value의 차원 크기를 줄이면 품질이 저하됨을 측정함
  • (C), (D) : 모델 크기를 키울수록 높은 성능이 나왔고 과적합 방지에 드랍아웃이 매우 효과적임을 관찰함
  • (E) : Sin 함수 위치 인코딩을 학습된 위치 임베딩으로 대체했지만 비슷한 결과를 얻음

 


[5] Conclusions

  • 아무리 좋은 아이디어라도 시간에 제약을 받는 RNN 기반 모델은 장기 의존성 문제가 있었음
    • 이를 Self-Attention과 Positional Encoding으로 완전히 해결하였고 이를 활용한 새로운 모델 Transformer 제시
  • 모델은 기본적으로 Encoder, Decoder 구조로 되어 있으며 그 안에 Multi-Head Attention을 활용함
    • Encoder : Multi-Head Attention, Positional Encoding, Add & Norm Layer
    • Decoder : Masked Multi-Head Attention, Multi-Head Attention(Encoder와), Positional Encoding, Add & Norm Layer
    • 인코더, 디코더는 각각 6개씩 쌓아서 구성하고 인코더의 마지막 출력은 디코더의 모든 층으로 전달됨
  • WMT 2014 영어-독일어, 영어-프랑스어 번역 Task에서 훨씬 적은 계산량으로 SOTA 성능 달성함

 


[6] References

https://www.youtube.com/watch?v=8E6-emm_QVg&t=1091s

https://github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/tree/master

https://www.youtube.com/watch?v=6s69XY025MU&t=1062s

https://pub.towardsai.net/transformer-architecture-part-1-d157b54315e6

 

 

[논문리뷰] BERT 논문 리뷰

자, 오늘은 X:AI Seminar 2024에서 진행한 BERT 논문 리뷰를 가져왔습니다.해당 논문은 2019년에 발표되어 ELMO, GPT-1의 모델과 비교를 하면서 얘기를 시사하고 있습니다. 논문 : BERT, Pre-training of Deep Bidire

dangingsu.tistory.com

 

728x90
반응형