[NIPS 2017] Attention Is All You Need

Context

안녕하세요, RCV 강희승 연구원입니다. ICML 이후 드디어 첫 X-review를 작성하게 되었습니다. RCV에 공식적으로 입실한 이후, 약 4개월이 지난 지금 기초교육 간 적지 않은 논문들을 읽었던 것 같습니다. 교육은 CV,NLP 관련 근본 논문들로 주로 구성 되었던 것 같습니다. 그렇다 보니, 해당 논문들의 내용들이 최신 논문들에서 아직도 많이 활용되고 있는 것으로 보입니다. 따라서 저는 당분간, 교육 간 읽었던 논문들 중, 중요한 논문들을 일부 선별하여, 복습 및 공유하는 목적으로 X-Review를 작성하려고 합니다.

첫 X-Review의 주인공은 “Attention Is All You Need” 으로 Transformer에 대한 논문을 정리해보려고 합니다.

Background

NLP 분야에서는, 복잡한 RNN, CNN을 포함한 Encoder, Decoder로 구성된 모델이 주를 이루었고, Encoder와 Decoder를 Attention Mechanism을 활용하여 연결한 모델들이 가장 좋은 성능을 보였습니다.

이러한 모델들은 Sequential Computation을 수행하면서, memory 효율과 computation cost에서 문제를 가지고 있었습니다. 또한, sequence의 길이가 길어질수록, 이전 context에 대한 정보가 흐릿해지는 Long-Term Dependency라는 문제도 존재하였습니다.

기존 연구들이 computation efficiency를 향상시키기 위해 여러 기법들을 제시하였지만, 여전히 근본적인 sequential computation의 한계가 존재하였습니다.

따라서 Transformer를 통해 sequential 구조가 가지는 단점들을 해소하고자 하였습니다.

Model Architecture

그 당시, 대부분의 경쟁력 있는 sequence transduction model은 encoder-decoder 구조를 가지고 있었기 때문에, Transformer의 구조도 해당 구조를 따랐다고 합니다.

Input Embeddings

sequence data에 대해, tokenize를 수행하고, token들 $d_{model}$ 의 dimension을 가지는 vector space로 embedding을 수행합니다. 이를 통해 Input Sequence를 Model이 연산 가능하도록 합니다.

Positional Encoding

RNN, CNN 을 전혀 사용하지 않다 보니, sequence input에 대해 순서를 고려할 수 있는 구조적 특징이 없습니다. 따라서, Transformer는 positional encoding을 통해, token 자체에 순서에 대한 정보를 주입하였습니다. 해당 정보의 dimension은 input의 공간과 같은 $d_{model}$ 로, 이후 embedding과 합을 수행하였습니다.

Transformer에서는 Sinusoid Positional Encoding을 적용하였습니다.

해당 방식은 k 만큼 떨어진 두 토큰의 관계를 어떠한 토큰이던 linear function으로 표현이 가능합니다. 예를 들면, 1번째 token으로 부터 5만큼 떨어진 6번째 토큰과의 position 관계와, 4번째 token으로부터 5만큼 떨어진 9번째 token과의 관계가 동일한 위치 관계를 가짐을 표현할 수 있습니다.

또한, 학습 시 사용했던 sequence의 길이보다 더 긴 sequence에 대해 inference를 수행할 때, sinusoid의 주기성을 활용하여, 외삽이 가능하다는 장점이 있습니다.

해당 수식에서, 위치를 $10000^{2i/d_{model}}$ 로 나눠주는 이유는 token의 vector dimension이 서로 다른 주파수를 기반으로 위치 정보를 나타낼 수 있도록 하기 위함입니다.

구체적으로, 높은 주파수를 가지는 dimension에서는 token의 위치에 따라 큰 embedding의 차이를 보이기 때문에, 각 token이 sequence 내에서 어떤 local position을 가지는지 구분하게 해줍니다. 반면, 낮은 주파수를가지는 dimension에서는 token의 위치가 크게 변해야 유의미한 embedding의 차이를 보입니다. 따라서, 문장의 시작 또는 끝과 같은 global position 정보를 표현할 수 있습니다.

Encoder and Decoder Stacks

Encoder와 Decoder 두 구조 모두, 여러 layer로 stack 되어 구성 되어 있습니다. 또한, Encoder의 경우 Attention + FFN 총 2개의 sub-layer, Decoder의 2개의 Attention과 FFN으로 3개의 sub-layer로 구성 되어 있습니다.

각 sub layer를 거친 이후, residual connection과 Layer Normalization을 수행합니다.

Attention

