brunch

트랜스포머 모델(Transformer)_2

chatGPT를 위한 NLP 기초 : Transformer_2

by 별똥별 shooting star


들어가며

트랜스포머에 대한 블로그 포스팅은 총 3개로 나눠서 진행된다. 그중 앞선 1번 포스트는 트랜스포머에 대한 개념과 Positional Encoding 그리고 Self-Attention에 대한 개념을 살펴보았다. 이번 포스팅에서는 크게 Multi-Head Attention과 Feed Forward에 대해서 살펴보도록 하겠다.



1. Multi-Head Attention


image.png


이번 파트에서는 Positional Embedding을 거친 문장으로 Attention을 병렬로 추출하는 Multi-Head Attention을 살펴보도록 하겠다. 조금 더 자세히 얘기하면 주로 8개의 Head로 분할한다. 이는 각각 다른 관점에서 어텐션을 수행하여 한 번의 어텐션으로 놓칠 수 있는 정보들을 분할된 여러 번의 어텐션을 동시에 수행하여 잡아둔다.


image.png


그런데 분할될 때 연관이 없는 것끼리 묶일 수 있다. 그러면 당연 성능은 안 좋아지게 된다. 그래서 위의 그림 맨 위에 Linear 레이어를 추가해 데이터를 특정 분포로 매핑시켜준다. 추가적으로 입력단에 있는 Linear 레이어를 통해서 적합한 공간으로 Embedding을 매핑해 준다. 그리고 그림 중간에 보면 MultiHead Attention 프로세스에 Scaled DotProduct가 있는 것이 보일 것이다. 지금부터는 이 Sclaed DotProduct에 대해서 알아보도록 하겠다.


1) Scaled Dot-Product Attention


image.png


이전 포스팅에서 Self-Attention 개념을 설명하면서 문장 내의 단어들끼리 유사도를 구한다고 얘기했었다. Scaled Dot-Product Attention은 이러한 유사도를 구하는 메커니즘이다. 이름에서 알 수 있듯이 scale과 dot product를 통해서 값을 구한다.


image.png


위의 그림을 살펴보면 맨 아래에 Q, K, V가 나온다. 이는 각각 Query, Key, Value를 나타내는 값이며 단어 벡터를 행으로 하는 문장 행렬이다. 그리고 Q, K 값을 내 적하여 유사도를 구해준다. 이 과정은 가장 먼저 MatMul을 통해 행렬 곱을 해주고 √dk 값으로 나눠 Scaling 해주고 소프트맥스 함수를 통해서 0~1 사이의 값으로 Normalize 해준다. 이렇게 구해진 Q와 K의 유사도에 문장 행렬 V를 곱하고 이 V 값을 모두 더해 어텐션 값을 구한다.


그렇다면 왜 굳이 소프트맥스 함수와 Scale를 하는 것일까? 소프트맥스 함수를 사용하는 이유는 확률 값으로 만들기 위함이다. 그리고 Scale를 하는 이유는 차원 수가 깊어질수록 Dot Product의 값이 커지게 되어 소프트맥스 함수를 거치면 미분 값이 작아지는 현상이 나타나 이를 방지하기 위함이다.


2) 인과 관계 마스킹(Causality Masking)

이 글의 맨 위의 그림을 보면 색이 있는 네모 상자가 3개가 있다. 그중 하나를 자세히 보면 MultiHead Attention 앞에 Masked라는 단어가 붙어 있는 것이 보일 것이다. 이것을 보고 인과 관계 마스킹이라고 한다.


image.png


결론부터 말하면 인과 관계 마스킹은 현재의 단어를 통해서 다음 단어를 생성하는 자기 회귀적은 특성을 살리기 위해 적용한다. 원래 RNN은 순차적으로 진행되기 때문에 이전 time step에 있는 단어들을 참고해서 다음 단어를 예측한다. 하지만 트랜스포머는 전체 문장이 병렬적으로 들어가기 때문에 단어의 위치를 알 수가 없게 되어 자기회귀의 특성을 잃어 문장을 생성할 수 없게 된다.


그래서 인과 관계 마스킹을 통해서 문장의 일부를 가려 연속성 학습을 한다. 이 학습을 통해 자기회귀 특성을 잃지 않고 문장을 생성할 수 있게 해 준다.



2. Position-wise Feed-Forward Networks


image.png


쉽게 얘기하면 encoder와 decoder는 각각 fully connected feed-forward network를 포함하고 있다. 이것을 각각의 개별 단어마다 적용되기 때문에 Position-wise Feed-Forward Networks라고 부른다. 그리고 아래와 같은 수식을 가지지고 있다. 여기서 W는 Linear layer, 여기에 b를 더해 Linaer Transformation, max(0, x) 함수는 Relu를 가리키고 있다.


image.png


아래의 그림을 보면 프로세스를 조금 더 자세히 살펴볼 수 있다. x에 linear transformation을 적용한 다음 Relu(max(0, z))를 거쳐 다시 linear transformation을 적용한다. 추가로 레이어가 달라지면 Parameter W와 b는 달라진다. 이것과 유사한 메커니즘을 꼽으라고 하면 커널 사이즈가 1인 Convolution을 두 번 하는 연산과 동일하다.


image.png



마치며

https://pozalabs.github.io/transformer/


https://reniew.github.io/43/


https://www.tensorflow.org/api_docs/python/tf/linalg/matmul

keyword
매거진의 이전글트랜스포머 모델(Transformer)_1