ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Transformer Model 개념 및 모델 구조
    Data Science/ML&DL 모델 2022. 10. 28. 00:20
    반응형

    1. 개요

    1.1 기존 Sequence to Sequence Model의 한계

    context vector에 입력 문장의 정보를 압축하여 병목현상 발생 및 성능하락이 야기됨.

    (하나의 context vector가 입력 문장의 모든 정보를 가지고 있어야함.)

    (Context Vector는 고정된 길이의 벡터)

    Decoder에서 매번 히든스테이트를 갱신해야함.

    sos : start of sentence

    eos : end of sentence

    1.2 Attenstion 개념이 추가된 Sequence to Sequence Model

    RNN에서 매 입력에따라 나오는 히든스테이트 전체를 예측의 입력으로 넣어주기위한 Attention Vector 등장.

    (아직 Transformer가 아닙니다.)

    Attention Vector를 시각화하면 아래와 같은 그림을 얻을수 있다.

    인코더와 디코더에 각각 사용된 언어에 대해서 어떠한 단어끼리 높은 연관성을 가지고 있는지 직관적으로 확인 가능하다.

    1.3 Transformer의 등장

    Transformer는 RNN을 사용하지 않고 attention 기법을 여러 레이어에서 반복 활용하는 모델이다.

    RNN을 사용하지 않기때문에 문장내의 순서정보를 알려주기 위해서 Positional Encoding을 사용한다.

     

    2. Transformer의 구성

    Transformer는 Encoder와 Decoder로 구성되어 있다.

    Encoder Layer는 아래의 빨간 박스와 같이 구성되어 있으며,

    Decoder Layer는 아래의 파란 박스와 같이 구성되어 있다.

    입력 문장은 Embedding 및 Positional Encoding 되어서 Encoder Layer에 입력된다.

    이때 Encoder Layer는 사용자가 임의로 n개를 쌓아 구성하며, n 번째의 Encoder Layer의 출력값은 모든 Decoder Layer에 입력된다.

    https://wikidocs.net/images/page/162096/3_encoder_decoder_class.png

    2.1 Embedding(임베딩)

    2.1.1 Embedding

    Embedding은 사용자가 지정한 embedding demesion(통상적으로 512)에 주어진 단어를 매칭시킨다.

    "I am a boy"의 경우 (4*{embedding demesion})차원의 행렬이 생성됨.

    따라서 embedding demesion이 4일 경우 "I am a boy"는 아래와 같이 표현될수 있음.

     $$I \ am \ a \ boy = \begin{bmatrix}
    1.3 & 0.9 & 1.1 & 0.3 \\
    0.5 & 1.2 & 1.5 & 0.1 \\
    0.2 & 0.3 & 0.1 & 0.6 \\
    1.2 & 1.4 & 1.1 & 1.5 \\
    \end{bmatrix}$$

    즉, "boy"는 [1.2, 1.4, 1.1, 1.5]이다.

    2.1.2 Positional encoding

    RNN을 사용하지 않기 때문에 위치정보를 알려줄수 있는 positional encoding을 사용해야한다.

    이땨 positional encoding은 embedding과 같은 차원정보를 가진다.

    위의 "I am a boy"가 4*5 차원의 embedding값을 가지는데, positional encoding도 동일하게 4*5차원을 가진다.

    둘은 element wise로 더해진다.

     

    2.2 Endocer(인코더)

    Encoder는 여러개의 Encoder Layer로 구성되어 있으며,

    각 Encoder Layer는 Multi-head Attention과 Feedforward Layer로 구성되어 있고,

    Residual learning(잔차학습)을 하는 것이 특징이다.

    (ResNet때의 내용 기억)

    우리는 Encoder의 구성 중 하나인 Multi-head Attention를 알아보기에 앞서서 Self Attention을 먼저 알아본다.

    그 이유는 Multi-head Attention이 Self Attention 여러개로 구성되어 있기 때문이다.

    2.2.1 Self Attention

    Self Attention은 문장의 각 단어들이 서로 어떠한 연관관계를 가지고 있는지를 의미한다.

    https://wikidocs.net/images/page/159310/scaled_dot_product-1030x351.png

    위의 그림에서 쿼리(Query), 키(Key), 값(Value)이라는 개념이 등장하는데 풀어쓰자면 아래와 같다.

    "I am a boy" 라는 문장이 존재할 때 "I"에 대해서 {"I" : 쿼리}가 {"am","a","boy" : 키}와 어느정도의 {연관성 : 값}을 가지는가? 라는 Attention을 계산할수 있다.

    이와 마찬가지로 "am", "a", "boy"에 대해서도 각각 Attention을 구할수 있다.

    이에 대해서 쿼리(Query)는 입력 데이터의 embedding값과 쿼리를 생성해주는 행렬 \(W_{Q}\)로 계산된다.

    여기서 \(W_{Q}\)는 추후 학습되어야할 가중치이다.

     

    embedding된 입력 데이터는 아래와 같이 표현되며, (위의 2.1.1 Embedding 예시 참고)

    $$I  \ am \  a \  boy = X = \begin{bmatrix}
    1.3 & 0.9 & 1.1 & 0.3 \\
    0.5 & 1.2 & 1.5 & 0.1 \\
    0.2 & 0.3 & 0.1 & 0.6 \\
    1.2 & 1.4 & 1.1 & 1.5 \\
    \end{bmatrix}$$

     

    쿼리를 생성해주는 행렬 \(W_{Q}\)는 아래와 같이 표현된다.

    $$W_{Q} = \begin{bmatrix}
    0.2 & 0.5 & 0.1 \\
    0.3 & 0.7 & 0.4 \\
    0.6 & 0.1 & 0.1 \\
    0.2 & 0.9 & 0.5 \\
    \end{bmatrix}$$

     

    최종적으로 쿼리(Query)는 아래와 같다.

    $$Q = X \times W_{Q}$$

    $$Q = \begin{bmatrix}
    1.3 & 0.9 & 1.1 & 0.3 \\
    0.5 & 1.2 & 1.5 & 0.1 \\
    0.2 & 0.3 & 0.1 & 0.6 \\
    1.2 & 1.4 & 1.1 & 1.5 \\
    \end{bmatrix}\times\begin{bmatrix}
    0.2 & 0.5 & 0.1 \\
    0.3 & 0.7 & 0.4 \\
    0.6 & 0.1 & 0.1 \\
    0.2 & 0.9 & 0.5 \\
    \end{bmatrix}=\begin{bmatrix}
    1.25 & 1.66 & 0.75 \\
    1.38 & 1.33 & 0.73 \\
    0.31 & 0.86 & 0.45 \\
    1.62 & 3.04 & 1.54 \\
    \end{bmatrix}$$

    이때 \(W_{Q}\)에 의해서 쿼리(Query) 차원정보는 기존의 Embedding과는 다르게 4*3으로 변경되었다.

     

    동일하게 키(Key)와 값(Value)도 동일하게 행렬 \(W_{K}\)와 \(W_{V}\)로 생성된다.

    이때, \(W_{Q}, \ W_{K}, \ W_{V}\)는 차원정보는 같지만 별개의 행렬이다.

     

    $$K = X \times W_{K}$$

    $$V = X \times W_{V}$$

     

    쿼리(Query), 키(Key), 값(Value)를 모두 구하였다면, 아래의 식을 통해서 Self Attention을 구할수 있다.

    $$ Attention(Q,K,V) = softmax(\frac{QK^{T}}{\sqrt{d_{K}}})V $$

    2.2.2 Multi-head Attention

    앞서 설명한 Self Attention은 임의의 숫자만큼 생성되며, 모든 Self Attention 결과를 이어붙인 후 \(W_{O}\)와 행렬곱하여 최종 Attention을 도출한다.

    Multi-head Attention의 입출력 차원은 동일하게 유지하여 데이터의 차원이 점점 줄어드는 것을 방지한다.

    (\(W_{O}\)의 차원정보를 입출력 차원은 동일하게 할수 있도록 설정한다.)

    https://wikidocs.net/images/page/159310/mha_visualization-930x1030.png

    2.2.3 Residual Learning(잔차학습)

    성능향상을 위해 Residual learning을 사용한다. (ResNet에서 도입한 개념, 높은 성능향상을 불러왔다고 한다.)

    입력 원본과 Layer를 지난 출력값간의 차이를 통해서 학습을 더 쉽게 할수 있다고한다.

    자세한 내용은 추후에 추가할 예정.

    2.2.4 Mask Matrix

    Mask matrix를 통해서 특정 단어는 무시할수 있도록 할수 있다.

    Mask matrix는 Embedding과 동일한 차원을 가지며, 무시하고싶은 단어의 위치에 -inf 값을 넣어서 함수의 출력이 0에 근사하도록 한다.

    https://wikidocs.net/images/page/162096/6_encoder.png

    2.3 Decoder(디코더)

    Decoder는 여러개의 Decoder Layer로 구성되어 있으며,

    각 Decoder Layer는 2개의 Multi-head Attention과 1개의 Feedforward Layer로 구성되어 있고,

    Residual learning(잔차학습)을 하는 것이 특징이다. (ResNet때의 내용 기억)

    또한 두번째의 Multi-head Attention이 마지막 Encoder Layer의 출력값을 입력으로 받는다.

    문장을 차례로 예측하기 때문에 Decoder는 처음에 <sos>만을 입력으로 받고 최종 출력으로 <eos>가 나올때까지 반복된다.

     

     

    참고문헌

    https://wikidocs.net/book/2155

    https://www.youtube.com/watch?v=AA621UofTUA 

    https://ratsgo.github.io/nlpbook/docs/language_model/tr_self_attention/

     

    반응형

    댓글

Designed by Tistory.