HOME
home
About
home
📜

트랜스포머 INTRO

학습 목표
그루 정리 자료

❑ Transformer : Attention is All You Need - Paper

attention is all you need.pdf
2150.1KB

트랜스포머(Transformer)란?

트랜스포머(Transformer)는 기계 번역을 위한 새로운 모델로 이전에 등장했던 Attention 메커니즘을 극대화하여 뛰어난 번역 성능을 기록
최근 자연어처리 모델 SOTA(State-of-the-Art)의 기본 아이디어는 거의 모두 트랜스포머를 기반
모델을 소개한 논문 Attention is All You Need 는 3년 사이에 18000번 이상 인용
트랜스포머가 자연어처리가 아닌 다른 문제도 잘 풀고있기 때문에 최근에는 컴퓨터 비전 쪽에서도 적용하려는 시도가 있으며, 멀티모달(Multi-Modal) 모델에도 적용
RNN 기반 모델이 가진 구조적 단점은 단어가 순서대로 들어온다는 점입니다.그렇기 때문에 처리해야 하는 시퀀스가 길수록 연산 시간이 길어집니다.트랜스포머는 이런 문제를 해결하기 위해 등장한 모델입니다.모든 토큰을 동시에 입력받아 병렬 연산하기 때문에 GPU 연산에 최적화
Encoder, Decoder로 표현된 사각형을 각각 인코더 블록과 디코더 블록이라고 합니다. 트랜스포머는 인코더 블록과 디코더 블록이 6개씩 모여있는 구조
트랜스포머의 구조를 단순하게 시각화한 그림
그림 하나를 더 보도록 하겠습니다. 아래는 논문에서 트랜스포머의 구조를 나타낸 그림입니다.그림을 보면 커다란 회색 블록이 2개 있습니다. 왼쪽은 인코더 블록 하나를 나타내고 오른쪽은 디코더 블록 하나를 나타냅니다.
인코더 블록 : 2개의 sub-layer
Multi-Head (Self) Attention
 Feed Forward
디코더 블록 : 3개의 sub-layer
Masked Multi-Head (Self) Attention
Multi-Head (Encoder-Decoder) Attention
 Feed Forward
❗️ Transformer 의 구조 기억하도록 노력!

Positional Encoding

트랜스포머에서는 병렬화를 위해 모든 단어 벡터를 동시에 입력받습니다.컴퓨터는 어떤 단어가 어디에 위치하는지 알 수 없게 됩니다.그래서 컴퓨터가 이해할 수 있도록 단어의 위치 정보를 제공하기 위한 벡터를 따로 제공해주어야 합니다.단어의 상대적인 위치 정보를 제공하기 위한 벡터를 만드는 과정을 Positional Encoding 이라고 합니다.
Positional Encoding 은 아래와 같은 수식으로 이루어집니다.
❗️ 수식이 복잡하니 수학적으로 이해하려고 하지 않으셔도 됩니다 . 수식보다는 Positional Encoding이 왜 필요한지를 기억하는 것이 더 중요
아래는 Positional Encoding을 통해 만들어진 벡터를 시각화한 자료입니다. 일정한 패턴이 있는 벡터가 만들어지는 것을 볼 수 있습니다. 컴퓨터는 이를 통해 단어의 상대적인 위치를 파악하게 됩니다.
각 행은 하나의 벡터에 대한 positional encoding에 해당합니다. 그러므로 첫 번째 행은 우리가 입력 문장의 첫 번째 단어의 embedding 벡터에 더할 positional encoding 벡터입니다. 각 행은 사이즈 512인 즉 512개의 셀을 가진 벡터이며 각 셀의 값은 1과 -1 사이를 가집니다. 다음 그림에서는 이 셀들의 값들에 대해 색깔을 다르게 나타내어 positional encoding 벡터들이 가지는 패턴을 볼 수 있도록 시각화
Code

Self-Attention (셀프-어텐션)

