[Deep Learning] Recurrent Neural Network (4) - Transformer

2023. 5. 20. 13:01
🧑🏻‍💻용어 정리
Neural Networks
Recurrent Neural Network
LSTM
Attention

 

https://arxiv.org/abs/1706.03762

 

Attention Is All You Need

The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder and decoder through an attention mechanism. We propose a new

arxiv.org

 

 

Transformer

 

 

이제는 Attention만 가지고, 순환 구조 없이 다루겠다는 논문이 등장했습니다.

 

Attention 안에서 서로의 연결관계를 찾는 방법을 도입하니 굳이 순환 구조를 가져갈 필요가 없게 됩니다.

 

 

여기서 self-attention과 Transformer가 나왔습니다.

 

그리고 이것이 발전하여 BERT, GPT가 등장합니다.

 

 

위 수식을 먼저 봅시다.

 

이것은 이전에 attention에서 본, 유사도, weight, context로 표현됩니다.

 

이 context 자체가 Attention이라고 보겠습니다.

 

이 수식에서도 유사도가 존재합니다.

 

softmax 괄호 안에 있는 값은 Q와 K의 유사도를 고려한 것입니다.

 

위 Attention 구조만 썼을 때는 additive 유사도를 계산하였지만, 이 수식은 dot product 유사도를 계산합니다.

 

내적이죠.

 

그리고 d k의 root 값으로 나눠서, scale에 따라 값이 너무 커지는 경우를 대비하여 모델이 stable하게 돕습니다.

 

이 d k는 dimension으로 나누어 unit vector화 시킵니다.

 

그래서 이 부분을 scaled dot product라고 합니다.

 

 

그래서 위 softmax 부분은 당연히 weight가 됩니다.

 

이 weight에 또 다른 matrix V를 계산해서 나가는 것이 Attention입니다.

 

결국 Weighted V라고 볼 수 있고, 이 weight는 Q와 K의 유사도에 기반한 weight입니다.

 

 

이 Q인 Query는 Decoder에서의 target이 되는 hidden state라고 바꿔 생각할 수 있습니다.

 

그래서 Key인 K는 encoder에서 모든 state가 key 후보가 됩니다.

 

여기서 유사도가 다 곱해져서 나가니, Key와 Value는 같은 값을 의미합니다.

 

 

이것을 이제 전체 state에 대해 생각해보겠습니다.

 

 

원래는 Encoder의 Attention 값을 계산하여 Decoder의 예측에 도움을 줬다면,

 

이번에는 Encoder와 Encoder 사이의 Attention을 구합니다.

 

Encoder도 sequence를 vector화만 해서 넣지 말고 입력들 사이의 유사도를 matrix로 만들어서 입력으로 넣으면 좋지 않을까하는 생각을 하게 됩니다.

 

i am a student 에서,

 

이 단어들이 독립적인 입력이 되는 것이 아니라, 순환으로 묶는 것이 아니라, 어떤 단어와 어떤 단어가 관련 있다는 것을 matrix화 해서 표현하면 더 좋겠다는 것입니다.

 

 

또는 Decoder와 Decoder 사이의 유사도를 봅니다.

 

그것을 통해 예측 값들 사이의 유사도를 살핍니다.

 

 

그리고 앞처럼 Encoder와 Decoder 사이의 유사도 입니다.

 

이렇게 3가지 경우의 수가 존재합니다.

 

이러한 것들을 조금 더 고려하여, 일반화해서 생각해 본다면,

 

Query 자체도 가능한 hidden state가 될 수 있습니다.

 

그리고 Key와 Value 또한 그렇습니다.

 

그러니, scaled dot product attention을 하는데,

 

Q와 K가 Matmul과 scale을 하는 것이 softmax 괄호 안에 있는 식에 해당합니다.

 

그리고, mask는 optional입니다.

 

softmax를 그 다음으로 해줍니다.

 

그리고 V가 들어가서 matmul을 합니다.

 

 

이것을 통해,

 

Encoder-Decoder 뿐만 아니라, Encoder-Encoder, Decoder-Decoder 끼리도 생각해볼만 하다는 것을 알게 되었습니다.

 

 

이 scaled dot-product를 한 번만 하는 것이 아닌,

 

Multi-head attention을 사용하여 parrallel하게 여러 번 해줍니다.

 

이것은 sequential하게 여러 번이 아닌, parrallel하게 여러 번입니다.

 

일단 이 논문에서는 위와 같이 input word들을 vector로 표현하는 데, 512차원으로 표현합니다.

 

예를 들어, 어떤 sequence가 512 차원이 있다고 합시다.

 

