인공지능 AI/자연어처리

[논문리뷰] Transformer_Attention is all you need(NIPS 2017)

기존의 RNN과 CNN 아키텍처의 단점들을 보완하여 등장한 새로운 혜성 같은 모델, Attention

Sequential한 특징을 가지는 Recurrent 모델들과 다르게 병렬 처리가 가능하다.

모델 아키텍처

Encoder와 Decoder로 이루어져있다.

Encoder

레이어(층)끼리 임베딩 sub-layer 등 모든 차원을 512로 통일.

Stage1_out = Embedding512 + TokenPositionEncoding512 #w2v결과 + pos정보
Stage2_out = layer_normalization(multihead_attention(Stage1_out) + Stage1_out)
Stage3_out = layer_normalization(FFN(Stage2_out) + Stage2_out)
out_enc = Stage3_out

Decoder

Stage1_out = OutputEmbedding512 + TokenPositionEncoding512
Stage2_Mask = masked_multihead_attention(Stage1_out)
Stage2_Norm1 = layer_normalization(Stage2_Mask) + Stage1_out
Stage2_Multi = multihead_attention(Stage2_Norm1 + out_enc) + Stage2_Norm1
Stage2_Norm2 = layer_normalization(Stage2_Multi) + Stage2_Multi
Stage3_FNN = FNN(Stage2_Norm2)
Stage3_Norm = layer_normalization(Stage3_FNN) + Stage2_Norm2
out_dec = Stage3_Norm

위의 아키텍처를 코드로 이해하기 쉽게 설명 (출처: https://dalpo0814.tistory.com/49)

Attention의 기본 개념은 encoder에서 output 단어를 예측하는 매 시점마다, encoder에서 전체 input 문장을 다시 참고한다는 것.

Scaled Dot-Product Attention

Q와 K를 dot products라 하고, 각 숫자들 값의 차이를 더 확실히 보기 위해

로 나눈다(scaling). 그리고 softmax함수로 value에 대한 가중치를 얻는다.

(I, am, a, dog 각각에 가중치(도움되는정도)를 넣음)

즉, Q와 K에 맞게 V에 attention을 주는 것. (=Attention Value)

Masking: 전체 정보를 한번에 넣는게 아니라, 예측 성능을 높이기 위해 데이터 정보들(Attention Value)을 일부 숨긴다.

Q(Query) vector: decoder previous layer의 hidden state

K(Key)-V(Value) Pair: encoder의 output state

# 파이썬의 딕셔너리 자료형을 선언
# 키(Key) : 값(value)의 형식으로 키와 값의 쌍(Pair)을 선언한다.
dict = {"2017" : "Transformer", "2018" : "BERT"}
print(dict["2017"])#2017이라는 키에 해당되는 값을 출력
Transformer

MultiHead Attention

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d752c564-e194-4e41-9a4a-50291045f557/multihead.jpg

Q, K, V를 따로 attention 수식 수행하는 것보다, 각각 차원에 대해 학습된 Q, K, V linear를 h번 학습하는 게 더 성능이 좋다.

벡터크기가 줄고, 병렬처리가 가능하기 때문이다.

각각 head(Q, K, V)를 h로 나눈 값들의 attention을 구해 concat한다.

Position-wise Feed-Forward Networks

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/46ec15cb-0772-429b-9dd7-a077a7fbc803/Position-wise_Feed-Forward_Networks.jpg

encoder와 decoder의 각 층은 fully connected feed-forward network를 가진다.

Why Self-Attention

  1. 레이어당 전체 연산량 감소
  2. 병렬화 가능한 연산 증가
  3. Long-range의 term들의 dependency도 잘 학습 가능하게 됨
  4. Attention 통해 모델 자체의 동작을 해석하기 쉬워짐

기존의 모델 RNN은 영향을 미친 단어를 찾기 위해 매번 정보탐색을 요함.

하지만 이와 다르게, Transformer는 input은 sequential하지 않고 matrix 통째로 들어가서 attention연산이 이미 이루어져있기 때문에, 초기 연산 한번으로 global dependency 찾을 수 있다. O(1)

Positional Encoding

순차적 정보가 없는 Transformer를 위해 임의로 단어들의 순서에 대한 위치정보를 넣기 위함.