트랜스포머의 주요 메커니즘인 Self-Attention 에 대해 알아보도록 하겠습니다.
아래와 같은 문장이 있다고 해보겠습니다.
The animal didn't cross the street because it was too tired
위 문장을 제대로 번역하려면 "it" 과 같은 지시대명사가 어떤 대상을 가리키는지 알아야 합니다.그렇기 때문에 트랜스포머에서는 번역하려는 문장 내부 요소의 관계를 잘 파악하기 위해서, 문장 자신에 대해 어텐션 메커니즘을 적용합니다.이를 Self-Attention 이라고 합니다.
아래는 "it" 이 어떤 단어와 가장 연관되어 있는 지를 시각화한 그림
Self-Attention은 어떤 과정이길래 단어 사이의 관계를 알아낼 수 있을까요?
Self-Attention에서도 쿼리(Query)-키(Key)-밸류(Value)의 아이디어가 동일하게 등장
검색 시스템에서 흘러나온 쿼리, 키, 밸류
Attention을 다룰 때 등장했던 검색 시스템의 아이디어를 다시 복습
아래는 구글에서 "what is attention in nlp" 라는 검색어를 구글에 입력했을 때의 검색 결과를 나타낸 이미지
검색 시스템은 아래와 같은 3단계
1.
찾고자 하는 정보에 대한 검색어(Query)를 입력
2.
검색 엔진은 검색어와 가장 비슷한 키워드(Key) 검색
3.
그리고 해당 키워드(Key)와 연결된 페이지(Value)출력
기존 Attention과의 차이는 각 벡터가 모두 가중치 벡터라는 점입니다.
각각의 벡터가 어떤 역할을 하는지 알아보겠습니다.
쿼리(q)는 분석하고자 하는 단어에 대한 가중치 벡터
키(k)는 각 단어가 쿼리에 해당하는 단어와 얼마나 연관있는 지를 비교하기 위한 가중치 벡터
밸류(v)각 단어의 의미를 살려주기 위한 가중치 벡터
Self-Attention은 세 가지 가중치 벡터를 대상으로 어텐션을 적용합니다. 적용하는 방식은 기존 Attention 메커니즘과 거의 동일합니다.
1.
먼저, 특정 단어의 쿼리(q) 벡터와 모든 단어의 키(k) 벡터를 내적합니다. 내적을 통해 나오는 값이 Attention 스코어(Score)가 됩니다.
2.
트랜스포머에서는 이 가중치를 q,k,vq,k,v 벡터 차원 dk \sqrt{d_k} 의 제곱근인 dk \sqrt{d_k} 로 나누어줍니다.계산값을 안정적으로 만들어주기 위한 계산 보정으로 생각해주시면 됩니다.
3.
다음으로 Softmax를 취해줍니다.이를 통해 쿼리에 해당하는 단어와 문장 내 다른 단어가 가지는 관계의 비율을 구할 수 있습니다.
4.
마지막으로 밸류(v) 각 단어의 벡터를 곱해준 후 모두 더하면 Self-Attention 과정이 마무리됩니다.
Self-Attention 의 과정을 그림으로
1. 가중치 행렬 WQ,WK,WVW_Q,W_K,W_V 로부터 각 단어의 쿼리, 키, 밸류(q, k, v) 벡터생성
2. 분석하고자 하는 단어의 쿼리 벡터(q)와 문장 내 모든 단어(자신 포함)의 키 벡터(k)를 내적하여 각 단어와 얼마나 관련 정도를 구합니다.
(아래 그림에서는 dk \sqrt{d_k}로 나누어 준 뒤에 Softmax를 취해주는 과정은 생략)
3. Softmax의 출력값과밸류 벡터(v)를 곱해준 뒤 더하면 해당 단어에 대한 Self-Attention 출력값을 얻을 수 있습니다.
4. 하나의 벡터에 대해서만 살펴보았지만 실제 Attention 계산은 행렬 단위로 병렬 계산됩니다.
실제로 각 벡터는 행렬(Q, K, V)로 한꺼번에 계산됩니다. WQ,WK,WVW_Q,W_K,W_V 는 학습 과정에서 갱신되는 파라미터로 이루어진 행렬입니다. 세 행렬과 단어 행렬을 내적하여 쿼리, 키, 밸류 행렬(Q, K, V)를 생성
위에서 살펴본 바와 같이
1.
먼저 쿼리 행렬(Q)과 키 행렬(K)을 내적합니다.
2.
결과로 나오는 행렬의 요소를 dk\sqrt{d_k} 로 나누어 줍니다.
3.
행렬의 각 요소에 소프트맥스(Softmax)를 취해줍니다.
4.
마지막으로 밸류 행렬(V)과 내적하면 최종 결과 행렬(Z)이 반환됩니다
아래는 Tensorflow 에서 Self-Attention을 구현한 코드입니다. 코드를 통해 Attention이 계산되는 과정을 다시 살펴보도록 합시다.
❗️ 모든 코드를 바로 작성할 수 없어도 좋습니다. 당장은 코드와 주석을 따라가보면서 Attention 가중치를 구하는 과정에 대해 이해해봅시다. 추가적으로 아래에 등장하는 코드는 Tensorflow 공식 코드이므로 추후 아래의 코딩 스타일을 참고Code

Multi-Head Attention

Multi-Head Attention 이란 Self-Attention을 동시에 병렬적으로 실행하는 것입니다. 각 Head 마다 다른 Attention 결과를 내어주기 때문에 앙상블과 유사한 효과를 얻을 수 있습니다. 논문에서는 8개의 Head를 사용하였습니다. 8번의 Self-Attention을 실행하여 각각의 출력 행렬 Z0,Z1,,Z7Z_0,Z_1,⋯,Z_7 을 만들어냅니다.
출력된 행렬 Zn(n=0,⋯,7) 은 이어붙여집니다(Concatenate). 다른 파라미터 행렬인 WoW_o 와의 내적을 통해 Multi-Head Attention의 최종 결과인 행렬 ZZ생성 여기서 행렬 WoW_o의 요소 역시 학습을 통해 갱신됩니다. 최종적으로 생성된 행렬 Z는 토큰 벡터로 이루어진 행렬 X와 동일한 크기(Shape)가 됩니다.
멀티헤드어텐션 설명