그렇다면 이 것을, 64차원씩 8개로 Attention을 진행하는 것이, 병렬적으로 Attention을 시켜주는 것이 훨씬 유리하다고 알려졌습니다.

 

이렇게 큰 512 차원의 word embedding에 대해 한 번에 Attention하지 말고, linear mapping을 통해서 차원을 줄인 다음에 그것을 병렬적으로 Attention하는 것이 유리할 것입니다.

 

그것이 이 Multi-head Attention입니다.

 

 

 

그래서 위 수식과 같이 512를 8개로 projection합니다.

 

이 projection은 새로운 trainable parameter를 통해서 합니다.

 

 

 

여기서 Q, K, V는 전부 512차원입니다.

 

이것을 그대로 넣으면 너무 크니 이것을 줄입니다.

 

512 차원을 64 차원으로 줄입니다.

 

이것이 Linear Mapping입니다.

 

 

512 차원을 64 차원으로 줄였으니, 정보량도 1/8 정도 줄었습니다.

 

이것을 보정해주기 위해서 h 가 8로,

 

8개의 head를 두어 parellel하게 8번의 Attention을 진행합니다.

 

그래서 위 수식에서는 Attention이 8번 적용되어 각각의 결과 head_1 ~ head_h를 가집니다.

 

이것 각각도 64차원으로 h인 8개 만큼 나옵니다.

 

이것을 concatenate를 통해 쭉 붙여줍니다.

 

 

그리고 마지막에 Linear transformation 후 output을 뱉어냅니다.

 

 

 

 

 

 

여기 이러한 단어가 있다고 합시다.

 

각 단어를 512 차원으로 mapping하면 위와 같이 나옵니다.

 

 이것을 8개로 나누어 parellel하게 mapping합니다.

 

이 64 차원으로 mapping된 것이 Q, K, V 중 다 될 수 있습니다.

 

 

그래서 이 값들 중 Q_1 ~ Q_h, K_1 ~ K_h, V_1 ~ V_h가 다 나옵니다.

 

그래서 각각을 scaled dot product를 통해서 attention까지 가면,

 

Attention_1 ~ Attention_h까지의 결과가 나오게 됩니다.

 

 

이 Attention은 결국 softmax() x V입니다.

 

softmax는 scalar 값들이 vector화 되어 들어간 것이구요.

 

그래서 결과가 V의 dimension과 똑같이 나옵니다.

 

 

그래서 Attention결과를 concatenate합니다.

 

위와 같이 Attention_1 ~ Attention_h까지를 왼쪽에서 오른쪽으로 차례로 이어 붙입니다.

 

 

그리고 최종적으로 W_o를 통해서 linear transformation을 거쳐 똑같은 size로 뱉어냅니다.

 

이것이 multi-head attention의 결과입니다.

 

 

이것은 encoder일 수도 있고 decoder일 수도 있고 서로 교차될 수도 있지만,

 

word들이 있으면, 이 word들의 각각의 관계성으로 표현된 matrix가 출력되게 됩니다.

 

 

그래서 이 transformer 구조를 봅시다.

 

모든 게 다 parallelized calculation입니다.

 

RNN은 순환되며 sequential한 구조를 보입니다. RNN은 이전 시점이 들어가야 다음 시점이 들어갈 수 있는 것이지요.

 

그런데 Transformer의 구조는 각각의 시점이 그대로 올라가서 위에서 Attention 되고,

 

각각이 Attention이 되어 모두 들어가서 출력이 그대로 나오는 구조입니다.

 

 

즉, hidden state들 끼리 순환이 되지 않습니다.

 

여기서는 입력에 있는 sentence와 출력에 있는 sentence 들이 기다릴 필요가 없습니다.

 

그냥 parallel하게 동시에 처리가 가능합니다.

 

 

그게 Transformer 구조의 가장 큰 효율성입니다.

 

그림에서 좌측이 encoder, 우측이 decoder 부분입니다.

 

 

그리고 그림에 이 positional encoding이 있습니다.

 

우리가 순서라는 게 없이 parallel하게 처리되다 보니, 단어가 어떠한 순서였는지가 무시되는 느낌이 듭니다.

 

그래서 positional encoding을 통해서 이 단어가 어디에 있었는지 highlight를 해줍니다.

 

그래서 위와 같이 단어에 대해 embedding된 vector와 그 단어에 대한 positional encoding 값을 각각 구해 더하여 이 단어가 어디에 있었는지 조금 더 강조해준다고 보시면 되겠습니다.

 

이것은 sin 그래프를 통해서 진행합니다.

 

 

