오늘 소개해 드릴 논문은 구글의 명작 “Attention is all you need” 입니다.
콥스랩(COBS LAB)에서는 주요 논문 및 최신 논문을 지속적으로 소개해드리고 있습니다.
해당 내용은 유투브 ‘딥러닝 논문읽기 모임’ 중 ‘Attention all you need’ 스크립트 내용을 편집한 내용이며,
영상으로도 확인 하실 수 있습니다. (영상링크: https://youtu.be/EyXehqvkfF0)
이번에 소개할 논문은 2017년도에 나온 ‘Attention all you need’ 로 google scholar citation이 2022.04.22일 기준 40357건일 정도로 여전히 핫한 논문입니다. 전체적인 내용은, 모델 아키텍처에 조금 더 포인트를 맞추었습니다.
‘Transformer’ 이전에는 sequence to sequence한 문제를 해결하는데 Encoder-Decoder 구조의 RNN 모델들이 좋은 성능을 냈습니다.
하지만 RNN의 경우, 순차적인 특성이 유지되나 정보간 거리에 따른 제약 (Long term dependency)의 문제를 지닙니다. 또한, 순차적인 특성 때문에 병렬처리를 할 수 없고, 계산속도가 느리다는 단점을 가지고 있습니다.
어텐션 모델 같은 경우에는 일반적으로는 좌측에 있는 모델입니다. 쉽게 생각해, 주의를 준다고 생각을 하면 될 것 같습니다. 그런데 여기서는 조금 다른 점이 self attention이라는 것을 이용했는데요. 이건 attention 자체가 데이터 간 거리로 인해 손실되는 정보를 보완하기 위해 나온 것인데, 임팩트를 줄 때 조금 더 시계열 데이터 내에서 각 원소가 다른 원소들과 어떻게 관련이 되어 있는지를 살펴보는 방법을 이용한 것입니다.
앞으로 소개해 드릴, Transformer 는 attention만을 이용한 모델입니다. 그렇기 때문에 연산량이 매우 줄고 성능도 상당히 높은 것으로 알려져 있습니다.
모델 아키텍처에 대해 설명드리겠습니다. 좌측에 그림은 일반적으로 논문에서 이야기하고 있는 아키텍처입니다.
우측에 그림은 아키텍처 내부의 서브 레이어에 들어가는 내용입니다. 이에 대해서는 아래에서 순차적으로 설명하도록 하겠습니다.
전체 아키텍처를 왼쪽 그림으로 간략하게 설명을 하면, Transformer는 Encoder와 Decoder로 구성되어 있습니다. 여기서 input의 경우에는 x로 표현했고, Encoder의 output은 z 그리고 Decoder output y로 표현되어있습니다.
오른쪽 그림에서 ‘I like a cat’ 라는 input을 예시문으로 들겠습니다. 여기에서는 Byte-pair Encoding을 해서 특징을 컴퓨터가 계산할 수 있게 만들었다고 할 수 있을 것 같습니다. 그리고 이것은 Input Embedding을 거치게 되고, 이때의 dimension은 512로 계속 고정이 될 것입니다. 그리고 Input Embedding의 경우에는 Positional Encoding과 concatenation이 됩니다. 이 Positional Encoding의 경우에는 예전에는 one-hot encoding을 이용해서 바이너리로 한 반면에, Transformer에서는 더 위치 간 정보를 강조했다고 할 수 있을 것 같습니다.
Encoder는 일단 총 6개의 레이어로 구성되어 있습니다. 그리고 모든 레이어는 같은 서브 레이어를 갖고 있습니다. 먼저 서브 레이어에는 총 두 개의 레이어를 지니고 있습니다. 그리고 그전에 앞서서 이때 Encoder의 input과 output은 512 dimension을 가지고, 이것은 이후에 디코더에 사용되는 일부 key라든가 value 때문에 512로 지정이 되어 있습니다. 먼저 왼쪽 그림의 Multi-Head Attention부터 보겠습니다.
Multi-Head Attention 부분이 Transformer에서 핵심적인 부분이라고 볼 수 있습니다. 먼저 Scaled Dot-Product Attention에 대해서 살펴보도록 하겠습니다. 앞에서 보셨던 임베딩을 통해서 Q, K, V 세 가지를 얻게 됩니다. 여기에서는 각각의 K와 V의 dimension은 64가 되고 그 이유는 h(head)가 총 8개로 구성되어 있기 때문입니다. 중간 그림의 MatMul은 Dot-Product를 진행하는 것으로 볼 수 있습니다.
오른쪽 그림은, Q와 K를 Dot-Product에 대한 설명입니다.
예를 들어서 query에 I라는 단어가 있으면 이것과 이제 K에서 얼마나 서로 연관성이 있는지를 나타내기 위한 것입니다. 이 부분은 correlation과 유사하다고 생각됩니다. 조금 더 쉽게 생각하자면, 같은 단어인 경우 조금 더 높은 값을 지닌다고 이해해볼 수 있습니다.
그리고 그림에 attention score를 scale 하는 부분이 나와 있는데요. scale 한 이유는 Dot-Product가 너무 크게 될 경우에는 나중에 그래디언트 문제가 생길 수 있기 때문입니다. 여기서 softmax를 이용해서 어떤 단어가 얼마나 큰 연관성을 지니는지를 확률적으로 알 수 있는 수식이라 볼 수 있습니다.
이렇게 산출된 값을 V와 곱해서, 각각이 얼마나 영향을 서로 주고 있는지, 얼마나 큰 값을 지니는지 혹은 작은 영향을 가지는지를 알 수 있습니다. 이후에 나온 값이 총 8개이고, 이것이 concat이 되고, linear를 거치면서 하나의 layer가 완성됩니다.
다시 encoder architecture로 돌아와서, 앞 과정에서 Multi-Head Attetion에서 나온 값은, Add&Norm에 들어가게 됩니다.
Add&Norm 부분은 왼쪽 구조와 오른쪽 부연설명에서 확인해보시면 좋을 것 같습니다.
왼쪽 그림의 구조에서 확인하실 수 있는 Add는 adding residual connection이고, 이전에 있던 값을 같이 더해주는 겁니다. 이 과정을 진행하는 이유는, 위치 정보가 이후에 손실되는 것을 방지하기 위한 것입니다.
왼쪽 그림의 Norm 부분에서는 x가 이전 레이어에서 multi head attention을 거친 것과 그렇지 않은 것을 normalization을 진행한 것입니다.
그 이후에 해당 값은 Feed Forward를 거치게 됩니다. 여기에서는 ReLU function과 두 개의 linear function을 사용했습니다.
마지막에 Encoder의 마지막 부분에서 dimension은 총 512가 됩니다.
위 예시는 인코더 파트의 다섯 번째나 여섯 번째 레이어를 나타낸 것이라 볼 수 있습니다. 왼쪽에서는 it’s가 law와 application에 더 어텐션을 하고 있다라고 볼 수 있습니다.
위 그림은, Encoder의 예시로 visualization을 한 것입니다. 각각의 사각형은 헤드라고 생각을 하시면 될 것 같습니다. 그래서 여기서 총 여덟 개의 헤드가 있고, 위 그림에서 making이 more와 difficult 단어와 다른 단어보다 더 연관성이 있다고 볼 수 있습니다.
다음으로, decoder 부분을 살펴보겠습니다. Encoder 파트에서 나왔던 값들 중에 key와 value를 사용해서, 중간에 multi head attention에 넣을 것인데요. 디코더에서의 multi head attention 첫 번째 레이어가 인코더와 다른 점은 mask를 사용한 것입니다. mask를 사용한 이유는 position 때문입니다. 옆에 있는 단어가 아닌 단어들에 거의 마이너스 무한대의 값을 주어서, 연관성이 있는 값들만 뽑아내기 위해서 마스크를 사용한 것으로 보입니다.
그리고 여기서 나오는 quary를 이용하고, 인코더에서 나온 key와 value를 이용해서, 다시 multi head attention을 진행하게 됩니다. 이후의 과정은 encoder와 거의 동일합니다.
마지막 과정에서는 linear와 softmax를 거쳐 output probabilities가 나옵니다. 그리고 모든 input과 output의 값은 512로 동일하게 될 것이고, 그 이유는 인코더에서 사용되는 key와 value 값 때문이라고 할 수 있습니다.
다음으로, self attention을 사용하는 이유에 대해 살펴보겠습니다. 그 이유 중 첫째로, 레이어당 전체 연산량이 줄어듭니다. 그림의 layer type으로 확인해보시면, self attention이 가장 낮은 그 연산량을 보이는 것을 확인하실 수 있습니다. 두 번째로, 병렬화가 가능한 연산이 늘어난다고 할 수 있습니다. 세 번째로, long-range의 term들의 dependency도 잘 학습할 수 있게 됩니다. 마지막으로, Attention을 사용하면 모델 자체의 동작을 해석하기가 쉬워집니다.
위 자료는, training때 사용한 데이터를 설명한 것입니다. 여기서는 English-French dataset을 이용하였고, 또한 English-German dataset을 사용하였습니다.
하드웨어는 위와 같고, optimizer는 Adam을 사용했으며 regularization은 residual dropout을 이용해서, 랜덤 하게 sub layer를 select 했다고 할 수 있고, Label smoothing을 통해서, 정확하지 않은 input일 수 있지만, accuracy는 조금 더 높일 수 있습니다.
결과적으로, machine translation 파트를 봤을 때, 여기서 bleu라는 성능 지표를 통해서, Transformer가 비교적 높은 score라는 것을 확인할 수 있습니다.
또한 Training Cost도 다른 방법들에 비해서 낮은 것을 확인할 수 있습니다.
Model Variation은, base와 비교했을 때, (B)는 key dimension을 변경한 것입니다. 어텐션 key의 size가 모델에 어떻게 미치느냐를 확인한 것이고, 여기서는 dot product가 필요하고, 성능을 향상할 수 있다는 것을 보여줍니다. (C)는 모델 크기에 따른 영향을 알 수 있습니다. 그래서 256과 1024 비교를 한 것을 확인할 수 있습니다. (D)는 dropout의 유무에 따른 성능 차이도 확인할 수 있습니다. (E)에서는 sinusoid 대신에 positional embedding을 사용했고, 결과적으로 베이스와 유사한 결과가 나오는 것을 확인할 수 있습니다.
결론적으로 Transformer는 recurrent, convolution을 사용하지 않고, attention만 사용한 모델입니다. 또한, 다른 모델들보다 훨씬 빠른 학습 속도와 좋은 성능을 지닙니다. 마지막으로, 번역뿐만 아니라 이미지 등 큰 입력을 갖는 분야에도 적용될 것이 기대된다는 것입니다.
댓글