Scaled Dot-Product Attention

Transformer에서 사용되는 attention function은 Query와 Key-Value를 Mapping하는 방식으로 사용됩니다. Query, Key, Value와 Attention의 결과는 모두 vector 형태를 띠며, output은 value에 대한 weighted sum 값입니다.

Output에 해당하는 각 value들의 weight는 Query와 Key에 의해 결정이 됩니다.

해당 수식은 다음과 같이 수행이 됩니다.

  1. Query와 Key의 유사도를 Matrix Multiplication으로 계산합니다.
  2. $\sqrt{d_k}$ 로 나누어, 유사도 공간을 scaling 해줍니다.
  3. Softmax를 취한 값을 Value에 곱하여, 각 Query에 대응하는 Value 값들을 weighted sum을 수행합니다.

이를 의미론적으로 해석을 해보자면, 먼저 Query, Key, Value를 다음과 같이 정의할 수 있습니다.

  • Query란 어떤 Query에 대응하는 Key-Value를 찾기 위한 질문 vector
  • Key란 어떤 Query에 대응하는 답변 vector
  • Value란 Key와 쌍을 이루는 값으로, token의 Representation

1 : “I am a student” 와 2 : “나는 학생입니다”

구체적인 예로, 1번 문장의 ‘I’를 Query로 2번 문장에서 대응하는 token을 찾기 위해 $Q_I$ 와 $K_{나는}$, $K_{학생입니다}$ 와 유사도를 구할 수 있습니다. 이에 대한 값을 $V$에 곱해 주어, ‘I’와 연관성이 있는 token들의 representation을 가중합으로 표현할 수 있게 됩니다. 이를 Attention의 Matrix Dot-Product를 통해 각 token들 간 유사도를 한번에 계산할 수 있습니다.

해당 과정까지 Attention Mechanism 자체를 이해했다면, 저자가 Dot-Product Attention을 사용한 이유와 Scaling을 수행한 이유를 살펴 보겠습니다.

먼저, Attention Mechanism에는 두가지 방식이 있습니다.

  • Additive Attention
  • Dot-Product Attention

전자의 경우, 하나의 Feed Forward network를 사용하여, Attention Score를 계산하는 반면, 고도로 최적화된 matrix multiplication을 수행하는 후자의 방식이 속도도 매우 빠르고, 공간 효율도 더욱 좋습니다.

하지만, Embedding dimension $d_k$ 이 작을 경우 두 기법이 유사한 성능을 보이지만, 클 경우 전자의 경우가 더 좋은 성능을 보였습니다. 원인은 $d_k$ 의 값이 커질수록, $QK^T$의 절댓값의 크기는 비례하여 커진다는 점입니다. Softmax는 동일한 비율의 값들을 가지고 있음에도 불구하고, 큰 scale의 값들에 대해 더 skew해지는 특성이 있습니다. 예를 들어, [1,2,3]과 [100,200,300]은 값들 간 상대적 비율은 동일하나, Softmax를 거친다면 각각 약 [0.090, 0.245, 0.665], [0,0,1] 가 됩니다. 즉, 입력의 scale이 커질수록 Softmax의 출력은 one-hot에 가깝게 포화됩니다. 따라서, $d_k$ 에 비례하여, 커지는 $QK^T$값을 그대로 Softmax에 사용된다면 값이 gradient가 극도로 작아져 학습이 어려워집니다.

따라서 저자는 속도와 공간 효율면에서 우수한 Dot-Product Attention에 Scaling을 적용한 Scaled Dot-Product Attention을 적용하였습니다.

Multi-Head Attention

저자는 Single Head Attention보다 Multi-Head Attention 방식을 선택하였습니다. Head에는 Q,K,V를 기반으로 각 다른 Matrix를 기반으로 projection 된 값들을 사용하며, 병렬적으로 계산된 값들을 최종적으로 concat을 수행하여 output을 산출합니다. 이때, 모델의 computation cost를 고려하여, 각 head의 dimension은 $d_{model} / h$ 로 설계하였습니다.

각 head가 서로 다른 representation subspace를 학습하여 다양한 종류의 information을 나타낼 수 있다라는 해석이 존재합니다. CNN이 여러 필터를 통해 다양한 Feature를 학습하는 것과 유사하게, 각 다른 head가 문장의 유형, 명사, 동사 등 다른 부분을 attention할 수 있다고 해석할 수 있습니다.

Application of Attention in Transformer

