Transformer

Transformer : Multi-head Attention (Add & Norm)

왕눈임 2025. 2. 24. 16:05

self-attention 연산과정에 대한 이해를 기반으로 

 

Multi-head Attention이 무엇인지 

 

Add&Norm 연산은 무엇인지 정리합니다.

transformer 구조의 일부

즉 위의 한 블럭을 이해하는 것을 목표로 합니다.

self-attention은 무엇이었는지?

2025.01.22 - [데이터 마이닝] - Transformer란? (self-attention)

 

Transformer란? (self-attention)

seq2seq 모델을 간단하게 살펴봄으로써 attention mechanism을 이해한 후self attention을 이해해 봅시다. 언어 모델을 "번역"이라는 task에 사용한다면 transformer 이전에는  RNN 혹은 LSTM을 기반으로 한 모델

tmddn0512.tistory.com


Multi-head Attention이란?

transformer에서는 input을 query, key, value로써 역할을 수행하도록

 

각각의 역할에 대응하는 Wq, Wk, Wv의 weight matrix와의 곱을 했었습니다.

 

그런데 Wq라는 하나의 matrix는 하나의 특징으로만 input을 처리할 수 있습니다.

가령 cnn을 생각해 봅시다.

cnn은 weight matrix로 이루어진 filter를 사용하는데

 

이 filter의 종류에 따라 포착할 수 있는 시각적 특징이 달라지기에

 

다양한 특징을 출력하기 위해서 filter를 여러 개 사용했었습니다.

 

마찬가지로 이 Wq와 같은 weight matrix를 하나만 가져가는 것보다

 

다양한 특징과 기준으로 정보를 처리하도록

 

여러 개의 weight matrix를 사용하자는 것입니다.

 

그래서 이 Wq, Wk, Wv의 다양한 종류의 matrix를 병렬적으로 적용합니다.

multi-head attention

 

이때 Wq, Wk, Wv에 의해 각 query,key,value가 계산되면 

 

이후 self-attention의 결과로 아래와 같이 z vector가 계산되었었습니다.

 

따라서 이런 weight matrix의 종류 만큼 z도 생성되게 됩니다.

 

가령 weight maritx를 각각 다른 종류 7개의 set을 사용해서 z를 구한다면 

 

아래와 같이 7개의 z가 나오게 됩니다.

 

이후 여러 개 나온 z를 concat 하게 됩니다.

 

이후 이렇게 차원이 커진 concat 된 z를 또 다른 weight matrix와의 선형연산을 통해

 

최종 z를 원하는 size로 계산합니다.

 

여기까지의 과정을 한 번에 표현하자면 아래와 같습니다.

 

즉 각기 다른 weight matrix에서 처리한 z를 concat하여 W0 maritx와의

 

선형 계산을 통해 원하는 차원으로 최종 z를 얻을 수 있습니다.

 

즉 다양한 기준 및 특성을 반영한 최종 z를 원하는 size로 얻게 되는 것입니다.

 

후에 다시 언급하겠지만, 여기서 최종 z는 처음 input 데이터와 size를 일치시킵니다.

 

이는 skip connection을 사용하기 위함입니다.

 

즉, 이 최종 결과에 input data 자체를 더해주는 연산을 가능하게 하기 위해

 

input data와 차원을 같게 하는 것입니다.


Add & Norm

위에서 본 Multi-head-attention을 지나 Add& Norm이라는 연산을 거치게 됩니다.

transformer 구조의 일부

 

앞서 봤듯 multi-head-attention 결과로 나온 z는 

 

input과 size가 같아져 skip connection을 활용할 수 있습니다.

 

skip connection이란? 

 

layer를 거친 output에 layer를 거치지 않은 input 그 자체를 더하는 것을 말합니다.

 

왜 이렇게 하는지?

 

각 feature마다 optimal depth가 다를 수 있습니다.

 

미리 추출된 중요 feature가 layer를 거치면서 오히려 그 의미가 

 

퇴색되는 것을 막을 수 있으며 전체적인 loss 함수를 smooth 하게 바꿔줄 수 있습니다.

 

그래서 self-attention 결과로 각 단어에 대응되는 encoding된 vector를 얻어내면 

 

해당 vector에 input data를 더하는 과정을 "Add" 에서 수행합니다.

 

self-attention을 통해 "thinking" 과 "machines" 이라는 단어에 대응되는

 

encoding된 vector을 얻어 이 vector에 skip connection 연산까지 진행했다 합시다.

 

이후 데이터 사이의 절대적 차이가 아닌 상대적 차이를 학습하기 위해 정규화를 진행해 줍니다.

 

가령 아래와 같이 인코딩 된 vector의 값의 분산과 평균을 정규화 합니다.

 

이는 모델의 학습이 안정화되며 학습이 잘 진행되도록 합니다.

 

이러한 Add & Norm 연산 이후에

 

이 연산 결과를 input으로 feed foward 라는

 

동일한 fully connected layer를 거치게 합니다.

transformer 구조의 일부

 

이렇게 또 다른 선형변환을 통해서 input과 같은 차원의 벡터 만들어지고

 

거기에 다시 정규화 residual(skip connection) 적용하여

 

각각에 단어에 대응되는 encoding된 벡터 계속해서 얻어냅니다.


Transformer: Positioning Encoding

transformerlong term dependency 문제를 잘 처리합니다.

 

왜일까요?

 

가령 Rnn에서는 attention 쓰더라도

 

결과를 내는 과정에서는 순차적 연산 구조 따를 밖에 없습니다.

 

그런데 Transformer Self-Attention 메커니즘 통해 모든 토큰 간의 관계를

 

한 번에 병렬적으로 계산합니다.

 

각각을 key query value 병렬적 연산 하기에

 

순차적 구조를 따르지 않아 본질적인 long term dependency 문제를 해결할 수 있습니다.

 

 

정리하자면..

 

RNN 데이터가 순차적으로 들어오는 구조와 동일한 방식으로 처리되지만

 

Transformer 과정은 토큰이 다른 토큰들과의 관계를 계산하므로, 각 토큰 간의 연산이 독립적입니다.

 

즉 연산 자체의 병렬적 처리가 가능한 구조라는 겁니다.

 

 

그런데 병렬적으로 처리하는 만큼 각 순서에 대한 정보가 사라지게 됩니다.

 

즉 입력 토큰 간의 관계를 학습하지만 위치 정보를 직접적으로 포함하지 않습니다.

 

따라서 위치정보 즉 input의 순서 정보를 encoding 하여 표시해 줄 필요가 있습니다.

 

따라서 벡터 차원수만큼 그래프를 도입하여 위치정보를 담고 있는 벡터를 만듭니다.

 

가령 input 벡터가 4차원이라면 아래와 같이 input data에 대응하는 위치정보를 

 

담고 있는 벡터를 만듭니다.

 

이후 이 값을 벡터로 만들어 input 벡터에 아래와 같이 더해주게 됩니다.

positional encoding

 

이렇게 더해진 결과는 "단어 의미 정보 + 위치 정보"를 동시에 가지게 됩니다.

 

이러한 Positioning Encoding 과정으로 순서 정보를 처리할 수 있게 됩니다.


self-attention 시각화 

 

이와 같이 각 단어를 query로 하였을 때 attention을 어디에 두었는지 시각화하여

 

해당 단어를 예측하는데 어떤 단어가 중요한지 직관적으로 확인해 볼 수도 있습니다.

 

 

'Transformer' 카테고리의 다른 글

Transformer : encoder 및 decoder (Masked Self-attention)  (0) 2025.03.01
Transformer란? (self-attention)  (0) 2025.01.22