(07-08강) Transformer

Transformer(Self-Attention)에 대해 알아본다.

1. Transformer

1.1. 소개

  • Attention is all you need, NeurIPS'17

    입출력 처리에 사용되었던 RNN 모델 대신 Attention만을 사용하여 처리하게 되었다.

  • 순차적인 데이터가 항상 순서를 맞춰서 발생하지 않는 이슈를 해결하기 위한 방법론이다.

1.2. Basic Structure

  • 위의 기존 Seq2Seq와 달리 여러개의 Encoder와 Decoder를 층으로 쌓게 된다.

  • Input과 Output의 갯수와 도메인이 동일하지 않다.

  • Encoder는 N개의 단어에 대해 한번에 처리할 수 있는 구조로 되어있다.

1.2.1. 주요 하이퍼파라미터

  • dmodeld_{model} = 512

    트랜스포머의 인코더와 디코더에서의 정해진 입력과 출력의 크기

  • num_layers = 6

    트랜스포머에서 하나의 인코더와 디코더를 층으로 생각하였을 때, 트랜스포머 모델에서 인코더와 디코더가 총 몇 층으로 구성되었는지를 의미한다. (논문에서는 각 6개 층으로 구성하였다.)

  • num_heads = 8

    트랜스포머에서는 어텐션을 사용할 떄, 1번 하는 것보다 여러개로 분할해서 병렬로 어텐션을 수행하고 결과값을 다시 하나로 합친다.

  • dffd_{ff} = 2048

    트랜스포머 내부에는 피드 포워드 신경망이 존재합니다. 이때 은닉층의 크기를 의미합니다. 피드 포워드 신경망의 입력층과 출력층의 크기는 dmodeld_{model}입니다.

1.2.2. Encoder 구조

하나의 Encoder는 Self-Attention과 FFNN(Feed Forward Neural Network)으로 구성되어 있다.

  1. Input 문장에 대해 Embedding 백터를 구한다.

  2. Positional Encoding 과정을 거친다.

  3. Multi-Head Attention (Self Attention의 병렬처리)

  4. Add & Norm (Residual connection and Layer Normalization, 잔차연결과 층 정규화)

  5. Position-wise FFNN

  6. 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이라고 한다.

PE(pos,2i)=sin(pos/100002i/dmodel)PE_{(pos, 2i)} = sin(pos/10000^{2i/d_{model}})

PE(pos,2i+1)=cos(pos/100002i/dmodel)PE_{(pos, 2i+1)} = cos(pos/10000^{2i/d_{model}})

1.2.2.3. Self Attention and Multi-head Attention

Attention : 전체 입력 문장을 동일 비율이 아닌 가중치를 줌으로서 연관이 있는 입력 단어부분을 더 집중(Attention) 한다.

  • Attention(Q,K,V)=AttentionValueAttention(Q, K, V) = Attention Value

    • Q(Query) : decoder의 t시점에서의 hidden state(sts_t)

    • K(Key) : encoder의 모든 hidden state(hh)

    • V(Value) : encoder의 attention value 를 도출하기 전의 hidden state

  • 어텐션 함수는 주어진 쿼리(Q) 에 대해서 모든 키(K) 와의 유사도를 각각 구합니다.

  • 구해낸 유사도를 키와 매핑되어있는 각각의 값(V) 에 반영해줍니다.

  • 유사도가 반영된 값(V)를 모두 더해서 리턴하며 이를 'Attention Value' 라고 한다.

✔ Self Attention

  • 각 단어마다 Self Attention 구조는 3가지 Vector를 만든다 (Q, K, V)

  • Score = qtkTq_t \cdot k^T 스칼라 값 (Attention Function을 사용한 값, dot product가 아닐 수 있음)

    => 두 Vector의 내적을 통해 i번째 단어가 나머지 단어와 얼마나 유사도를 가지는지 구한다.

  • Score Vector를 Normalize 해준다 (divide by 8, dkey\sqrt{d_{key}})

  • softmax를 통해 확률로 나타내어 그 확률이 각각 얼마나 영향을 가지는지 볼 수 있도록 한다.

  • 각 단어에서 나오는 V(value) Vector와의 weighted sum(가중합)으로 encoding vector z를 구한다.

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V