Transformer에는 3가지의 attention layer를 사용합니다.

  1. Encoder에서 쓰이는 Self-Attention 입니다. 해당 layer는 동일한 input으로 부터 나온 Query, Key, Value 를 기반으로 수행합니다.
  2. Decoder에서 쓰이는 Masked Self-Attention은 동일한 input으로부터 나온 Query, Key, Value를 기반으로 수행하는 점에서 self-attention이라고 불리지만, decoder에서는 생성한 token 까지의 위치만 참조 해야하기 때문에, 각 token 이후의 위치는 모두 masking을 한 후 attention을 수행합니다.
  3. 마지막으로 Encoder-Decoder attention으로, Cross-attention이라고 불리는 부분입니다. 해당 부분은 Encoder의 Key, Value와 Decoder의 Query를 기반으로 수행합니다. 이는 Decoder에서 input sequence의 모든 position을 참조할 수 있도록 합니다.

정리하자면, Encoder에서, input에 대해 관계를 학습하고, Decoder에서 출력을 위한 output(target) 간의 관계를 학습하는 Self-Attention을 수행합니다. 이후 각 Self-Attention의 결과를 기반으로 Cross-Attention을 수행하여, Input과 그에 대응하는 Output 간의 관계를 학습하는 흐름이라고 이해할 수 있습니다.

Position-wise FFN

각 Encoder와 Decoder에서 Attention layer를 거친 뒤, fully connected Feed-Forward Network를 적용합니다. 이는 두개의 선형 변환과, 활성화 함수 ReLU를 적용합니다. 이를 통해, Attention을 거친 통합된 Representation을 기반으로 비선형 변환을 수행하여, 단순 weighted sum representation이 아닌, 더 풍부한 representation을 학습할 수 있습니다.

Why Self-Attention

저자는 attention을 왜 채택했는지, Recurrent, Convolutional 모델들과 비교 실험을 통해 정당화했습니다. 고려해야할 것은 크게 세가지를 언급했습니다.

  • Computational Complexity
  • Amount of Computation
  • Path Length between long-range dependencies in the network

순차적 연산을 수행하는 Recurrent는 Sequential Operations을 수행하는데 O(n) 의 시간이 걸리고, 나머지 경우에 대해서는 O(1)로 매우 짧은 시간에 수행됩니다.

Path Length 의 경우, 짧을수록, Long-range dependency를 학습하기 더욱 용이하다고 합니다.

Self-Attention의 경우 모든 위치를 직접적으로 연결합니다. 따라서 path length가 O(1)인 반면에, Convolution의 kernel의 크기가 n보다 작을 경우, 입출력의 모든 위치를 직접 연결하지 못합니다. 즉, 특정 위치를 연결하기 위해, O(n/k) 만큼의 layer가 필요합니다. Layer가 많아질수록, 두 위치 사이의 정보 전달 경로 즉 Path Lengths 는 길어지고, Long-range dependency를 학습하기 어렵습니다.

마지막으로 저자는, Self-Attention의 해석 가능성을 주장하였습니다.

각 head가 서로 다른 역할을 학습하는 것을 명확하게 관찰하였습니다. 색깔별로 나뉜 부분은 서로 다른 head임을 나타내는 것으로 각 head가 다른 관점으로 학습한 것을 확인할 수 있습니다.

예를 들어, “making”과 “since 2009”를 보는 head는 ‘시간 정보’를 참고하여 학습한 것이고, “more difficult”를 보는 head의 경우 ‘무엇을 어떻게’ 변화시키는지에 중점을 두고 학습한 것이라고 해석할 수 있습니다.

기존의 경우 hidden state에 context를 함축하는 방식이었다면, Self attention을 통해 생성된 Attention Matrix를 통해 모델이 실제 어느 token을 참고했는지 확인이 가능하다는 점에서 해석의 가능성이 있다고 볼 수 있습니다.

Experiments

결과를 알아보기 전, BLEU에 대해 간단히 알아보겠습니다.

BLEU란 번역 task에서 주로 쓰이는 평가지표입니다. 번역 task이기 때문에, 번역의 결과가 얼마나 잘 수행 되었는지 평가가 되어야 합니다. 따라서, 모델의 결과와, 사람이 직접 번역한 결과가 얼마나 유사한지 비교하며, 측정의 기준은 n-gram precision을 사용합니다.

( $p_n$ – n-gram 정밀도, $W_n$ – n-gram 가중치, BP – 너무 짧은 답변에 대한 패널티 )

Machine Translation

