데이터사이언스 이론 공부

Transformer(트랜스포머)에 대한 간략 정리

soopy 2022. 12. 5. 12:30
728x90

📌 Attention is All You Need

기존 방식에서 인코딩 방식은 근본적으로 RNN 방식이었으며, 디코딩 방식도 RNN 방식에 Attention Value를 추가해서 장기의존성 문제를 해결하는 방향으로 진행되었다.

→ 트랜스포머에서는 더이상 RNN 방식을 활용하지 않으며 기존 RNN 방식도 Attention Value를 구하는 방식으로 인코딩과 디코딩 과정을 거치게 되며 그렇기 때문에 “우리가 필요한 것은 어텐션 뿐이다.” 라는 논문 제목을 갖는 것이다.

📌 기존 어텐션 매커니즘과의 차이

단어 각각이 아닌 문장을 통째로 input한다. → 이를 통해 한 문장 내에서 각 단어가 다른 단어들과의 관계를 이해할 수 있도록 유도한다.(문맥을 고려한다.)

 


Encoder

Self-attention

한 문장 내 단어들 간 유사도를 확인하는 작업을 하기를 원한다.

→ 어텐션 메커니즘에서는 디코딩 과정에서의 단어 하나와 인코딩 과정에서의 h들 간 유사도를 가중치로서 적용한 가중평균을 구했다.(attention value)

→ 이 방식을 인코딩과 디코딩과정에도 각각의 단어에 대해 그대로 적용하는 것이다. 이를 self attention이라고 한다.

 

위 예시처럼 it이 가리키는 바가 무엇인지 AI가 판단할 수 있도록 하는 의도가 담겨있다.

 

📌 Self Attention 과정의 이해

어텐션 매커니즘을 적용할 대상은 이제 한 문장에 담긴 단어들이다.

  • 어텐션 매커니즘의 시작은 dot-product이다. 즉 단어들 간 유사도를 구하는 것이다. 위 그림에서 $x$는 각 단어의 임베딩 벡터에 해당하며 특히 $x_2$ 벡터에 대한 어텐션 적용에 대한 예시이다.
  • $x_2$ 벡터는 나머지 단어 임베딩 벡터($x_1$, $x_3$, $x_4$ 여기서는 자기 자신도 포함되어 있다.)와의 유사도 파악을 위해 dot-product를 수행한다.
  • dot_product의 결과들을 모아 softmax에 집어넣으면 그 결과가 $w_{21}$, $w_{22}$, $w_{23}$, $w_{24}$로 구성된 가중치 벡터가 생성된다. (아무래도 자기 자신이 가장 유사도가 높게 나올 것이 분명하므로 위 그림에서도 $x_2$의 색깔이 가장 짙은 것을 알 수 있다.)
  • 이제 가중치 벡터($w$)를 input 데이터였던 문장 내 각 단어들($x$)과 내적해서 얻은 최종 벡터값($y_2$)은 input 문장 중 2번째 단어의 임베딩 벡터($x_2$)를 대체한다.

→ 각 단어 임베딩 벡터에 다른 단어와의 유사도 관계에 대한 정보를 담아낸다고 볼 수 있다.

 

트랜스포머에서는 Query, Key, Value 개념을 도입해서 설명한다.

