self-Attention mechanism of Transformer model
이 글에서는 트렌스포머 모델의 핵심 메커니즘인 self-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 Model 이란
간단하게 말해서 자연어(NLP) 부분에서 사용되는 딥러닝 모델이다.
2017년 논문 Attention is All You Need모델에서 제안된 딥러닝 모델이다.
이 모델의 핵심 아이디어는 전체 입력 문장에서 각 단어가 다른 단어와 어떤 관련이 있는지를 파악하는 "Attention 메커니즘"이다.
1. 기존의 seq2seq 모델의 한계
기존 seq2seq 모델은 Encoder / Decoder로 이루어져 있다.
input을 Encoder로 넣어주면 하나의 벡터 표현으로 압축해주고 이 벡터 표현을 다시 Decoder로 넣어주면 하나의 출력 시퀀스를 만들어줬다.
하지만 여기서 문제점이 있는데 바로 input값을 압축을하는데 정보가 손실된다는 문제점이 있었다. 이를 보정하기 위해 Attention이 등장하였다. 그런데 Attention을 RNN의 보정을 위한 용도로서 사용하는 것이 아니라 Attention만으로 Encoder 와 Decoder를 만들어보면 어떨까? 라는 생각을 가졌다.
2. Trensformer의 주요 하이퍼파라미터
각 하이퍼파라미터에 대해서는 뒤에 설명하겠다. 아래에서 정의하는 수치는 트랜스포머를 제안한 논문에서 사용한 수치이다.
$$ d_{model} = 512 $$
Trensformer의 Encoder 와 Decoder에서 정해진 입력과 출력의 크기를 의미한다.
Embeding vector의 차원 또한 $ d_{model} $ 이며, 각 Encoder와 Decoder가 다음 층의 Encoder와 Decoder로 값을 보낼 때에도 이 차원을 유지한다.
$$ num_layers = 6 $$
Trensformer에서 하나의 Encoder와 Decoder를 층으로 생각하였을 때, Trensformer 모델에서 Encoder와 Decoder가 총 몇 층으로 구성되었는지를 의미한다. ( 논문에서는 Encoder와 Decoder를 각 6층으로 쌓았다. )
$$ d_{ff} = 2048 $$
Trensformer에서는 Attention을 사용할 때, 한번 하는 것 보다 여러 개로 분할해서 병렬로 Attention을 수행하고 결과값을 다시 하나로 합치는 방식을 택했다. 이때 이 병렬의 개수를 의미한다.
Tresformer 내부에는 Feedforward 신경망이 존재하며 해당 신경망의 은닉층 크기를 의미한다. Feedforward 신경망의 입력층과 출력을의 크기는 $$ d_{model} $$ 을 의미한다.
3. Trensformer

Trensformer모델에서는 RNN을 사용하지 않지만 기존의 seq2seq처럼 Encoder Decoder 구조를 가진다. 이전 seq2seq2구조에서는 Encoder와 Decoder에서 각각 하나의 RNN이 t개의 시점을 가지는 구조였다면 이번에는 Encoder / Decoder라는 단위가 N개로 구성되는 구조이다. 이 논문에서는 각각 6개를 사용했다.


위 그림은 Encoder로부터 정보를 받아 Decoder가 출력 결과를 만들어내는 트랜스포머 구조를 보여준다.
트랜스포머의 내부 구조를 조금씩 확대해가는 방식으로 트랜스포머를 이해해보자. 우선 Encoder / Decoder를 이해하기 전에 Trensformer의 입력에 대해서 이해해보자. Trensformer의 Encoder / Decoder는 단순히 각 단어의 Embedding vector들을 입력받는 것이 아니라 Embedding vector에서 조정된 값을 입력받는데 이에 대해 알아보기 위해 입력 부분을 확대해보자.
4. Positionmal Encoding
기존의 RNN 모델은 자연어 처리에서 입력을 받을때 문장의 순서들을 직렬 구조로 ( 순서가 있게 ) 입력받았다. 하지만 Tresnformer 모델 같은 경우 병렬로 연산을 하기에 모든 단어들을 동시에 입력받는다. 즉, 입력된 단어의 순서를 구분하지 못한다. 이를 해결하기 위해 Positional Encoding 을 실시하였다.

위의 그림은 입력으로 사용되는 Embedding vector들이 Trensformer의 입력으로 사용되기 전에 Positional Encoding 값이 더해지는 것을 보여준다.
Embedding vector가 Encoder의 입력으로 사용되기 전 Positional Encoding 값이 더해지는 과정은 아래와 같다.

Positional Encoding값들은 어떤 값이기에 위치 정보를 반영해줄 수 있는 것일까?
Tresnformer는 위치 정보를 가진 값을 만들기 위해서 아래 두 개의 함수를 사용한다.
$$PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)$$
$$PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right)$$
사인 함수와 코사인 함수의 그래프를 상기해보면 요동치는 값의 형태를 생각해볼 수 있는데, Tresnformer는 사인 함수와 코사인 함수의 값을 임베딩 벡터에 더해주므로서 단어의 순서 정보를 더해준다. 그런데 위 수식에 생소한 변수 $ pos, i, d_{model} $이 있다.
위의 함수를 이해하기 위해서는 위에서 본 임베딩 벡터와 포지셔널 인코딩의 덧셈은 사실 임베딩 벡터가 모여 만들어진 문장 행렬과 포지셔널 인코딩 행렬의 덧셈 연상을 통해 이루어진다는 점을 이해한다.