Table2 에서 핵심은 Transformer(base) 모델의 경우, 훨씬 더 적은 training cost로도 기존의 모델들을 능가하거나, 준하는 성능을 보였으며, Transformer(big) 모델의 경우, 기존 SOTA 대비 짧은 학습 시간에도 성능은 능가하는 것을 확인할 수 있습니다. 이는 transformer가 성능과 효율성 면에서 모두 기존 구조를 대체할 수 있음을 입증한 결과라고 할 수 있습니다.


Conclusion

마지막으로 정리해보자면, Transformer는 오롯이 attention만으로 Sequence Modeling이 가능함을 최초로 입증하였습니다. 즉 Recurrent layer 와 같은 sequential 구조가 없어도 sequence를 처리할 수 있다는 것이 가장 큰 contribution 인 것 같습니다. 또한, 단순히 성능만 입증한 것이 아닌, 효율성까지 동시에 달성함으로써, 다른 기존 구조를 대체할 수 있음을 보였습니다.

저자들은 Sequence에 국한되지 않고, Attention을 이미지, 오디오, 비디오 등에 적용하고 싶다고 future work로 남겼습니다. 이 future work대로 이후 ViT 등이 등장하며 현재 연구 방향에 큰 영향을 주었습니다.


Transformer를 읽은지 약 3개월이 지난 시점에서 다시 정리하다 보니, 디테일한 부분이 부족해서 다시 공부하는 계기가 된 것 같습니다. 다양한 논문들을 접하고, 다시 공부해보니, 쉽게 이해되는 부분들이 많았던 것 같습니다.

Transformer와 같이 한 분야의 패러다임을 바꾼 논문들을 읽을 때마다, 언젠가는 저 역시 특정 연구 분야의 발전에 의미 있는 영향을 줄 수 있는 연구를 해보고 싶다는 생각이 들었습니다. 비록 Transformer와 같은 수준은 아니더라도, 한 분야의 주축이 되는 논문을 작성하는 것이 연구자로서의 목표 중 하나가 된 것 같습니다.

첫 X-Review다 보니, 부족한 점이 많습니다. 피드백이나, 조언 댓글로 남겨주시면 적극 반영하겠습니다!

(추가로 X-Review latex 사용 방법 혹시 아시는 분께서는 알려주시면 너무 감사하겠습니다….)

읽어주셔서 감사합니다.

