네이버 부스트캠프/LEVEL-2

[부스트캠프][WK07 / Day31] Transformer (2)

1. 강의 내용

Transformer (2) (주재걸 교수님)

1) Multi-Head Attention

 

attention module에 Q, K, V를 Linear($W_Q, W_K, W_V$)를 거쳐 입력으로 입력으로 넣게 되는데, 여기서 서로 다른 버전의 attention의 개수 만큼 서로 다른 encoding vector가 나오고, 해당 vector들을 concat 하면 Multi-Head Attention이 나옵니다. 여기서 동일한 시퀀스 정보가 주어졌을 때, 동일한 query word에 대해서 여러가지 다양한 측면의 데이터를 필요로 할 수 있으며 이럴때 하나의 attention으로는 모든 정보를 담을 수 없으므로 서로 다른 정보를 병렬적으로 뽑고 그 정보들을 합치는 형태로 구성하게 됩니다.

[출처][http://jalammar.github.io/illustrated-transformer/]

만약 각 head가 3차원 벡터의 아웃풋을 얻었다면 위의 그림처럼 (총 head의 개수 x 각 head의 value vector 차원)을 차원으로 가지는 Z들의 모임으로 concat됩니다. 이 결과를 원하는 차원으로 줄여주는 linear transformation matrix $W^O$를 곱해줍니다.

 

Attention 모델의 계산량과 메모리 요구량을 기준으로 기존의 시퀀스 모델과 비교하면 다음과 같습니다.

 

위의 그림들과 같이 self-attention의 경우에는 Q와 K에 대해 d차원의 내적을 계산해야하는데 d만큼의 곱셈 및 덧셈을 포함하며 이것을 모든 Q, K 조합에 대해 해줘야 하기 때문에 $n^2 * d$만큼의 계산이 필요하게 됩니다. 시퀀스, 차원의 길이와 관계없이 해당 계산을 GPU에 특화된 행렬연산의 병렬화를 통해 계산하므로 이것을 한번에 계산가능합니다. RNN은 이와 달리 $h_{t-1}$의 차원이 d라고 할 때 내적 시 d번의 계산을 $W_{hh}$의 row vector d만큼 수행해야하기 때문에 $d^2$만큼의 계산이 필요하게 되고, 이것을 time step의 개수 n만큼 곱해줘 $n * d^2$ 만큼의 계산량이 필요합니다.

 

위 두 계산의 메모리 요구량을 비교해보면 d는 임의로 정할 수 있는 하이퍼파라미터지만 n은 입력 데이터의 시퀀스 길이가 길수록 늘어나므로 임의의 고정값을 사용할 수 없고 입력에 따른 가변적 값을 가집니다. 결국 긴 시퀀스가 입력으로 주어지면 self attention에서 RNN보다 더 많은 메모리 요구량이 필요하게 됩니다. 하지만 self attention은 병렬화가 가능하기 때문에 모든 계산을 동시에 수행할 수 있지만 RNN은 순서대로 계산되기 때문에 병렬화가 불가능하기 때문에 Sequential Operations에서 차이가 나 일반적으로 RNN보다 self attention의 학습이 더 빠르게 진행됩니다. 다음의 Maximum Path Length는 Long term dependency와 직결되는데, RNN은 마지막 단어가 가장 앞의 단어의 정보를 참조하기 위해서는 n번의 layer를 통과해야하지만 self-attention은 time step에 상관없이 한번에 정보를 가져올 수 있습니다.

2) Block-Based Model


Block-Based Model의 encoder를 보면, 들어온 input으로 Q, K, V를 만들고 Multi-Head Attention을 통과시켜 나온 결과를 residual connection을 통해 전달된 입력 벡터와 더해주게 됩니다. 이를 통해 gradient vanishing 문제 해결과 학습 안정화의 효과가 있습니다. 이때, 입력벡터와 attention의 출력벡터의 차원은 동일하게 유지되어야 Add 해줄 수 있습니다. 이렇게 더해진 vector에 Layer Normalization을 진행시켜단어 별 인코딩 벡터를 만들어주고 Feed Forward의 fully connected layer를 지나가게 해서 Add & Norm을 한 번 더 진행시켜줍니다.

3) Layer Normalization


Normalization은 주어진 다수의 샘플에 대해 평균을 0, 분산을 1로 만들어준 후 우리가 원하는 평균과 분산을 주입할 수 있도록 하는 선형변환으로 이뤄집니다. Batch norm의 경우, 배치사이즈를 3이라고 하면 입력 layer의 d차원 벡터를 총 3개의 데이터 인스턴스에 대해 넣어주고 이를 forward한 값들에 대해 평균을 0, 분산을 1로 만들어주는 계산을 해주게 됩니다.

 


