(07-08강) Transformer
Last updated
Last updated
Transformer(Self-Attention)에 대해 알아본다.
Attention is all you need, NeurIPS'17
입출력 처리에 사용되었던 RNN 모델 대신 Attention만을 사용하여 처리하게 되었다.
순차적인 데이터가 항상 순서를 맞춰서 발생하지 않는 이슈를 해결하기 위한 방법론이다.
위의 기존 Seq2Seq와 달리 여러개의 Encoder와 Decoder를 층으로 쌓게 된다.
Input과 Output의 갯수와 도메인이 동일하지 않다.
Encoder는 N개의 단어에 대해 한번에 처리할 수 있는 구조로 되어있다.
트랜스포머의 인코더와 디코더에서의 정해진 입력과 출력의 크기
num_layers = 6
트랜스포머에서 하나의 인코더와 디코더를 층으로 생각하였을 때, 트랜스포머 모델에서 인코더와 디코더가 총 몇 층으로 구성되었는지를 의미한다. (논문에서는 각 6개 층으로 구성하였다.)
num_heads = 8
트랜스포머에서는 어텐션을 사용할 떄, 1번 하는 것보다 여러개로 분할해서 병렬로 어텐션을 수행하고 결과값을 다시 하나로 합친다.
하나의 Encoder는 Self-Attention과 FFNN(Feed Forward Neural Network)으로 구성되어 있다.
Input 문장에 대해 Embedding 백터를 구한다.
Positional Encoding 과정을 거친다.
Multi-Head Attention (Self Attention의 병렬처리)
Add & Norm (Residual connection and Layer Normalization, 잔차연결과 층 정규화)
Position-wise FFNN
Decoder에 Key Vector, Value Vector 전달
위와 같은 순서로 Encoder의 구조를 뜯어보기로 한다.
1.2.2.1. Embedding
자연어를 기계가 이해할 수 있는 숫자형태인 Vector 형태로 변환한 값. (2강 참고)
1.2.2.2. Positional Encoding
트랜스포머는 단어 입력을 순차적으로 받는 방식이 아니어서 ABCD = ADCB 모두 같은 값이 나오게 된다. 하지만 문장에서의 단어는 위치에 따라 의미하는 바가 변하기 마련이다. Embedding된 Vector에 단어의 위치정보를 더하는 과정을 Positional Encoding이라고 한다.
1.2.2.3. Self Attention and Multi-head Attention
Attention : 전체 입력 문장을 동일 비율이 아닌 가중치를 줌으로서 연관이 있는 입력 단어부분을 더 집중(Attention) 한다.
V(Value) : encoder의 attention value 를 도출하기 전의 hidden state
어텐션 함수는 주어진 쿼리(Q) 에 대해서 모든 키(K) 와의 유사도를 각각 구합니다.
구해낸 유사도를 키와 매핑되어있는 각각의 값(V) 에 반영해줍니다.
유사도가 반영된 값(V)를 모두 더해서 리턴하며 이를 'Attention Value' 라고 한다.
✔ Self Attention
각 단어마다 Self Attention 구조는 3가지 Vector를 만든다 (Q, K, V)
=> 두 Vector의 내적을 통해 i번째 단어가 나머지 단어와 얼마나 유사도를 가지는지 구한다.
softmax를 통해 확률로 나타내어 그 확률이 각각 얼마나 영향을 가지는지 볼 수 있도록 한다.
각 단어에서 나오는 V(value) Vector와의 weighted sum(가중합)으로 encoding vector z를 구한다.
❓왜 Transformer가 추정이 잘 될까?
CNN, MLP를 할 경우 Input이 Fix되면 Output도 Fix 된다.
Transformer는 Input이 Fix되더라도 주위의 단어에 따라 Output이 달라진다.
=> Flexible 하여 더 많은걸 표현하게 된다.
❕ check
n개의 단어가 주어지면 nxn개의 Matrix가 필요하고 이를 한번에 처리할 수 있어야한다.
✔ Multi-headed Attention (MHA) 위 single-attention의 과정을 n번 진행하는 것이다. 하나의 encoding된 vector에 대해 n개의 query, key, value vector를 만드는 것. 이 논문에서는 8개의 attention head를 가진다.
동일한 seq가 주어지더라도 다른 기준으로 여러 지표를 뽑아와야할 필요가 있을 수 있다. 예를 들어 "나는 학교에서 공부를 했다." "나는 집에 와서 휴식을 취했다." 라는 문장이 있을 때 "나"에 대해 위치정보(학교, 집)의 정보가 중점이 될 수 있고, 행동("공부", "휴식")의 정보가 중점이 될 수 있다.
1.2.2.4. 성능적인 측면
Maximum path lengths, per-layer complexity and minimum number of sequential operations for different layer types
Self Attention
Sequential Operations : PC의 성능이 좋다(GPU Core 수)는 가정하에 행렬곱 연산은 1의 시간복잡도를 가진다.
RNN
순차적으로 진행하기 때문에 Sequential Operation이 n의 시간복잡도를 가지게 된다.
1.2.2.5. Add & Norm (Residual connection and Layer Normalization)
✔ Add(Residual connection)
서브 층의 입력과 출력을 더하는 것으로 위와 같이 볼 수 있다. 우리가 하고 있는 Encoder에서 보게 되면 (multi-head attenion의 input + multi-head attenion의 output) 이 되는 것이다.
❗ Residual Connection은 ResNet 모델에서 사용된 아이디어이다. 이는 기존에 학습한 정보를 보존하고, 거기에 새로운 정보를 학습하도록 하는 것, Gradient Vanishing 문제를 해소한다. (매회 학습해야하는 양을 축소할 수 있다.)
✔ Norm (Layer Normalization, 층정규화) 정규화는 gradient의 안정화가 주된 목표이다.
❗ 정규화 공식
평균 분산 정규화
1.2.2.6. Position-wise FFNN
단순히 선형 변환 해주는 것이라고 생각해도 된다.
다음 인코더의 입력값으로 사용되기 때문에 출력값을 입력값과 같은 크기로 맞춰주어야한다.
Input 문장에 대해 Embedding 백터를 구한다.
Positional Encoding 과정을 거친다.
🔅Masked Multi-head Self Attention
Add & Norm (Residual connection and Layer Normalization, 잔차연결과 층 정규화)
Position-wise FFNN
🔅Encoder에서 Decoder로 넘어가는 변수는 가장 상위 Layer의 Key와 Value 값이다.(Encoder-Decoder Attention)
Decoder의 Query와 Encoder에서 넘어온 K, V값으로 Attention을 진행한다.
1.2.3.1 Masked Multi-head Self Attention
Encoder에서의 Self Attention과 동일하다. 하지만 Decoder에서는 앞으로 나올 단어를 자기학습하는 것은 치팅이 된다. 그러므로 과거에 나온 단어들에 대해서만 자기학습을 진행하게 된다.
1.2.3.2. Encoder-Decoder Attention
Encoder의 최상위 Layer로 부터 넘어온 K(Key), V(Value) 값과 Decoder에서의 Q(Query)를 활용한 Attention 과정
= 512
= 2048
트랜스포머 내부에는 피드 포워드 신경망이 존재합니다. 이때 은닉층의 크기를 의미합니다. 피드 포워드 신경망의 입력층과 출력층의 크기는 입니다.
Q(Query) : decoder의 t시점에서의 hidden state()
K(Key) : encoder의 모든 hidden state()
Score = 스칼라 값 (Attention Function을 사용한 값, dot product가 아닐 수 있음)
Score Vector를 Normalize 해준다 (divide by 8, )
생성된 8개의 head-attention을 concat하여 합치고 이를 원하는 출력의 차원으로 선형변환하는 를 행렬곱을 하여 Z를 구해낸다.
is the sequence length
is the dimension of representation (Query와 Key의 dim)
is the kernel size of convolution
is the size of the neighborhood in restricted self-attention
Complexity per Layer의 핵심 연산인 에서 의 연산의 크기로 보면 된다. (nxd) x (dxn) 으로 번의 연산이 발생함을 알 수 있다. 이 부분에서 메모리에서 저장해야할 크기가 매우 크다는 것을 알 수 있다.
Self Attention에 비해 메모리 사용량이 적다. 즉, d개 만큼의 곱이 d개 만큼 있는 개를 가지게 되고 이런 연산이 문장의 길이 n번 발생하여 의 시간복잡도를 가지게 된다.
텐서의 마지막 차원()에 대해서 평균과 분산을 구하고, 정한 정규화 함수를 통해 정규화를 진행하여 학습을 돕게 된다.
정규화를 수행한 후 벡터 는 라는 벡터로 정규화 된다.
, ( = 벡터 의 각 차원)
감마 벡터 정규화 , (의 초기값은 1, 의 초기값은 0)
매개변수 는 하나의 인코더 층내에서 모두 동일하게 사용된다. (인코더 층마다는 다른 값을 가짐)
: Multi-head Attention에서 나온 (seq_len, )의 크기를 가지는 행렬
: ()의 크기
: ()의 크기