Introduction to Transformer
현재까지 강의를 수강하면서 RNN에서 LSTM과 다른 RNN variant들을 공부하면서 자연어처리에 사용되는 뉴럴모델의 변화를 확인하였다. 긴 문장에 대한 문제와 gradient vanishing 문제를 해결하기 위해 등장한 attention 매커니즘은 LSTM의 성능을 다시 한번 향상시켰고, 'Attention is all you need' 논문의 등장과 함께 attention만을 사용하는 Transformer 모델이 자연어처리 분야를 지배하는 시대가 시작되었다.
Transformer 모델은 기존의 seq2seq 모델과 같이 encoder, decoder로 구성되어 있지만 그 내부 구조는 모두 fully connected 레이어들과 attention mechanism으로 구성되어 있다. 각 인코더, 디코더는 다시 여러 레이어로 구성되어 있으며, 마지막 인코더 레이어의 아웃풋을 디코더의 각 레이어에서 사용하게 된다.
인코더의 각 레이어를 더 자세히 살펴보면, 연속된 self-attention layer와 fully connected layer로 구성되어 있는 것을 확인할 수 있다.
디코더 또한 각 레이어가 self-attention layer와 fully connected layer로 구성되어 있으나, 다른 점은 인코더의 결과물을 고려하는 encoder-decoder attention layer가 두 레이어 사이에 추가되었다는 점이다.
Closer look
여기서부터는 Transformer 모델이 주어진 문장을 어떻게 처리하는지에 대해 자세히 살펴본다. 예제에서는 단어 3개로 이루어진 문장이 주어지고, 각 단어들은 512차원의 벡터로 인코딩되어 인코더의 입력으로 주어지게 된다.
인코더의 각 레이어를 통과하는 단어 벡터들은 동시에 병렬로 처리되고, 동일한 차원을 유지한다.
Self-attention 매커니즘은 각 단어의 처리에 주어진 문장의 모든 단어에 대해서 attention mechanism을 적용하는 방식을 뜻한다.
Self-attention 매커니즘은 Q(query), K(key), V(value) 벡터를 사용해 각 벡터를 처리하게 되는데, 따라서 Q, K, V 벡터를 구하기 위한 파라미터 행렬이 각각 존재하게 된다.
각 단어에 대해 Q,K,V 벡터가 구해지면 Q와 K 벡터의 dot product, softmax를 통해 기존 attention 매커니즘과 같이 모든 단어들을 참조하고, 총합이 1인 attention score들을 미리 구해놓은 V 벡터와 곱해 self-attention 레이어의 결과물을 구하게 된다. 위 그림에서 8로 dot product의 결과값을 나누어주는 것은 수치적 안정성을 위해서라고 한다. 또 위 그림은 각 단어에 대한 벡터 단위의 self-attention 연산을 설명하고 있는데 이는 행렬로써 동시에 병렬연산을 거치게 된다.
여기까지 설명한 self-attention은 하나의 head에서 이루어졌고, 여러 attention 방식을 동시에 고려하기 위해 이러한 head를 여러 개 사용하는 multi-head self-attention 방식을 Transformer 모델은 채택하였다.
위 그림과 같이 각 head들에 대해 이전에 설명한 self-attention 연산을 하게 되고, 각 head의 아웃풋 벡터는 합쳐져 (concatenate) 또 다른 파라미터 행렬과 곱해져 입력 문장의 벡터와 동일한 크기의 벡터를 multi-head self-attention 레이어의 결과물로 출력하게 된다.
Multi-head self-attention의 attention score를 시각화해보면 위 그림과 같은데, 각 attention head마다 동일한 단어의 경우에도 문장의 여러 단어를 참조하는(attend) 정도가 다르게 나타나는 것을 확인할 수 있다.
Positional Encoding
이러한 self-attention 방식은 모든 단어를 병렬로 처리할 수 있는 장점이 있지만, 입력 문장에서 각 단어의 위치 정보가 고려되지 않는 문제점이 있었고 Transformer 모델에서는 positional encoding을 통해 각 단어에 위치 정보를 추가해줌으로써 이 문제를 해결하였다.
위치 정보는 positional encoding(embedding)으로써 각 단어의 임베딩에 더해져 인코더에 입력되는데, 512개의 위치에 대해 고유한 값을 더해주기 위해 사인함수를 사용하지만 여기서는 자세히 설명하지 않는다.
Residual Connection
추가로 각 레이어의 사이마다는 residual connection과 layernorm이 존재한다. 즉, self-attention, fully connected layer의 input이 각 레이어의 결과물에 그대로 더해지고 normalize되는 방식을 의미하고, 깊은 (deep) 모델에서도 안정적인 학습을 할 수 있도록 돕는 기능을 한다.
Decoder side
여기서부터는 디코더의 각 레이어의 구조를 설명하는데, 인코더의 각 레이어와 encoder-decoder attention layer가 추가된 것 이외에는 모두 같은 구조를 가지고 있다.
각 단어를 디코딩하는 step마다 동일한 연산이 수행되는데, 이 때 인코더의 마지막 레이어의 결과물 벡터를 사용한다. 더 구체적으로는, 인코더의 마지막 레이어의 K(key), V(value) 벡터를 가져와 디코더에서 계산된 Q(query) 벡터와 attention 연산을 통해 디코딩을 진행한다.
디코더의 모든 레이어를 거친 결과물 벡터는 단어를 출력하기 위해 추가로 fully connected layer와 softmax layer를 통과하여 전체 vocabulary에 대한 확률을 구하게 되고, 가장 높은 확률을 갖는 단어를 해당 decoding step의 결과물로 출력하게 된다.
기존 translation task에서 사용하는 cross entropy loss function을 그대로 사용하며, 디코더의 label은 원-핫 인코딩으로 주어지게 된다.
모델은 각 decoding step에서 출력되어야하는 단어에 대한 확률이 모든 단어들에 대해서 가장 높게 학습된다.
'Lecture > (2021-1) Deep learning for NLP' 카테고리의 다른 글
[Week 14] Deep Pretrained Language Models (0) | 2021.06.11 |
---|---|
[Week 9] Machine Reading Comprehension with Attention (0) | 2021.06.11 |
[Week 7] Sequence to sequence and attention mechanism (0) | 2021.05.25 |
[Week 4] Recurrent Neural Network (0) | 2021.05.24 |
[Week 3] Word embeddings (0) | 2021.05.13 |