❓왜 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가 주어지더라도 다른 기준으로 여러 지표를 뽑아와야할 필요가 있을 수 있다. 예를 들어 "나는 학교에서 공부를 했다." "나는 집에 와서 휴식을 취했다." 라는 문장이 있을 때 "나"에 대해 위치정보(학교, 집)의 정보가 중점이 될 수 있고, 행동("공부", "휴식")의 정보가 중점이 될 수 있다.

  • 생성된 8개의 head-attention을 concat하여 합치고 이를 원하는 출력의 차원으로 선형변환하는 WOW^O를 행렬곱을 하여 Z를 구해낸다.

1.2.2.4. 성능적인 측면

Maximum path lengths, per-layer complexity and minimum number of sequential operations for different layer types

  • nn is the sequence length

  • dd is the dimension of representation (Query와 Key의 dim)

  • kk is the kernel size of convolution

  • rr is the size of the neighborhood in restricted self-attention

  • Self Attention

    • Complexity per Layer의 핵심 연산인 softmax(QKTdk)Vsoftmax(\frac{QK^T}{\sqrt{d_k}})V 에서 QKTQK^T의 연산의 크기로 보면 된다. (nxd) x (dxn) 으로 n2dn^2\cdot d 번의 연산이 발생함을 알 수 있다. 이 부분에서 메모리에서 저장해야할 크기가 매우 크다는 것을 알 수 있다.

    • Sequential Operations : PC의 성능이 좋다(GPU Core 수)는 가정하에 행렬곱 연산은 1의 시간복잡도를 가진다.

  • RNN

    • Self Attention에 비해 메모리 사용량이 적다. Whh×ht1=>(d×d)×(d×1)W_{hh} \times h_{t-1} => (d\times d) \times (d \times 1) 즉, d개 만큼의 곱이 d개 만큼 있는 d2d^2개를 가지게 되고 이런 연산이 문장의 길이 n번 발생하여 nd2n \cdot d^2 의 시간복잡도를 가지게 된다.

    • 순차적으로 진행하기 때문에 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의 안정화가 주된 목표이다.

LN=LayerNorm(x+Sublayer(x))LN = LayerNorm(x + Sublayer(x))

텐서의 마지막 차원(dmodeld_{model})에 대해서 평균과 분산을 구하고, 정한 정규화 함수를 통해 정규화를 진행하여 학습을 돕게 된다.

정규화를 수행한 후 벡터 xix_ilniln_i라는 벡터로 정규화 된다. lni=LayerNorm(xi)ln_i = LayerNorm(x_i)

❗ 정규화 공식

  1. 평균 분산 정규화

    x^i,k=xi,kμiσi2+ϵ\hat{x}_{i,k} = \frac{x_{i,k}-\mu_i}{\sqrt{\sigma_i^2}+\epsilon} , (kk = 벡터 xix_i의 각 차원)

  2. 감마 벡터 정규화 lni=γx^i+β=LayerNorm(xi)ln_i = \gamma \hat{x}_i + \beta = LayerNorm(x_i) , (γ\gamma의 초기값은 1, β\beta의 초기값은 0)

1.2.2.6. Position-wise FFNN

단순히 선형 변환 해주는 것이라고 생각해도 된다.

FFNN(x)=MAX(0,xW1+b1)W2+b2FFNN(x) = MAX(0, xW_1+b_1)W_2 + b_2

  • 매개변수 W1,W2,b1,b2W_1, W_2, b_1, b_2는 하나의 인코더 층내에서 모두 동일하게 사용된다. (인코더 층마다는 다른 값을 가짐)

  • xx : Multi-head Attention에서 나온 (seq_len, dmodeld_{model})의 크기를 가지는 행렬

  • W1 W_1 : (dmodel, dff d{model}, \ d_{ff} )의 크기

  • W2W_2: (dff, dmodel d_{ff}, \ d_{model} )의 크기

  • 다음 인코더의 입력값으로 사용되기 때문에 출력값을 입력값과 같은 크기로 맞춰주어야한다.

1.2.3. Decoder의 구조

  1. Input 문장에 대해 Embedding 백터를 구한다.

  2. Positional Encoding 과정을 거친다.

  3. 🔅Masked Multi-head Self Attention

  4. Add & Norm (Residual connection and Layer Normalization, 잔차연결과 층 정규화)

  5. Position-wise FFNN

  6. 🔅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 과정

1.2.3. 기타

1.2.3.1. Warm-up Learning rate Schedular

1.3. 정리

Reference

Last updated