[NIPS 2017]Attention Is All You Need

안녕하세요 최인하입니다. 오늘은 예전부터 리뷰하고 싶었던 Attention Is All You Need 논문을 리뷰해 보려고 합니다. 기존 자연어 처리 모델들이 attention으로 Encoder와 Decoder가 연결되어있는 구조로 좋은 성능을 보였는데, 논문에서 소개하는 Transformer model은 Encoder, Decoder 내부에서 attention을 수행하는 self-attention 기법을 도입하여 SOTA를 달성하였습니다. 또한 sequential한 데이터를 처리하는 RNN의 long term dependencies와 병렬화가 안된다는 문제를 해결하였습니다. 바로 시작해보겠습니다.

위의 그림은 Transformer model의 architecture 입니다. 순차적으로 Transformer model이 어떻게 machine translation task를 수행하는지 설명해보겠습니다.

우선 Transformer의 Encoder, Decoder 부분을 설명하기 전에 전처리 과정이라고도 할 수 있는 input Embedding 과정과 Positional Encoding 과정에 대해서 설명하겠습니다. “나는 학생이다” 를 “I am a student”로 번역하기 위해서, “나는 학생이다.”를 model이 이해할 수 있도록 Embedding하는 과정이 필요하겠죠 이 또한 Embedding layer를 통해 학습이 되며, 단어 즉 token 형태의 data를 수치 형태의 벡터로 변환합니다. 이 때 유사한 단어는 유사한 값을 지니도록 embedding을 수행하게 됩니다.

기존의 RNN과 달리 transformer는 sequential한 데이터를 병렬로 처리하므로 각 단어 즉 token의 위치에 대한 정보를 알지 못합니다. 따라서 위치 정보를 Positional Encoding 방식으로 Embedding 된 벡터에 주입합니다. positional Encoding 방식으로는 sinusoid positional encoding 방식이 사용되었습니다.

여기서 d(model)은 embedding vector의 차원입니다. pos는 입력되는 sequence data에서의 embedding vector의 위치입니다. (예를들어 나는 학생이다 에서 나는 : 0, 학생 : 1, 이다 : 2) i 는 0,1,2 .. 로 증가하며 embedding vector 내 차원의 순서를 표현합니다. 즉 홀수 차원은 cos을 짝수 차원은 sin 값을 받게 되겠죠? 이렇게 얻어진 벡터를 embedding 벡터에 더해줌으로써 단어의 정보를 담고 있는 벡터는 위치 정보까지 포함하게 됩니다. (더해지는 과정에서 embedding 벡터에 root(d(model))을 곱해줌으로써 스케일링을 수행합니다. 저는 임베딩 된 벡터의 수치가 작은 값인데 -1~1 사이의 값을 더해주게 되면 단어의 의미가 손실 되기 때문에 스케일링을 수행한다고 이해했습니다.) 이렇게 얻어진 벡터가 이제 Encoder에 들어가게 됩니다.

Encoder of Transformer

Attention

논문의 제목처럼 Transformer 구조에서는 Attention이 많은 부분을 차지합니다. 따라서 model 구조 안에서 attention이 어떻게 수행되는지 이해해야합니다. Attention의 식을 보면 다음과 같습니다.

Attention을 구하기 위해서는 Q, K, V가 필요한데, 각각 Query, Key, Value를 의미합니다. Query, Key, Value에 대해서 제가 이해한 대로 설명해보겠습니다. (부정확한 부분이 있으면 댓글 남겨주시면 감사하겠습니다.) Query는 현재 처리하는 단어를 나타내는 벡터라고 이해했습니다. 즉 나는 지금 이 단어가 다른 단어와 얼만큼 연관성을 가지고 있는지 알고 싶어라고 질문할 때 Query는 질문의 역할을 하는거죠. Key는 각각의 단어에 대한 정보 값이라고 이해했습니다. 즉 Query를 받았을 때 Key를 dot product 해줌으로써 key 단어와 query 단어와의 연관성(attention score)을 계산해주는 역할을 수행하는 것으로 이해했습니다. 마지막으로 value는 위에서 말한 정보를 갖고 있는 벡터라고 이해했습니다. 즉 단어가 문장 내에서 다른 단어와 얼만큼의 연관성을 지니고 있는지에 대한 정보를 담고 있는 벡터입니다.

