Mathematical Formulation

Self Attention Mechanism 수식(왼쪽), softmax 수식(오른쪽)

 

Transformer의 Self-Attention Mechanism을 수식화하면 위와 같다.

A 함수의 매개변수인 q는 1차원 벡터(소문자)이고, K와 V는 2차원 행렬(대문자)이다.

Sigma 기호의 내부 함수를 해석하면, Query를 Key와 곱해서 softmax 함수에 적용한다는 의미이다.

 

 

이전 글에서 말했듯이 embedding한 vector 전부를 concat하여 하나의 행렬 X로 만들어준다.

X와 W^Q를 Linear Transformation(선형 변환)하면 Q 행렬이 나온다.

이런 식으로 나온 Q와 K^T를 곱해서 가중치를 구하고, 이를 softmax를 적용한다.

행렬에 softmax를 적용하면 row wise 연산을 적용해, 각 row마다 softmax를 적용하는 형태가 된다.

 

마지막으로 V를 곱해서 나온 행렬 A_return(위 수식에서는 |Q| * d_n)이 나온다.

이렇게 나온 행렬 A_return은 Q의 각각의 row에 대응하는 행렬을 갖게 된다.

Q의 각 row는 단어 각각의 embedding이고, A_return의 각 row는 단어 각각의 새로운 표현 벡터라는 말이다. 

 

입력 데이터의 각 token마다 계산하지 않고, 하나의 행렬로 묶어서 계산하기 때문에 상대적으로 학습이 빠르다

실제 Transformer 구현 상에서는 동일한 shape로 mapping한 Q, K, V를 사용하기에 각 matrix의 shape는 동일하다.

 

Scaled Dot Product Attention

Attention을 수행할 때 이제껏 설명한 공식처럼 dot product를 구한다면 참으로 편하겠지만...

역시나 실제 상황에서는 약간의 문제가 발생한다.

 

수식에서 d_k는 벡터의 차원 수를 이야기한다.

QK^T는 d_k 개의 독립적인 곱셈 연산을 더한 값이고, Scaling하지 않으면 d_k가 커질수록 QK^T 값이 커지게 된다.

그럼 softmax의 지수 함수(exp)가 폭발적으로 커져버려, 조정 이후 값이 큰 값에 치중되게 나온다.

이렇게 결과가 한 쪽으로 몰리면 gradient vanishing이 발생하여, 학습이 전혀 안 되는 경우가 생긴다.

그렇기에 QK^T를 sqrt(d_k)로 나눠서 분산을 조정해야 안정적인 학습을 보장한다.

수학적으로 이야기하자면 '표준 편차로 나누어 분산이 1인 형태로 일정하게 나오게끔 조절한다'는 말과 같다.

+ Recent posts