$Q$는 input 문장 내 각각의 단어에 해당한다. → “각 단어가 다른 단어들과의 유사도가 궁금합니다.” 라는 쿼리를 던지는 것을 표현하고 싶었던 것 같다. 어쨌든 Q는 단어 벡터 각각을 의미한다.
$K$역시 input 문장 내 각각의 단어에 해당한다. → “Q에서 던진 단어가 나머지 단어들과 유사도가 어떻게 되는지 확인해 봅시다.” 라는 의미를 담는다고 해야하나? Q는 결국 무엇과 비교되는가? 사실 자기 자신과 비교하는 꼴이다. 어쨌든 단어 간 dot-product와 softmax로 가중평균(w)을 구한다.
$V$역시 input 문장 내 각각의 단어에 해당한다. → “가중평균(w)을 곱할 대상이 V입니다.” 결국 또 input 단어 벡터가 V에 해당한다. 그래서 w와 v를 곱한 결과가 Attention Value가 되고 여기서는 z로 표현하고 있다.

  • 여기서 주목할 점은 dot-product 결과를 $\sqrt{d_k}$로 나눈다는 점이다. 이를 scaling dot product라고 한다.
  • d는 dimension을 의미한다. 사실 각 단어 임베딩 벡터는 d차원으로 구성되어 있다. → 먼저 dot-product의 결과는 알수없지만 -무한대에서 +무한대가 될 수 있다.
  • 자세히 설명하면 복잡해지므로 간단히 설명하자면 dot-product의 결과는 벡터의 차원이 늘어날수록 벡터 내 요소평균값에 $\sqrt{d_k}$만큼 곱한 크기가 각각의 요소로 구성된 결과 벡터가 된다. 그렇기 때문에 차원수가 늘어날수록 요소값이 커질 가능성이 증가하고 그 값이 조금만 커지거나 작아지게 되면 softmax 함수 적용 결과가 0 또는 1에 매우 수렴하게 된다.
  • softmax결과가 0 또는 1에 가깝다는 것은 기울기 값이 0에 가까워 진다는 것을 의미한다. 즉 미분을 통해 기울기 값을 구한 뒤 weight를 업데이트하는 역전파 과정에서 vanishing 현상을 부르게 된다. 즉 학습이 안된다.
  • 그렇기 때문에 결론적으로 softmax 적용 전 $\sqrt{d_k}$로 나누는 작업을 하는 것이다.

참고로 위 내용을 쫓다보면 Q, K, V가 모두 동일하다고 해석이 되지만 사실 Q, K, V는 X에 각각 다른 가중치(W)를 미리 적용해 준 결과이기 때문에 실제 Q, K, V는 서로 다른 벡터를 갖게 된다.

 

Multi-head Self-attention

  • attention value 생성의 취지는 각 단어 간 유사성에 대한 정보를 전달해 주기 위함에 있다. 하지만 모호한 문장의 경우 단 한번의 attention value 생성 과정으로는 각 단어의 유사성이 명확하게 정의되지 못할 수도 있다는 의심이 시작되어 Multi-head 라는 개념이 도입되었다.

 

Attention Value를 얻기 위해 생성된 Q, K, V를 한 묶음으로 하여 총 8 세트를 만든다. 즉 Q 8개, K 8개, V 8개를 만든다. 이때 각 (QKV)는 당연히 모두 다른 W를 적용한다. 그래서 얻은 (QKV) 한 세트를 Attention Head라고 부른다. 그리고 각 Attention Head마다 attention value(Z)를 연산하여 총 8개의 Z를 확보한다.

 

총 8개의 Z는 concat 시켜서 하나의 행렬로 만들고, 그 행렬의 shape 변경을 위한 W를 내적해서 최종 Z를 만든다. 이 최종 Z의 차원은 Multi-head attention을 진행하기 전 준비된 Q와 동일한 차원(shape)이 되도록 W를 내적한다. 이는 추후 Skip Connection 과정을 위함이며 뒤에서 설명하겠다.

📌 여기까지의 과정을 Multi-head Self-attention이라 부른다.

정리하자면 attention value를 여러번 뽑아서 단어 간 유사성 판단을 확실하게 확인한다는 취지에서 진행된 연산으로 보면 된다.

→ 이제 이렇게 되면 단 한번의 attention value를 구했을 때와 달리 여러 번 구한 attention value를 합친다는 개념이 들어가므로 이전 Attention Map처럼 표현하기 애매해 지므로, 단어 간 관계 해석이 어려워 진다.

 

Feed Forward

이제 험난했던 Multi-head attention 과정이 끝나면 추가적으로 Feed Forward 과정을 진행한다. 이 과정은 단순하게 차원의 수를 한번 늘려줬다가 ReLU를 적용한 뒤 다시 이전 차원으로 돌아오는 과정이 끝이다. → Z에 대해서 한번 더 학습할 여지는 주는 느낌이다.

 

Positional Encoding

Multi-head Attention 과정에서 놓치게 되는 부분이 바로 “단어 간 위치에 대한 정보”이다.

문장을 통째로 넣어 단어를 분리하고, 각 단어들 끼리의 유사도를 파악하는 과정에서는 더이상 각 단어가 어떤 단어 앞에 있었는지, 뒤에 있었는지에 대한 정보는 사라진다.

이를 보완하기 위해 사전에 Positional Encoding이라는 과정을 진행한다.