Query, Key, Value는 input에 학습된 가중치 벡터를 곱하면서 형성됩니다. 이렇게 구해진 Q, K, V 벡터로 Attention을 수행하게 됩니다. Encoder 내부 정보만 가지고 Attention을 수행하므로, Self-Attention이라고 합니다. Self-Attention의 수행과정은 위의 그림과 같습니다. 학습된 가중치 벡터로 뽑아진 query와 key를 dot product 해줌으로써 attention socre를 추출하고, 이를 softmax 태우기 전 키벡터의 차원에 root를 씌운 값으로 나누어 줍니다. (softmax에 큰 값이 들어가서 vanishing gradient를 유발할 수 있기 때문에라고 이해했습니다) 그후 softmax 값과 value 벡터를 곱해주고 나온 value 벡터를 전부 더해주면 최종 특징 벡터인 z가 나오게 됩니다.

이 과정을 병렬적으로 수행한 것이 Multi-Head Attention입니다. CNN에서 여러 feature를 추출하기 위해서 여러 채널을 사용하는 것처럼 Multi-Head 또한 같은 방식이라고 이해했습니다.

그 후 head의 수만큼 증가된 z 벡터의 차원을 (concat 되므로) 학습되는 가중치 wo 벡터를 통해서 input 차원과 맞춰주는 과정을 거치게됩니다. 그후 residual connection과 LayerNorm 과정을 거치고 FeedForward Network에 들어가게 됩니다.

FeedForward Network에서는 각각의 z 벡터의 차원 즉 각각의 토큰에 대한 최종 정보를 비선형 변환하는 역할을 한다. 즉 더욱 고차원의 정보를 뽑아낸다고 이해했습니다. 이후 최종 Encoder의 최종 아웃풋이 나오게됩니다.

Decoder of Transformer

Decoder에서의 self-attention은 masked multi-head self-attention이라고 합니다. masked라는 표현은 transformer model이 training 과정에서 미래의 정보 즉 문장 내에서 다음 단어를 참조하는 것을 막기 위해 미래 단어와의 attention score를 의도적으로 -inf 값으로 보내는 과정을 의미합니다. 이러한 과정으로 model은 training 시 미래 단어에 대한 정보가 없는 특징 벡터 z를 output으로 내보내게 됩니다. 이러한 masked 작업이 필요한 이유는 inference시 model은 미래 단어를 보지 못하기 때문에 학습시에 미래 단어를 보면서 학습한다면 inference 성능이 낮게 나올 수 있기 때문이라고 이해했습니다.

그 후 Encoder의 최종 output의 key, value 벡터가 Decoder의 masked multi-head self-attention을 지나온 query 벡터와 attention을 수행합니다. 이 과정은 self-attention이 아니겠죠? 위에서 예시를 든 “나는 학생이다”, “I am a student”를 보면 Encoder(key, value)는 “나는 학생이다”의 key, value 값이 Decoder의 query는 “I am a student”의 query 값이 들어온다고 이해했습니다. 이제 주어진 key, query, value 벡터를 가지고 multi head attention을 수행 후 FFN을 지나고 Transformer model은 machine translation task를 수행하게 됩니다.

Evaluation

Transformer model은 450만개의 영어 – 독일어 문장쌍으로 학습을 진행했으며, 영어 – 프랑스어 같은 경우 3600만개의 문장쌍으로 학습을 진행했다고 합니다.

Table 2에서는 Transformer model이 기존의 machine translation model 보다 좋은 성능을 보이는 것을 보여준다. big model과 base model의 차이는 밑의 Table 3에 자세히 나와있으며, 학습 시간은 3.5일과 12시간이다.

Table 3는 Transformer model의 하이퍼 파라미터를 바꿔가며 비교한 결과이다. 뭔가 보면서 BLEU가 전부 고만고만 하다가 Layer의 수 N이 2개로 줄어들면서 점수가 폭락한 것이 눈에 띄었다. 너무 얕은 layer는 정보를 잘 못 뽑는구나 생각헀다. 그리고 base model에서 FFN node수를 4096개로 늘렸을 때 거의 big model의 성능과 비슷해지는 것을 보고 FFN이 transformer에서 중요하구나 느꼈다. (비선형성의 추가)

이번 URP를 진행하면서 평소에 읽어보고 싶었던 Transformer를 읽을 수 있게 돼서 좋은 경험이었습니다. 읽어야지 읽어야지 했는데 지금이라도 읽은게 어디인가 싶습니다. 앞으로 논문에서 transformer 언급이 되면 기분이 좋을 것 같습니다. 긴 글 읽어주셔서 감사합니다!

Author: 최 인하