Author: 강 희승

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

  1. 안녕하세요 희승님 첫 리뷰 잘 읽었습니다
    먼저 엑스리뷰에서 수식은 [latex]m_a[/latex] 이렇게 작성하시면 된답니다 꿀팁 먼저 드리고 질문 남겨보겠습니다.

    1. ‘Recurrent는 O(n) 나머지는 O(1)의 시간에 수행된다’고 설명해주셨는데, 여기서 O(1)은 실제 연산 시간이나 계산량이라기보다, 병렬 연산을 가정했을 때 필요한 sequential operation의 수를 의미하는 것 같습니다. (제가 잘못 이해했다면 알려주세용) Self-Attention 자체의 계산량은 O(n^2d) 라서 sequence가 길어지면 오히려 RNN보다 부담이 커질 수도 있는데, 논문의 Table 1에서 computational complexity와 sequential operation을 구분한 이유를 조금 더 설명해주실 수 있나요?

    2. 각 head가 명사, 동사, 문장 유형 등 서로 다른 정보를 담당할 수 있다고 설명해주셨는데, 이것이 Multi-Head Attention에서 구조적으로 보장되는 성질인지, 아니면 학습 결과 일부 head에서 관찰되는 현상인가요? 여러 head가 비슷하거나 중복된 attention을 학습하는 경우도 있을까요?

    3. Attention matrix를 통해 모델이 어떤 token을 참고했는지 확인할 수 있다고 하셨는데요! 다만 attention weight가 높다는 사실이 해당 token이 최종 예측에 실제로 큰 영향을 주었다는 의미와 항상 동일한가요? Attention visualization과 모델의 판단 근거를 설명하는 interpretability를 어느 정도까지 동일하게 볼 수 있을지요?!

    1. 안녕하세요 주영님, 첫 질문과 꿀팀.. 감사합니다!!

      리뷰 작성할 때는 미처 생각해보지 못한 질문인 것 같습니다! 그럼 차례대로 답변을 드리도록 하겠습니다.

      1. 먼저 O(1)의 시간에 수행된다라는 부분은 아마 말씀하신대로, 필요한 sequential operation의 수를 의미하는 것이 맞습니다.
      Computational complexity와 Sequential Operation을 구분한 이유는 전자의 경우 이 모델이 실제 얼마나 많은 연산을 필요로하는지에 대한 정보이고, 후자의 경우 반드시 sequence 대로 수행해야하는 단계수를 의미합니다. 계산량이 많더라도, 병렬화가 잘 된다면, 학습속도는 실제로 빠를 수 있습니다. 따라서, 저자는 이를 실제로 계산해야할 양과 계산의 병렬성을 별도로 측정하기 위해 분리하여 평가한 것으로 생각됩니다.
      이어서, Self-Attention의 경우 O(n^2 *d )이고 Recurrent의 경우 O(n * d^2) 인데, 그 당시 대부분의 경우 n 즉 sequence의 길이가 embedding dimension d보다 큰 경우가 없었기 때문에 큰 문제는 되지 않았지만, 그럼에도 불구하고 말씀하신대로 n 이 커짐에 따라 성능이 감소하는 것을 방지하기 위해, 주변 r개의 token에 대해서만 attention을 수행하는 restricted self attention을 적용할 수 있다고 하였습니다.

      2. 논문에서는 Multi-head attention을 설명하면서, single head를 사용하는 것보다 Multi head를 사용하는 것이 beneficial하다는 것을 발견했다고 언급합니다. 또한, Appendix 결과에서 각 head가 명확하게 서로 다른 task를 수행하도록 학습이 될 뿐 아니라, 문장의 syntatic, semantic 구조에 따른 추론을 한다고 언급합니다. 즉, 논문에 의하면 일부 head에서 관찰되는 현상처럼 보이기는 합니다.
      하지만, multi head를 설계하고, 모델의 해석 가능성을 분석한 것을 보아, 저자들이 위와 같은 의도로 설계 했을 것 같기도 합니다.! (이부분은 명확하지 않습니다..!)

      3. 제가 Attention Matrix를 통해 모델이 어떤 token을 참고했는지 확인할 수 있다고 한 부분 비약이 조금 있는 것 같습니다! Attention Matrix는 각 토큰들이 다른 token들과의 관계를 나타내는 reprensentation이라고 저는 이해했습니다. 즉, 모델이 보는 token이 아닌 token이 보는 token들이인 것입니다. Transformer의 모델 내에서도 Attention 만 수행하지 않고 FFN을 통해, 비선형 연산을추가하여, 풍부한 rerpesentation을 만들어 최종 예측을 하는 것이 그 이유인 것 같습니다.
      하지만, Attention matrix도 학습의 결과이기 때문에, 모델이 최종 예측에 간접적인 영향을 주었을 것이라고 생각됩니다. 따라서 Attention Visualization이 Interpretability의 일부라고 볼 수는 있을 것 같습니다.

      감사합니다!

  2. 안녕하세요 희승님. 리뷰 잘 읽었습니다.
    Positional Encoding에서 “학습 시 사용했던 sequence의 길이보다 더 긴 sequence에 대해 inference를 수행할 때, sinusoid의 주기성을 활용하여, 외삽이 가능하다” 라고 하셨는데, 이 부분이 잘 이해가 되질 않아서요. 주기성을 가지는 것과 외삽이 가능한 구조의 관계가 궁금합니다.

    1. 안녕하세요, 성민님 질문 감사합니다.

      해당 부분 설명이 조금 부족했던 것 같습니다.

      우선 외삽 자체가 가능한 이유는 Positional Encoding이 고정된 길이만큼의 embedding이 존재하는 것이 아닌 수식적으로 정의되어 있기 때문에 가능합니다. 예를 들어, 1000까지의 Position만 학습하였다면, 1001의 Embedding은 존재하지 않지만, sinusoind의 경우 sin, cos함수의 pos에 값을 대입하여 position embeding 얻을 수 있습니다.
      다만, 외삽을 설명하면서 제가 주기성을 언급했던 이유는, 학습 시 보지 못한 position에서도 기존의 패턴을 유지하면서 embedding을 수행할 수 있기 때문입니다.

      감사합니다.

  3. 안녕하세요 희승님, 첫 엑스리뷰 수고하셨습니다! 질문이 두 가지 정도 있는데,
    1) “Encoder에서, input에 대해 관계를 학습하고, Decoder에서 출력을 위한 output(target) 간의 관계를 학습하는 Self-Attention을 수행합니다”라고 언급하셨는데, self attention 연산이 파라미터를 조정한다는 의미의 학습을 하는 연산이라는 의미인가요?
    2) 아키텍처 설명이 모델 학습에 초점이 맞춰져 있는 것으로 보이는데, 추론 때는 어떤 점이 달라지고 어떻게 진행되는 지 간단하게 설명해주실 주 있으신가요?

Leave a Reply