문장에서 각 단어의 고유 위치에 대한 정보를 담은 벡터를 생성(Positional Encoding)해서 X에 더해주는 방식으로 위치 정보를 담는다. 여기서 어떻게 Positional Encoding을 진행하는가에 대한 논문 상의 공식은 위 PE 공식과 같다. 하지만 난 무슨 말인지 이해가 안간다. 또한 이 방법 외에도 다양한 Positional Encoding 방법이 존재한다고 한다.

어쨌든 위와 같이 위치 정보를 담은 같은 shape의 벡터를 X에 더해준다는 것을 기억하자

 

Skip(Residual) Connection & Layer Norm

RNN에서 Cell State를 통해 고속도로를 뚫어준 과정과 동일하다고 볼 수 있다. 총 두 번의 Skip Connection을 진행하고 있다.

  1. Multi-head Attention 결과(Z)와 Q, K, V 중 Q(uery)에 해당하는 행렬을 더한다. 그리고나서 LayerNorm을 진행한다.
  2. Feed Forward 결과와 1번의 결과를 더한다. 그리고나서 LayerNorm을 진행한다.

BatchNorm이 아닌 LayerNorm은 행이 아닌 열을 기준으로 진행하는 Normalize에 해당한다.

LayerNorm을 진행하는 이유는 정확히 모르겠지만 경험적인 결과에 의한 것도 있으며, input 데이터 자체가 어떠한 문장으로써 가변적인 길이를 가지기 때문이라는 설명도 있다.

 


Decoder

Decoder 과정에서도 초기 X값에 positional Encoding을 더하는 작업과 X에 W를 내적해서 Q, K, V를 생성하는 과정까지는 동일함을 알 수 있다. 또한 Encoder 과정을 총 6번 진행한다는 점(논문 상에서)과 그 결과를 토대로 Decoder 과정도 총 6번 진행하는 점을 확인할 수 있다.

 

Masked Multi-Head Attention

RNN에서 공부했던 것과 같이 디코딩 과정에서는 매 단어에 대한 정답을 예측시키고 맞추는 작업을 진행해야 한다. 하지만 트랜스포머 모델은 input으로 문장 전체를 받는다는 점을 기억하자.

즉 디코딩 과정에 들어오는 input은 문장 전체가 된다. 하지만 디코딩의 “매 단어에 대한 정답을 예측시킨다.” 는 Task를 고려했을 때 문장 전체를 보여주면 안된다. 일종의 Cheating이 되기 때문이다.
만약 I Love You 에 대한 문장 번역에 대한 디코딩을 진행할 때 ‘I’를 보여준 뒤 정답을 맞추게 하고, 그 다음에는 ‘I Love’를 보여준 뒤 정답을 맞추도록 한다. 그래서 순차적으로 보여줘야 한다.
그렇기 때문에 Multi-head attention 과정에서 Softmax 직전 단계인 $\frac{QK^T}{\sqrt{dk}}$ 연산 후 위 그림과 같이 파란색 이외 부분은 -무한대로 값을 변경한다. 이렇게 하면 Softmax 과정에서 해당 위치는 0에 수렴하는 값을 갖게 되기 때문에 마스킹 효과를 주게 된다.

Encoder-Decoder Attention Layer

위 그림에서 빨간 박스에 대한 과정이다.

두 개의 화살표가 옆집에서 건너오는 모습을 볼 수 있다. 바로 인코딩 결과(Z)를 또 다시 새로운 K, V로 변환에서 들고 오는 것이다. 그리고 Q값은 Masked multi-head attention과 Skip Connection, LayerNorm의 결과에서 가져온다.

→ 이전 Vanila RNN 기반 인코더-디코더 과정을 떠올려 보면 인코딩 과정에서 매 단어 등장 시 정보를 담았던 h(hidden states)를 (여기서는 K, V)들고와서 s(여기서는 Q)와의 관계를 비교하며 참고할 정보를 선별하고, 정답을 예측하게 하는 어텐션 매커니즘이 반영되는 것을 확인할 수 있다.

 

처음으로 돌아와 인코더와 디코더 과정을 다시 말하자면 인코더와 디코더가 각각 6번씩 수행된다. 먼저 인코딩 과정을 6개의 layer로 쌓아서 순차적으로 수행한 마지막 결과(Z)를 가지고 디코딩 과정을 6번 거치는 동안 인코딩에서 얻은 Z의 key, value를 동일하게 활용하는 것이 트랜스포머의 큰 구조이다.

728x90
728x90