11 thoughts on “[NIPS 2017]Attention Is All You Need

  1. 안녕하세요 인하님, 좋은 리뷰 감사합니다.
    쉽게 설명해주셔서 덕분에 공부가 많이 되었습니다.

    positional encoding 부분에서 궁금한 점이 있는데요, 하필 sinusoid 형태의 함수를 사용하게 된 이유가 여러가지 있는 것으로 알고 있는데 그 부분을 이해해기 어렵더라고요. 논문에 어떻게 설명되어 있는지 조금 더 자세히 알려주실 수 있나요?

    감사합니다.

  2. 안녕하세요 인하님 트랜스포머를 다뤄주셨네요.
    저도 트랜스포머를 처음 봤을떄도 그렇고 지금도 cross attention 이나 self attention 을 모듈에 사용하면서도 어떻게 연산이 되는지 query와 key value 를 설정하는데에 개념적으로 헷갈릴 때가 많습니다. 그만큼 사실 내용을 전부 숙지하기는 어렵다고 판단이 되는데, 읽으면서 확실하게 알면 좋겠다 싶은 개념은 사실 실제 학습되는 파라미터가 어느 위치에 있는가 입니다. 한번 생각해보시고 답글 달아주시면 좋겠습니다. 만약 학습되는 파라미터를 알게되었다면, self attention 이든 cross attention 이든 연산을 거치고 나오는 값과 attention map 의 차이점도 생각해보면 좋을 것 같습니다.

    1. 안녕하세요 인택님.
      좋은 댓글 달아주셔서 감사합니다.

      우선 학습되는 파라미터에 대해서 설명해보겠습니다.
      1. 워드 임베딩, positional encoding 과정이 끝난 후 문장에 대한 정보가 있는 벡터를 query, key, value 벡터로 선형 변환 해주는 가중치 벡터 Wq, Wk, Wv를 학습하게 됩니다. (제가 아직 Residual 과, LayerNorm을 잘 알지 못해서 여기서는 어떻게 학습이 이루어지는지 자세히 설명은 하지 못할 것 같습니다. 추후 공부해보겠습니다!)
      2. 그 후 multi head attention을 진행하므로, 최종적으로 인코더 multi head attention을 수행하고 나온 output z를 feedforward net과의 차원과, input 차원과 맞춰주기 위해서 z를 concat하고 차원을 맞춰주기 위한 가중치 벡터 w0를 학습하게 됩니다.
      3.. FeedForwad Net 파라미터를 학습하게 됩니다. (인코더)
      4.. 그리고 최종 인코더 output을 디코더의 cross-attention 부분에 key, value로 사용하기 위해서 wk와 wv를 학습하게 됩니다.
      5. 디코더 부분 또한 워드 임베딩 포지셔널 인코딩 수행후 multi head attention 을 수행하기 위헤 key, query, value 가중치를 학습하고, 나온 output을 query로 변경하기 위한 가중치를 학습합니다. 그 후 cross attention을 수행하고 Feedforward net을 학습합니다.

      결국 self attention의 연산을 거친 후 나오는 값은 문장 내 토큰끼리의 연관성을 표현한다고 생각합니다. (대각선 모양)
      그리고 cross attention은 transformer가 번역 모델이므로, 디코더의 self attention을 수행 후 거기서 나온 query를 가지고 인코더에서 나온 최종 output인 key ,value 값과 비교해서 다른 언어에서의 연관성을 표현한다고 생각합니다.
      이 떄 각 언어의 길이와, 위치 표현 방식이 다를 수 있기 때문에 대각선 모양은 아닐 것 같습니다.

      질문 감사합니다.

  3. 안녕하세요 인하님 리뷰 감사합니다.

    저도 트랜스포머에 대해 엄청 잘 아는게 아니라 지나가다가 읽게 된 것 같습니다.
    table 3에서 FFN의 hidden dimension을 확장했을 때 BLEU가 layer 수나 head 수 증가보다 더 크게 개선되는데,
    transformer에서 표현력의 병목이 attention보다는 FFN에 있다고 생각해도 되는걸까요?

    1. 안녕하세요 영규님.
      좋은 질문 감사합니다.

      트랜스포머의 인코더, 디코더 attention 연산을 보면 대부분 벡터의 곱 즉 선형 변환이 이루어집니다.
      선형 변환의 특성상 표현력을 증가시킨다기 보다는 토큰 사이의 관계성을 학습한다고 이해하시면 좋을 것 같습니다.
      따라서 비선형 변환을 이용해 표현력을 증가시키기 위해 FFN을 사용했다고 생각이듭니다.
      그러므로 제 생각은 트랜스포머의 표현력은 FFN에 있다고 생각합니다.

      질문 감사합니다.

  4. 안녕하세요 인하님! 좋은 리뷰 감사합니다.
    트랜스포머의 학습 과정은 자세히 다뤄주신 것 같은데, 어떻게 inference를 하는 지는 없는 거 같아서 질문 드립니다. 추론 단계에서는 학습 때와 달리 decoder input으로 문장 전체가 들어갈 수 없을텐데, 어떤 input을 넣어서 어떻게 출력 문장을 생성하는 지에 대해 설명해주시면 감사하겠습니다!

    1. 안녕하세요 재윤님!
      좋은 질문 감사합니다.

      말씀하신 부분이 맞습니다. 따라서 디코더 부분에서는 문장의 시작 부분 (start of sentence), 문장의 끝 부분(end of sentence) 토큰을 사용합니다. 따라서 문장 전체가 들어가는 것이 아니라, 토큰을 하나씩 예측하면서, 디코더에 입력으로 넣어줍니다. 이 때 미래 시점의 토큰 정보를 알려주지 않기 위해 masked attention이 사용됩니다!

      좋은 질문 감사합니다.

  5. 안녕하세요 인하님 좋은 리뷰 잘 읽었습니다.
    attention의 근간이 되는 좋은 논문 리뷰 감사합니다.

    궁금한 점이 있습니다.
    일반적인 CNN기반의 network에 비해서,
    transformer 기반의 ViT 모델은 동일 성능 도달을 위해 훨씬 더 많은 데이터를 필요로하는 것으로 알고 있습니다.
    혹시 해당 논문이 ViT는 아니지만, NLP에서도 고전적 기법보다 transformer기반이 데이터를 더 많이 필요로하는지, 그리고 그렇다면 왜 그런지 설명을 듣고 싶습니다.

    1. 안녕하세요 정우님.
      좋은 질문 감사합니다.

      사실 아직 ViT 논문을 읽어보지 않아서 허허 꼭 읽어 보겠습니다.
      우선 제가 찾아본 결과 Transformer model이 다른 model 보다 inductive bias가 부족하다고 합니다.
      Inductive bias란 의도적으로 모델에게 편향을 심어주는 것이라고 합니다. 즉 vision 분야에서 CNN이 이미지를 왜 잘 해석할 수 있었을까?를 생각해 보았을 때 CNN은 이미지의 공간적인 정보를 알기 위해 kernel을 통해 주변 픽셀의 정보를 뽑아내기 때문에 이런 측면에서 inductive bias 요소가 있다고 생각합니다. (의도적인 편향적 설계?) RNN도 비슷하게 sequential한 정보를 잘 처리하기 위해서 설계되었다고 볼 수 있겠네요. 즉 이런 inductive bias 적 설계가 task에 맞게 설계 되었기 때문에 이런 model 들은 적은 데이터에서는 transformer 보다 더 좋은 성능을 보일 수 있다고 생각합니다.

      감사합니다.

  6. 안녕하세요 인하님 좋은 리뷰 잘 읽었습니다.

    저도 트랜스포머에 논문읽은지가 좀 지나서 복습겸 읽게 되었습니다.
    positional encoding 부분에서 궁금한 점이 있는데요. 모델이 입력순서를 알기위해서 사용되는 걸로 알고있습니다
    그럼 저희가 인공지능 처음 부분에 mlP 에 한계도 이 Positional encoding을 사용하면 해결되지않을까요 ?
    인하님 생각이궁급합니다

    1. 안녕하세요 우진님.
      좋은 질문 감사합니다.

      맞습니다. positional encoding은 임베딩 된 토큰을 병렬적으로 처리하는 transformer 구조에서 model에게 입력 순서를 알려주는 역할을합니다. sequential 한 데이터 특성상 순서가 중요하거든요.

      MLP의 한계는 이미지 데이터를 처리할 때 공간적인 정보를 잃어버린다는 점이었습니다. 이미지에서 기준 픽셀의 주변 픽셀과의 관계가 중요한 역할을 하는 경우가 많아 이런 정보를 잃어버리는게 큰 단점이었죠. 결국 Positional encoding 방식을 통해서 순서를 알려준다고 해도, 이미 flatten 된 이미지는 이러한 공간적인 정보를 잃어버리기 때문에 해결하기 어려울 것 같습니다.

      감사합니다.

Leave a Reply to 이 재윤 Cancel reply

Your email address will not be published.