Layer Normalization & Skip Connection

트랜스포머의 모든 sub-layer에서 출력된 벡터는 Layer normalization과 Skip connection을 거치게 됩니다.Layer normalization의 효과는 Batch normalization과 유사합니다. 학습이 훨씬 빠르고 잘 되도록 합니다.
Skip connection(혹은 Residual connection)은 역전파 과정에서 정보가 소실되지 않도록 합니다. 고잉디퍼의 ResNet의 주요 메커니즘이랑 매우 비슷합니다.

Feed Forward Neural Network

다음으로 FFNN(Feed forward neural network) 로 들어갑니다. 은닉층의 차원이 늘어났다가 다시 원래 차원으로 줄어드는 단순한 2층 신경망입니다.
활성화 함수(Activation function)으로 ReLU를 사용합니다.
FFNN(x)=max(0,W1x+b1)W2+b2FFNN(x)=max(0,W_1x+b_1)W_2+b_2
Code

Masked Self-Attention

Masked Self-Attention은 디코더 블록에서 사용되는 특수한 Self-Attention입니다. 디코더는 Auto-Regressive(왼쪽 단어를 보고 오른쪽 단어를 예측)하게 단어를 생성하기 때문에 타깃 단어 이후 단어를 보지 않고 단어를 예측해야 합니다. 따라서 타깃 단어 뒤에 위치한 단어는 Self-Attention에 영향을 주지 않도록 마스킹(masking)을 해주어야 합니다.

Self-Attention (without Masking) vs Masked Self-Attention

Self-Attention 메커니즘은 쿼리 행렬(Q)와 키 행렬(K)의 내적합니다.
Attention(Q,K,V)=softmax(QKTdk)V\operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V
결과로 나온 행렬을 차원의dk  \sqrt{d_{k}} 로 나누어 준 다음, Softmax를 취해주고 밸류 행렬(V)과 내적하였습니다.

Masked Self-Attention

Masked Self-Attention 에서는 Softmax를 취해주기 전, 가려주고자 하는 요소에만 −∞ 에 해당하는 매우 작은 수를 더해줍니다. 아래 코드 예시에서는 -10억(=-1e9)을 더해주었습니다. 이 과정을 마스킹(Masking)이라고 합니다. 마스킹된 값은 Softmax를 취해 주었을 때 0이 나오므로 Value 계산에 반영되지 않습니다.
위에서 등장했던 Self-Attention을 구현 코드에서 mask 와 관련된 부분만 다시 보도록 합시다.
CODE

Encoder-Decoder Attention

디코더에서 Masked Self-Attention 층을 지난 벡터는 Encoder-Decoder Attention 층으로 들어갑니다.좋은 번역을 위해서는 번역할 문장과 번역된 문장 간의 관계 역시 중요합니다. 번역할 문장과 번역되는 문장의 정보 관계를 엮어주는 부분이 바로 이 부분입니다.
이 층에서는 디코더 블록의 Masked Self-Attention으로부터 출력된 벡터를 쿼리(Q) 벡터로 사용합니다. 키(K)와 밸류(V) 벡터는 최상위(=6번째) 인코더 블록에서 사용했던 값을 그대로 가져와서 사용합니다. Encoder-Decoder Attention 층의 계산 과정은 Self-Attention 했던 것과 동일합니다.
아래는 Encoder-Decoder Attention 가 진행되는 순서를 나타낸 이미지입니다.

❑ Linear & Softmax Layer

디코더의 최상층을 통과한 벡터들은 Linear 층을 지난 후 Softmax를 통해 예측할 단어의 확률산출
Code 실습

❑ Review

Attention의 장점에 대해서 생각하고 설명해봅니다.
RNN 모델의 단점 2가지
장기 의존성(Long-term dependency)
Attention의 장점
Transformer의 장점과 구조에 대해서 생각하고 설명해봅니다.
"Attention is All You Need" (왜 논문 제목을 이렇게 지었을지에 대해서 생각해봅시다)
Positional Encoding
Self-Attention
Masked Self-Attention
Encoder-Decoder Attention

References

트랜스포머에 대해 조금 더 자세하게 알고 싶다면
Paper (Attention is All You Need)
GPT에 대해 더 자세하게 알고 싶다면
The Illustrated GPT-2 (Visualizing Transformer Language Models)
Paper (Improving Language Understanding by Generative Pre-Training)
BERT에 대해 더 자세하게 알고 싶다면
The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning)
Paper (Pre-training of Deep Bidirectional Transformers for Language Understanding)