5. Attention
트랜스포머에서 사용되는 세 가지의 어텐션에 대해서 간단히 정리해본다.

첫번째 그림인 셀프 어텐션은 인코더에서 이루어진다.
두 번째 그림인 셀프 어텐션과 세번째 그림인 인코터-디코더 어텐션은 디코더에서 이루어진다.
셀프 어텐션은 본질적으로 Query, Key, Velue가 동일한 경우를 말한다. 반면, 세번쩨 그림 인코더-디코더 어텐션에서는 Query가 디코더의 벡터인 반면에 Key와 Value가 인코더의 벡터이므로 셀프 어텐션이라고 부르지 않는다.
인코더의 셀프 어텐션 : Query =Key= Value
디코더의 마스크드 셀프 어텐션 : Query = Key= Value
디코더의 인코더-디코더 어텐션 : Query : 디코더 벡터 / Key = Value : 인코더 벡터

위 그림은 Trensformer의 아키텍셔에서 세 가지 Attention이 각각 어디에서 이루어지는지 보여준다. 세 개의 Attention이 추가적으로 멀티 헤드 라는 이름이 붙어있다.
이는 Tresnformer가 Attention을 병렬적으로 수행하는 방법을 의미한다.
6. Encoder

논문에서는 총 6개의 인코더 층을 사용했다. 인코더를 하나의 층이라는 개념으로 생각한다면, 하나의 인코더 층은 총 2개의 서브층으로 나뉜다.
Self-Attention, Feedforward 신경망이다.
위의 그림은 멀티 헤드 셀프 어텐션과 포지션 화이즈 피드 포워드 신경망이라고 적혀있지만, 멀티 헤드 셀프 어텐션은 셀프 어텐셩을 병렬적으로 사용하였다는 의미고, 포지션 와이즈 피드 포워드 신경망은 우리가 알고있는 일반적인 피드 포워드 신경망이다.
7. Self-Attention of Encoder
1 ) Self-Attention의 의미와 이점
Attention 함수는 주어진 쿼리에 대해서 모든 키와의 유사도를 각각 구한다. 그리고 구해낸 이 유사도를 가중치로 하여 키와 맵핑되어 있는 각각의 값에 반영해 준다. 그리고 유사도가 반영된 값을 모두 가중합하여 리턴한다.

이것이 기본적인 Attention의 개념이다. 그런데 어텐션 중에서는 Self-Attention이라는 것이 있다. 어텐션을 자기 자신에게 수행한다는 의미이다.
트렌스포머의 셀프 어텐션에서 Q, K, V는 아래와 같다.
Q : 입력 문장의 모든 단어 벡터들
K : 입력 문장의 모든 단어 벡터들
V : 입력 문장의 모든 단어 벡터들
Self-Attention에 대해 자세히 배우기 전에 Self-Attention을 통해 얻을 수 있는 대표적인 효과에 대해 이해해보자.

위 글에서 사람은 당연히 it이 animal을 가르킨다는걸 알 수 있다. 즉, 맥락을 쉽게 이해 가능하다는 것이다. 하지만 컴퓨터는 이런 작업이 힘들기 때문에 Self-Attention을 사용하였다.
2) Q, K, V 얻기
1. 입력 : 단어 임베딩
- 예 : 문장이 " 나는 학교에 간다 " 라면, 각 단어는 고정된 차원의 벡터로 표련됨 ( 예 : 512 차원 )
- 입력 행렬 X : 크기 = (문장 길이 x 입베딩 차원 )
2. Q, K, V를 얻는 과정
각 입력 벡터 x에 대해 학습 가능한 가중치 행렬을 곱한다.
- $$ w_Q, w_K, W_v $$ 는 각각 학습되는 가중치 행렬
- L : 문장의 길이
- $$ d_q, d_k, d_v $$ : 임베딩 차원 (보통 동일)
3. 행렬 연산으로 병렬 처리
- 입력 전체 벡터를 행렬 x로 모아두고,
- 아래처럼 행렬 곱으로 한번에 계산한다.
Q = X @ W_Q
K = X @ W_K
V = X @ W_V
$$ Attention(Q, K, V) = softmax(QK^{T} / \sqrt{d}_k) @ V $$
- Q와 K의 내적 → 유사도 계산
- softmax → 가중치 정규화
- V에 가중합 적용 → 최종 출력
직관적인 비유
Q : 내가 알고 싶은 것
K : 네가 어떤 질문에 대답할 수 있는지
V : 실제 네가 가진 정보
즉, 내 질문(Q)이 네 자기소개(K)와 얼마나 맞물리는지에 따라, **네 답변(V)**을 얼마나 반영할지 결정하는 구조이다.
지금까지 Self-Attention을 위해 공부함
범위가 너무 광범위해서 필요한 부분만 학습했다.