그 다음 multi-head attention을 진행합니다.

 

위 그림에는 3가지 이지만 실제로는 엄청나게 많고, 우리가 예시로 들은 512 차원에 대해 64 차원씩 8개로 본 경우에 대해서는 8개로 나뉘게 되는 것입니다.

 

그리고 돌아 들어가는 ADD & Norm 항목은 redisual network를 가르킵니다.

 

이 또한 이 attention이 길어지다 보니 앞에있는 정보를 까먹을 수 있어,

 

skip connection 을 사용하여 residual 부분을 익히라는 것이겠죠.

 

 

그래서 Add가 residual network, Norm이 layer normalization입니다.

 

layer 끼리 normalization 시켜주어 Attention 끼리 너무 큰 차이가 나지 않도록 합니다.

 

그 다음 feed forward를 통해 한 번 더 연산과정을 거칩니다.

 

입력과 출력의 dimension을 같게 맞춰주면서 말이죠.

 

그리고 또 skip connection이 존재합니다.

 

이 부분이 Encoder 입니다.

 

Encoder는 입력을 Parallel하게 받아서, 입력 사이에 self-attention을 진행합니다.

 

 

그리고 Decoder도 봅시다.

 

Decoder도 똑같이 output이 들어가서 positional encoding 해준 다음,

 

Masked multi-head attention 합니다.

 

이것도 decoder-decoder 사이의 Attention하고,

 

위 Encoder에서는 encoder-encoder 사이의 Attention입니다.

 

 

그런데, 우리가 번역을 한다고 했을 때, 그 후에 나오는 정보들을 미리 갖출 수 없습니다.

 

그래서 아래 그림처럼 Encoder에서는 단어와 sentence를 전부 다 받아들인 다음 번역을 시작하니, 그림처럼 모든 구조가 다 서로를 attention할 수 있습니다.

 

 

그런데, decoder에서는 순차적으로 번역이 되어서 나오니까 자기 전에 나온 것만 참고를 할 수 있습니다.

 

그래서 이 Masked multi-head attention이라는 것은 자기 전 시점의 것만 attention을 계산하겠다는 것입니다.

 

그리고 Decoder안에서만 attention하니 결국 Masked multi-head Decoder Self-Attention이라고 볼 수 있습니다.

 

 

그리고 그 윗부분을 보겠습니다.

 

Encoder의 정보를 받아서 Attention을 합니다.

 

그래서 위 그림의 마지막 부분에 Encoder-Decoder Attention 구조로, Encoder와 Decoder의 관계에 대해서 Attention해주는 것입니다.

 

이 부분은 우리가 앞에서 다룬 것과 같은 concept이라고 볼 수 있습니다.

 

그리고 똑같이 feed forward하고 residual 하고, 그리고 linear transformation, softmax에서 output을 계산하는 구조입니다.

 

이게 transformer 구조라고 볼 수 있습니다.

 

 

그래서 위와 같은 내부 구조를 encoder, decoder 모두 N번을 진행합니다.

 

그래서 만약, 영어 문장이 들어왔다면,

 

여기에 encoder transformer가 N번이 붙습니다.

 

그리고 한국어가 들어왓다면 decoder transformer도 N번이 붙습니다.

 

그리고 최종 출력을 하는 구조입니다.

 

 

 

이 한국어 문장이라는 것은 전 단계에서 예측된 하나만 들어올 수 있습니다.

 

그래서 전 단계 예측한 것을 하나하나 기다릴 수 없으니 mask를 해놓는 것입니다.

 

이 masked를 통해 시간적인 개념을 어느정도 반영했다고 볼 수 있습니다. Decoder-Decoder self-attention에서 말이죠.

 

 

이러한 것들을 parallel하게 처리하는 데서 오는 장점은 계산의 효율성입니다.

 

원래 BPTT를 해야하지만, 병렬적이니 True time 개념이 없어집니다.

 

그냥 Backpropagation만 가지고 해결이 됩니다.

 

 

 

 

그래서 아래와 같은 transformer로 attention된 예시들을 볼 수 있습니다.

이것은 encoder와 decoder 사이의 attention이며,

 

이것은 multi-head에 대해서 각 head가 parallel하게 정보를 처리하여 attention한 것을 표현합니다.

 

multi-head로 한 이유는 하나 하나의 word embedding을 그 차원을 직접 보지 말고, projection 시켜서 정보를 축소한 다음에 parallel하게 multi로 보는 것이 오히려 유리하니 그러한 것이 반영된 형태입니다.

 

 

 



 

BELATED ARTICLES

more