ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NLP]트랜스포머(Transfomer):Attention Is All You Need
    자연어처리NLP 2021. 4. 9. 00:02

     

    트랜스포머?

    2017년 구글이 발표한 "Attention is all you need"의 논문에서 나온 딥러닝 모델이다. 기계번역의 발전과정은 다음과 같다. 

    RNN -> LSTM -> Seq2Seq -> Attention -> Transformer

    최근 모델인 GPT, BERT는 Transformer 아키텍쳐를 기본으로 한다. 

     

    Seq2Seq

    2개의 RNN 신경망으로 구성된 seq2seq 모델은 인코더-디코더 구조로 구성되어있는데, 인코더는 입력 시퀀스를 하나의 벡터로 압축하고 디코더는 이 벡터를 통해 출력시퀀스를 만든다. 하지만 고정된 크기의 context vextor를 사용해서 한 벡터로 압축해야하기 때문에 입력 시퀀스의 일부가 손실되는 한계가 존재했다. 

     

    2021.04.09 - [자연어처리NLP] - [NLP]Seq2Seq(sequence to sequence)시퀀스 투 시퀀스

     

    [NLP]Seq2Seq(sequence to sequence)시퀀스 투 시퀀스

    seq2seq? 번역기에서 대표적으로 사용되는 모델이다. RNN을 기반으로 만들어진 모델이다. seq2seq구조 seq2seq는 인코더와 디코더로 구성된다. 입력문장을 받는 RNN셀 : 인코더, 출력문장을 내보내는 RNN

    haesunnysideof.tistory.com

    이 한계를 보정하기 위해서 어텐션(attention) 기법이 사용하여 성능을 끌어올렸다. 

    * Attention : seq2seq에서는 단순히 마지막에 나온 state만 context vector로 사용하였지만 attention에서는 인코더에서 나온 각각의 state들 사용해서 state별로 여러개의 context vector를 만들고, 집중할 단어에만 집중 할 수 있게 만듦으로써 발전시켰다. 

     

    이후 transformer에서는 RNN을 사용하지 않고 Attention 만을 사용하여 이전보다 성능을 더 높힐 수 있었다. 

     

    트랜스포머의 전체적인 동작 원리

    1. Input emdedding : RNN을 사용하지 않으므로 위치정보를 포함하고있는 임베딩을 사용해야한다. 이를 위해 Positional Encoding을 사용한다. 

    2. Encoder : 임베딩이 끝난 후에 위치 정보를 포함하고 있는 입력값을 어텐션에 넣어준다. 즉 어텐션은 입력문장+위치 를 입력으로 받는다. 인코더 부분의 어텐션은 각각의 단어가 서로간에 가진 연관성을 가지고 있는지 구하기 위해 사용된다. 성능향상을 위해 Residual Learning(잔여학습) 을 사용한다. 

        * Residual Learning(잔여학습) : 특정 레이어를 건너뛰어서 복사된 값을 그대로 넣어줌 -> 기존 정보를 받으면서 추가되는 부분만 학습하도록 만듦으로써 학습난이도가 낮아져 성능이 좋아진다. 

    어텐션과 정규화과정을 반복하여 여러개의 레이어를 중첩해서 사용한다. 이때, 각 레이어는 서로 다른 파라미터를 사용한다. 

    3. Decoder : 디코더 역시 마찬가지로 여러개의 레이어로 구성되어있다. 마지막 인코더 레이어의 출력이 모든 디코더의 입력이 된다. 

     

    N=6, 인코더의 출력이 모든 디코더의 입력이 된다.
    트랜스포머 아키텍쳐

    트랜스포머 역시 인코더와 디코더의 구조를 따르지만 RNN을 사용하지 않고 인코더와 디코더를 여러개 사용하는것이 특징이다. 

    seq2seq 에서는 인코더 디코더에서 각각 하나의 RNN이 t개의 time-step을 가지는 구조였다면 트랜스포머는 인코더와 티코더가 N개로 구성되는 구조이다. 논문에서는 N=6으로 사용했다. 

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    트랜스포머는 그림과 같이 세가지 어텐션으로 이루어져있다. 

    세 개의 어텐션에 멀티헤드 가 붙어있는데 이는 트랜스포머가 어텐션을 병렬적으로 수행하는 방법을 의미한다. 

    트랜스포머는 하이퍼파라미터인 num_layers 개의 인코더 층을 쌓는다. 논문에서는 6으로 사용했다. 

    하나의 인코더 층은 2개의 sublayer로 나뉘는데, 셀프어텐션과 피드포워드 신경망으로 나뉜다. 

     

     

     

     

     

     

    포지셔널 인코딩(Positional Encoding)

    RNN은 단어의 위치에 따라 단어를 순차적으로 입력받아서 처리하기 때문에 각 단어의 위치 정보를 얻을 수 있었다. 하지만 트랜스포머는 그렇지 않으므로 단어의 위치정보를 알려주어야한다. 이를 위해 각 단어의 임베딩벡터에 위치 정보를 더해 모델의 입력으로 사용한다. 

    positional encoding 의 공식

     

    각 단어의 상대적인 위치정보를 알려주기 위해서 주기함수를 사용한다. 

     

     

     

     

    임베딩 벡터가 모여서 만들어진 문장 벡터 행렬과 포지셔널 인코딩 행렬의 덧셈은 아래와 같다. 

    pos : 입력 문장에서 임베딩 벡터의 위치

    i : 임베딩 벡터 내의 차원의 인덱스

    dmodel : 트랜스포머의 모든 층의 출력 차원을 의미하는 하이퍼파라미터. 논문에서는 512 이다. 

     

    이렇게 포지셔널 인코딩을 사용하면 순서정보를 가진 입력 임베딩 벡터를 얻을 수 있다. 

     

    어텐션(Attention)

    어텐션을 위한 세가지 입력요소

    • 쿼리(query) : 단어 A 가 다른 단어들과 얼마나 유사도를 가지는지를 구할 때 단어 A 에 해당하는 값
    • 키(key) : 다른 단어들에 해당하는 값들
    • 값(value) : 쿼리와 키로 score를 구하여 value값과 곱해서 어텐션 value를 구한다. 

    멀티 헤드 어텐션에서는 h개의 서로다른 value, key, query 로 구분되게 만들어 h개의 서로 다른 어텐션 컨셉을 학습하여 다양한 특징을 학습할 수 있게 해준다. 결과적으로 입력값과 출력값의 차원은 같다. 

     

    쿼리, 키, 값 의 차원 : dmodel/h

     

    하나의 단어에 대한 동작 원리 : scaled dot production attention

     

    dmodel을 4, h=2라고 하면 1by4 벡터가 가중치 벡터 W 를 거쳐서 2by1 벡터로 key, query, value 데이터를 표현한다. 

    쿼리는 각각의 key들과 행렬곱을 수행해 어텐션 에너지값을 구하고 이 값을 정규화한 후 소프트맥스 함수를 통해 각각의 key에 대한 가중치를 구한다. 이 각각의 가중치에 value를 곱한뒤 이 값들은 모두 더해 어텐션값을 구한다. 

     

    행렬에서의 동작 원리 : scaled dot production attention

    실제로는 행렬곱을 통해 한번에 연산한다.

     

    이 때 어텐션 에너지값에서 특정 단어를 무시할 수 있도록 하기 위해 mask matrix를 사용한다. 마스크값에 음의 무한의 값을 넣어 sotfmax함수의 출력이 0에 가까워지도록 만든다. 

     

    이 후 Multihead를 수행한다. concat으로 결과 행렬을 이어붙인다. 이를 수행한 후엔 원래의 dmodel과 차원이 같게 유지된다. 

    위 예제의 dmodel은 4by4이고 head를 이어붙이면 3by4 행렬이 나온다. multihead에서 이 3by4행렬과 4by4 행렬을 곱하므로 결과적으로 입력 차원과 같은 3by4행렬이 나온다. 

     

     

    어텐션의 종류

    트랜스포머에는 세가지의 어텐션이 사용된다. 어텐션이 사용되는 위치에 따라 나뉜다. 

    인코더의 셀프 어텐션 : Query = Key = Value

    • 각각의 단어가 서로에게 어떤 연관성을 가지는지 구하여 전체 문장의 표현을 배울 수 있다.  

    디코더의 마스크드 셀프 어텐션 : Query = Key = Value

    • 출력문장이 앞쪽에 등장한 문장만 참고하도록 만든다. 자기자신보다 미래에 있는 단어를 볼 수 없도록 마스킹해준다. 

    디코더의 인코더-디코더 어텐션 : Query : 디코더 벡터 / Key = Value : 인코더 벡터

    • 출력단어들이 입력단어들중에서 어떤 정보에 가중치를 많이 두는지 구함

     

    참고 youtu.be/AA621UofTUA, wikidocs.net/31379

Designed by Tistory.