Layer Normalization은 마찬가지로 평균을 0, 분산을 1로 만들어준 후 우리가 원하는 평균과 분산을 주입하는 두 단계로 이루어져 있습니다. 위의 예시를 보면 먼저 각 단어 별 4개의 노드 값들의 평균을 0, 분산을 1로 만들어줍니다. 이렇게 변환된 값에 원하는 평균과 분산을 주입하는 Affine transformation $y = ax + b$라는 연산은 layer에서 발견된 각 노드 별로 x에 해당 노드 값을 넣어 y로 바꿔주는 동일한 연산을 수행하게 됩니다. Batch norm과 세부적인 차이는 있지만 결국 학습을 안정화하고 성능을 끌어올리는데 중요한 역할을 합니다.

4) Positional Encoding


attention의 경우 순서에 대한 정보가 담겨있지 않아 단어의 순서를 바꾸더라도 동일한 단어에 대한 인코딩 벡터는 동일하게 나오게 됩니다. 결국 시퀀스 정보를 고려하여 인코딩하지 못하기 때문에 순서에 대한 정보를 가진 상수 벡터를 각 순서에 등장하는 단어 벡터에 더해주는 인코딩 방식이 Positional Encoding 입니다. Positional Encoding 값은 sin, cos 등으로 이루어진 주기 함수를 사용하는데, 차원의 개수 만큼의 서로 다른 주기(2i)를 사용해 여러 함수를 만든 후 여기서 특정 x 값에 대한 함수값을 모아 위치를 나타내는 값으로 사용합니다. 위의 그림은 128차원의 입력벡터를 기준으로 만들어진 Positional Encoding vector인데, 행렬에서 각각의 row vector를 해당 position의 인코딩 벡터로 사용합니다.

5) Warm-up Learning Rate Scheduler


위의 그림에서 x축은 iteration 숫자이고 y축은 learning rate인데, 처음에는 작은 learning rate 값을 주고 완만한 구간에 도달하게 되면 local minima에 빠지지 않기 위해 동력을 주는 차원에서 learning rate를 iteration 수에 비례하여 올려줍니다. 이후 저점에 도달하지 못하고 맴돌면 learning rate를 점차적으로 줄여주는 등의 방식을 사용합니다.

6) Decoder (Masked Self-Attention)

Encoder의 마지막 layer를 거쳐 나온 각 단어별 인코딩 벡터와 입력 시퀀스를 받아 출력 시퀀스를 예측하는 과정인 디코딩을 수행하게 됩니다. 여기서 디코더의 Masked Self-Attention를 지나 만들어진 hidden state vector가 query로 사용되고, Encoder의 출력벡터가 key, value로 들어가 attention이 수행(유사도계산) 됩니다. 이렇게 나온 값을 Feed Forward network를 통과시켜 나온 각각의 단어 벡터에 linear transformation을 해줘 target language에 해당하는 vocab size만큼의 벡터로 2차원의 벡터를 변환시킨 후, softmax를 취해주어 특정 단어에 대한 확률값을 뽑아 다음 단어에 대한 예측을 수행합니다.

 


Masked Self-Attention은 디코딩 과정 중에 주어진 시퀀스에 대해 self attention을 통해 각 단어를 인코딩하는 과정에서 정보에 접근 가능 여부와 관련이 됩니다. 위의 오른쪽 그림을 보면 <SOS>를 query로 사용해 attention을 수행할 때는 뒤에 나오는 단어 '나는'과 '집에'를 순서대로 예측해 주어야 하기 때문에 접근 가능한 key, value에서 '나는'과 '집에'는 제외해 주어야 합니다.

 


softmax 이후에 확률값이 계산된 상황에서 각 단어의 뒤에 나오는 단어들에 대한 확률값은 후처리로 0이 되도록 대각선 기준 윗 부분을 0으로 만들어주는 과정을 수행한 후, row별 합이 1이 되도록 Normalize 해줍니다.


2. 과제 수행 과정 / 결과물 정리


3. 피어세션 정리

https://www.notion.so/9-14-462583272e5740deb88389e46cd8cbcc


4. 학습 회고

트랜스포머에 대해 학습을 마무리 하였습니다. 하나하나 예시를 보며 학습하니 논문을 읽은 부분이 더욱 구체화 되는 것 같습니다. 이제는 선택과제 2개를 모두 수행하고 스터디 과정에서 전처리 및 모델링 부분을 진행할 예정입니다.