ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [부캠] NLP 04 transformer model
    AI 부캠 2021. 2. 19. 15:33
    • Self attention model
    • Transformer model

    Self attention model

    어텐션모델은 여기서 :)

     

    self attention model

    Seq2Seq model을 생각해보자.

    여기서 attention model을 이용할 때, encoder,decoder hidden vector는 RNN계열로 구하고, decoder에서 ouput을 구할 때만 attention model을 사용했다.

     

    여기서, RNN을 이용한 부분을 싹- 빼고, only attention model만을 사용해보자.

     

    그럼 드는 생각

    "아니 그럼, hidden vector를 어떻게 구해?"

    hidden vector를 구하기 위해 self attention model에서는 모든 embedding vector(word)에 대해 3가지의 Vector를 만든다.

    • Query vector : 기본 attention model에서 decoder hidden vector의 역할을 한다. 즉 구하고자하는 output의 주체가 되는 벡터
    • Key vector : 기본 attention model에서 decoder hidden vector(여기선 query vector)와 내적을 하는 encoder hidden vector의 역할을 한다. 

    Q vector와 Key vector를 내적한 값으로 attention score를 구한다.

     

    • Value vector : 기본 attention model에서는 encoder hidden vector에 attention score를 곱해 더한 가중 평균을 output으로 냈다. 여기서는 Value vector에 attention score를 곱하고 더한 가중평균으로 output을 구한다.

    정리하면 Query vector가 decoder hidden vector의 역할을 Key vector가 attention score구할때의 encoder hidden vector, Value vector가 output구할때의 encoder hidden vector의 역할을 한다.

    이렇게 말로하면, 너무 정신이 없으니 하나씩 step으로 보자.

     

    Thinking machine이라는 단어에서 Thinking의 output vector를 구하는 상황이다.

     

    1. 모든 단어의 embedding vector를 이용해 Q,K,V vector를 구한다.

    2. Q와 K를 내적하여 softmax를 구해 attention score를 구한다.

    *여기선 thinking에 대한 output이기 때문에 Q1만 사용한다.

    *여기서 내적의 분산을 최대한 일정하게하기위해 sqrt(dk)를 나눠준다. (dk는 단어 수)

    *Q와 K의 dimension은 항상 같아야한다.

     

    3. Softmax 값을 Value vector에 곱하고 더해서 최종 output을 구한다.

     

    4. 이 방법을 machine에 대해서도 진행한다.

     

    아마 우리가 아는 attention model인데 그걸 3개의 vector로 진행하는 것을 알수 있다.

    이걸 행렬 곱으로 한번에 진행한다면, 다음과 같이 한번에 Thinking, machine 2 단어에 대해 output이 한번에 나오는 것을 알 수 있다.

     

    Transformer : Multi head Attention

    그래서, 이제 요즘 핫하디핫한 transformer 모델!🐯

     

    Multi head attention

    같은 input embedding이 여러 attention model에 들어가는 것을 multi head attention이라한다.

     

    왜 multi head attention model을 사용할까?

    엄청 긴 문장에서 1 word를 인코딩 중이라 하자. 그 때, 그 word에 영향을 줄 단어들은 엄청 많은 수 있는데, 그걸 1개의 attention model로는 해결 할 수 없어 multi head attention 을 사용한다고 한다.

     

     

    그럼 self attention model 을 multi head attention model로 확장시켜보면,

    하나의 embedding vector에 대해 여러개의 Q,V,K 벡터가 있고, 이것을 통해 여러개의 output이 생긴다. (여기선 8개)

    이 여러 output을 concatenate하고, 선형변환을 통해 차원을 축소시켜준다.

     

    Transfomer model - Encoder

     

    transfomer의 encoder 부분을 살펴보자.

    encoder는 2개의 블록으로 나뉜다. : Multi head attention / Feed forward (FC layer with ReLU)

    이 2 블록에 모두 residual connection이 존재한다.

     

     

    1) Input value가 multi head attention이 전달된다.

    2) multi head attention output과 input value가 더해지고, 이를 layer normalize한다.

    3) 해당 output이 feed forward (fc layer with ReLU)에 전달되고, residual connection으로 더해진후, layer normalize가 진행된다.

     

    Positional Encoding

    Enocder 밑 부분에 Positional Encoding이라는 부분이 보인다.

    이는 Attention model같은 경우, 데이터의 Sequential성을 잃어버린다는 한계를 해결하기 위해 Input embedding vector에 더해주는 벡터이다.

    Input embedding vector에 대해 각자 position (index)에 특정 값을 더해주는 것이다.

    예를들어, position이 0인 embedding의 경우, 다음 그래프에 따라 dim4, dim6 에는 0, dim 5, dim 7에는 1을 더해준다.

     

     

    **Normalization

    우리가 아는 normalization은 batch normalization이 있다. batch normalization과 layer normalization을 구분해보자.

    batch normalization

    같은 batch단에 있는 데이터들에 대해 각 feature의 평균과 분산을 0, 1로 만들어 주는 것

     

    Layer normalization

    각 데이터들에 대해 데이터의 평균과 분산을 0,1로 만들어주는것

     

    Transformer - Decoder

    디코더의 경우, 구조는 Encoder의 구조와 거의 비슷하다.

    단, 2번째 multi head attention에서  enocder의 output을 Key, Value vector로 사용한다.

     

    1) decoder의 input에 대해 positional encoding 을 더한 값을 multi head attention에 넣는다.

    2) 해당 output을 Query vector, Encoder의 output을 Value, Key vector 로 하는 multi head attention을 학습한다.

    3) Feed forward와 Linear를 통해 결과를 얻는다.

    여기서 decoder의 input은 무엇일까?

    첫번째는 <SOS>부터 시작해 나온 ouput 을 다시 input으로 넣는 방법이다.

    하지만, 이러면 transformer의 장점인 Sequential data의 병렬처리가 불가능하다.

    그래서 transformer에서는 teaching force처럼 output의 label을 input으로 사용한다.

    하지만, 이 경우에 미래의 단어까지 과거의 단어에 영향을 미친다.

    예를 들어 '나는 집에 간다' 이라는 output label이 있을때, '집에' 라는 단어를 input으로 넣을 때, '간다'를 통해 예측해야하는 단어까지도 사용하게된다.

    이를 막기 위해 transformer decoder는 masked self attention 기법을 사용한다.

     

    다음과 같이 '나는'을 예측할 때는  '나는' 과 그 과거의 단어 (<SOS>)만을 사용해서 학습이 되도록하는 것이다.

     

     

    transformer - final

    그럼 이제 transfomer model을 보자

    다음과 같이 Encoder는 multi head attention을 N번 반복하여 결과를 내고,

    이를 decoder에 전달한다.

    이 정보를 가지고, decoder 또한 N번의 multi head attention을 반복하여 결과를 낸다.

     

    transformer vs RNNs

    다음은 Complexity와 Sequential operation을 비교한 표이다.

    (n | sequence length, d | dimention of representation, k| kernel size, r | size of neightborhood)


    transformer model은

    RNN 계열의 long-term dependency와 CNN 계열의 Local성을 없앨(?) 수 있는 방식이라고 할 수 있다.

    하나의 feature (image patch, time step text)에 대하여 모든 다른 feature들과의 coefficient를 구하는 방식이기 때문. 

     

    물론 연산량이 많지만, matrix 크기의 문제이기에 병렬 처리가 충분히 가능해서 많은 task에서 SOTA를 달성하고 있다.

    어떻게 이런 아이디어를 냈을까..?

     

    Further question

     

     

    yonghyuc.wordpress.com/2020/03/04/batch-norm-vs-layer-norm/

     

    Batch Norm vs Layer Norm

    Multi Layer Perceptron (MLP)를 구성하다 보면 Batch normalization이나 Layer Normalization을 자주 접하게 되는데 이 각각에 대한 설명을 따로 보면 이해가 되는 듯 하다가도 둘을 같이 묶어서 생각하면 자주 헷

    yonghyuc.wordpress.com

     

    'AI 부캠' 카테고리의 다른 글

    [부캠] Graph01  (0) 2021.02.22
    [부캠]NLP 05 (NLP pre-trained model)  (0) 2021.02.21
    [부캠] NLP03  (0) 2021.02.17
    [부캠]NLP2  (0) 2021.02.16
    [부캠] NLP #1  (0) 2021.02.15
Designed by Tistory.