해당 블로그는 고려대학교 DSBA 연구실에서 공개한 유튜브를 토대로 만들었습니다. (https://youtu.be/x_8cp4Vdnak)
Token들이 encoder에 sequential하게 들어가서 순서가 보존되는 Seq2Seq 모델과는 다르게, Transformer는 한번에 모든 토큰을 encoder에 넣는 방식으로 설계되어 순서와 관련된 정보가 보존되지 않습니다.
이러한 문제점을 Position Encoding으로 해결했습니다.
positional encoding은 다음과 같은 특징을 가집니다:
Input을 3개 복사하여, Qurey, Key, Value 각각의 가중치를 곱해 Q, K, V 행렬을 생성합니다.
Q와 K의 행렬곱을 수행하여 스케일링하고, masking과 softmax 함수를 거쳐 나온 결과물을 V와의 행렬곱을 계산합니다. 이때, 다양한 task 수행을 위해 multi-head attention기법을 사용합니다.
Q, K, V의 계산 방식
이후 만들어진 2개의 행렬을 concat하고, residual connection, layer normalization을 수행하여 feed-forward network에 넘깁니다.
다시 residual connection, layer normalization을 수행하여 output을 얻습니다.
이때, output과 input의 크기는 동일합니다 !!!
논문에서는 6개의 encoder layer를 사용합니다. output과 input의 크기가 동일하므로, 같은 구조의 encoder layer를 6번 사용할 수 있습니다.
타겟 문장 학습 시 input token들을 one-hot-encoding으로 변환하여 embedding layer에 넣고, positional encoding을 수행합니다.
앞선 encoder의 1~3번 과정 (self-attention 과정)을 반복하여 산출된 결과를 Query로, Encoder의 ouput을 2개 복사하여 Key와 Value 값으로 사용합니다.
Self-attention 수행 시 encoder와 decoder의 다른 masking 기법
padding masking 기법만을 사용하는 encoder와는 다르게, decoder에서는 padding masking과 삼각행렬 윗부분까지 masking하는 기법을 사용합니다.
decoder에서 해당 masking 기법을 사용하는 이유는 attention의 가중치를 구할 때, 대상 token 이후의 token은 참조하지 못하도록 하기 위해서입니다.
만약 그림과 같이 삼각행렬의 윗부분을 masking하지 않는다면, 첫번째 행에서 I는 love, Hodu~too의 모든 정보들을 미리 받아오는 문제가 발생합니다.
아래 수식을 활용하여 multi-head attention을 수행합니다. (encoder-decoder self attention이라고도 부릅니다.)
Q, K, V의 계산 방식
생성된 두 행렬은 concat하고, residual connection, layer normalization을 수행하여 feed forward network에 넘깁니다.
이후 다시 residual connection, layer normalization을 수행하여 output을 생성합니다.
이때도, output과 input의 크기는 동일합니다.
논문에서는 6개의 decoder layer를 사용하여 최종 결과물을 생성하여 예측에 사용합니다.
이렇게, Transformer의 전체적인 구조에 관해 리뷰해보았습니다.