Attention is All you Need

Attention is All you Need

Ashish Vaswani et al.(2017)

.​
.

총평

  • 이 논문은 기존 affine transfomation 방식의 어텐션이 두 벡터 사이의 “연관성”에 관련해서 어떤 방식으로 작동하는지 잘 와닿지 않았었는데, 기존의 dot product 방식을 개선하여 좋은 퍼포먼스를 냈다는 점에서 감동받았다.
    .
  • 기존의 RNN/CNN 방식을 과감히 포기하고 FNN과 Skip Connection 기반의 모듈을 N개 쌓아서 LSTM, GRU 같은 아키텍처 없이도 long-term dependency를 해결한 새로운 인코더, 디코더 방식이라는 점이 주목할 만하다.
    .
    .
    .

abstract

기본적인 시퀀스 모델은 인코더와 디코더를 포함하는 리커런트 또는 컨볼루셔널 뉴럴 네트워크를 토대로 한다. 또한, 최고의 성능을 발휘하는 모델은 “어텐션 메커니즘”“을 통해 인코더와 디코더를 연결하고 있다. 여기서는 리커런트, 컨볼루셔널 네트워크를 완전히 배제하고 어텐션 메커니즘에만 기반한 새롭고 단순한 네트워크 아키텍처인 transformer를 제안한다.
기계 번역에 대한 실험에서 이 모델들은 질적으로도 훌륭한 동시에 병렬화와 학습 시간 단축의 이점도 함께 얻었다. 각종 WMT 2014 대회에서 최고의 기록을 보유하였다.
​.
.

motivation(Google Research Blog 참고)


“I arrived at the bank after crossing the…”

이런 문장에서 “bank”의 가장 적합한 의미와 적절한 표현을 학습하려면, 문장이 “..road”로 끝나는지, 아니면 “..river”로 끝나는지를 알아야 한다. (bank는 강둑이라는 의미와 은행이라는 의미를 둘 다 가지고 있음)
RNN은 물론 순차적으로 언어를 처리하는 과정에서 서로 멀리있는 단어에 의존하는 의사 결정을 내리지만, 리커런트 네트워크가 이러한 결정을 내리기까지 요구되는 타임 스텝의 수가 늘어날 수록(서로 멀리 떨어져 있을 수록) 어떻게 결정을 내리느냐 하는 문제는 더욱 어려워진다는 것이 밝혀져 있다.
또, 이러한 순차적 특성 때문에 TPU/GPU와 같은 최신 고속 컴퓨팅 장치를 최대한 활용하는 것이 어려울 수 밖에 없다.
참고적으로 CNN을 이용한 최신 언어 모델 아키텍쳐에서조차, 거리가 먼 부분의 정보들을 결합하는데 필요한 단계가, 그 거리가 멀어질수록 증가한다.

이와는 대조적으로 Transformer는 이보다 훨씬 작은 상수의 스텝만을 가진다.(이라는 뜻) 각각의 스텝에서 self-attention 메커니즘은 문장의 모든 단어에 대해서 직접적인 관계를 모델링하며, 이 때는 각각의 개별 포지션과는 무관하다. 즉 “bank”의 의미를 식별하기 위해서 Transforer의 경우 “river”라는 단어를 ★즉각적으로★ 참고하는 방법을 배울 수 있으며, 단일 스텝 내에서 이 결정을 하게 된다.

특징으로는, 인코더에서부터 셀프 어텐션 메커니즘이 활용되며, “I arrived at the bank after crossing the river” 이라는 위 문장에서 “bank”라는 단어의 representation을 결정할 때, “river”는 높은 가중치를 부여받아 가중 평균 될 수 있다는 것이다.

아래 그림을 보면 윗 문장과 아래 문장에서 it이 가리키는 단어가 서로 다르지만, 셀프 어텐션 메커니즘을 통해서 각각 ‘animal’과 ‘street’ 에 적절히 더 가중치를 주고 있다는 것을 알 수 있다.(진한 푸른색으로 표기됨)
.

Alt text

intro


리커런트 네트워크는 본질적으로 이전 스텝의 결과물이 다음 스텝의 argument가 되는 “순차적인” 특성이 있기 때문에, 학습 시 병렬 처리가 불가능하다는 단점이 있다. 어텐션 메커니즘 역시 몇몇 경우를 제외하고는 리커런트 네트워크와 같이 사용되고 있다.
리커런트 네트워크의 한계를 피하면서, 입력과 출력 사이의 전역적인 종속성을 이끌어내기 위해, 우리는 Transformer를 제안한다.
​.
.

Model Architecture

Alt text
.
.

○ Encoder :

모델에서 처리하는 모든 기본 차원 d_model = 512이라고 가정하였다
​이를 코드로 나타내면 다음과 같다. (논문보다 코드가 더 이해하기가 쉽다 ㅡㅡ;;;)

첫째 줄은 입력 시퀀스를 적절히 512차원으로 임베딩하고, 뒤에서 소개할 position 임베딩을 통해 입력 시퀀스 각각의 position(= RNN의 케이스에서는 time step)에 대한 정보를 전달한다.
역시 뒤에서 소개할 멀티헤드 어텐션을 사용하였으며 Residual Net의 skip connection 아이디어가 차용되었음을 확인할 수 있다.

1.Stage1_out = Embedding512 + TokenPositionEncoding512 #w2v결과 + pos정보
2.Stage2_out = layer_normalization(multihead_attention(Stage1_out) + Stage1_out)
3.Stage3_out = layer_normalization(FFN(Stage2_out) + Stage2_out)
4.
5.out_enc = Stage3_out

.
.

○ decoder :

물론 인풋 시퀀스의 초기화는 encoder의 출력으로 하고, input-feeding을 위해 디코더의 최종 출력이 다시 입력으로 들어간다. 아래 코드와 블로그 애니메이션을 보면 더 잘 이해할 수 있다.

1.Stage1_out = OutputEmbedding512 + TokenPositionEncoding512
2.
3.# i보다 작은 위치의 시퀀스 요소에 대해서만 어텐션 메커니즘이 동작할 수 있도록 마스킹한 어텐션
4.Stage2_Mask = masked_multihead_attention(Stage1_out)
5.Stage2_Norm1 = layer_normalization(Stage2_Mask) + Stage1_out
6.Stage2_Multi = multihead_attention(Stage2_Norm1 + out_enc) + Stage2_Norm1
7.Stage2_Norm2 = layer_normalization(Stage2_Multi) + Stage2_Multi
8.
9.Stage3_FNN = FNN(Stage2_Norm2)
10.Stage3_Norm = layer_normalization(Stage3_FNN) + Stage2_Norm2
11.
12.out_dec = Stage3_Norm
13.

​.
.
○블로그 애니메이션 참고.
https://research.googleblog.com/2017/08/transformer-novel-neural-network.html