본문 바로가기
딥러닝/트랜스포머

트랜스포머 시리즈 3편 Q, K, V

by 객잔주인 2024. 2. 4.

 

이번 포스팅에서는 트랜스포머에서의 셀프 어텐션과 유명한 식 $$Attention(Q, K, V) = Softmax(QK^{T})V$$에 대해 알아보겠습니다. 알고 계셨다면 좋고 모르고 계셨더라도 괜찮습니다. 이 식이 어떤 의미를 가지고 있고 어떻게 계산되는지 설명하겠습니다

 

Query, Key, Value

식에 대해 설명하기에 앞서 트랜스포머에서 어텐션이 어떻게 사용되는지 알아야 합니다

 

앞서 두 편의 포스팅에서 seq2seq에서의 어텐션은 은닉 상태 벡터간의 내적 연산을 수행하고, 셀프 어텐션은 각 단어의 임베딩 벡터간의 내적 연산을 한다고 설명했습니다

 

트랜스포머는 임베딩 벡터나 은닉 상태 벡터를 사용하지 않고 쿼리(Query) 벡터, 키(Key) 벡터, 밸류(Value) 벡터라는 것을 사용합니다

 

이 벡터들을 얻는 방법은 다음과 같습니다:

  • 단어의 임베딩 벡터와 쿼리 가중치 행렬 $W_{Q}$를 곱하여 쿼리 벡터 $Q$를 얻습니다
  • 단어의 임베딩 벡터와 키 가중치 행렬 $W_{K}$를 곱하여 키 벡터 $K$를 얻습니다
  • 단어의 임베딩 벡터와 밸류 가중치 행렬 $W_{V}$를 곱하여 밸류 벡터 $Q$를 얻습니다

여기서 단어의 임베딩 벡터는 값이 정해져있는 벡터이지만 쿼리/키/밸류 가중치 행렬($W_{Q}, W_{K}, W_{V}$)은 모델 학습 중에 업데이트 되므로 변하는 값입니다

 

쿼리 벡터, 키 벡터, 밸류 벡터는 각 단어(혹은 토큰) 마다 하나씩 존재합니다. 즉, I love you라는 문장이 입력되었다면 I에 대한 쿼리 벡터, 키 벡터, 밸류 벡터가 있고 love에 대한 쿼리 벡터, 키 벡터, 밸류 벡터가 있으며, 마찬가지로 you도 쿼리 벡터, 키 벡터, 밸류 벡터를 하나씩 가집니다

 

각 단어의 쿼리 벡터를 행을 기준으로 쌓으면 쿼리 벡터에 대한 행렬을 얻을 수 있습니다. 키, 밸류도 마찬가지로 각 단어의 키 벡터, 밸류 벡터를 행을 기준으로 쌓아 키 벡터의 행렬, 밸류 벡터의 행렬을 얻을 수 있습니다

 

입력에 대해 쿼리 행렬, 키 행렬, 밸류 행렬을 얻는 과정을 나타낸 그림

 

어텐션 구하기

이 세개의 행렬로 어텐션 연산을 하게 되는데 그것이 처음에 보았던 식 $Attention(Q, K, V) = Softmax(QK^{T})V$에서 일어나는 일입니다. $Attention(Q, K, V)$는 쿼리 / 키 / 밸류 행렬을 이용해 어텐션을 구하는 함수라는 뜻이고 ($f(x)$가 x를 이용해 f라는 함수 값을 구하는 것처럼), $Softmax(QK^{T})V$는 $Q$와 $K^{T}$의 행렬곱을 한 결과에 소프트맥스를 취해주고, 그 결과를 다시 $V$와 행렬곱을 한다는 의미입니다. 여기서 $K^{T}$는 $K$의 전치행렬(Transposed matrix)를 말합니다

 

$Softmax(QK^{T})V$의 계산 과정을 나타낸 그림

 

$Softmax(QK^{T})V$ 식 이해하기

다시 이전 포스팅을 상기해보겠습니다. 셀프 어텐션에서 어텐션 스코어를 구하기 위해 우리는 ⓵ 단어간의 임베딩 벡터의 내적 연산을 수행했습니다. ⓶ 그렇게 나온 어텐션 스코어들에 소프트맥스 함수를 취해 가중치를 얻었습니다. 그리고 마지막으로 ⓷ 가중치들을 각 단어의 임베딩 벡터와 곱해 셀프 어텐션의 결과물을 얻었습니다

트랜스포머에서의 셀프 어텐션도 마찬가지로 ⓵ ($QK^{T}$) 쿼리 벡터와 키 벡터의 내적 연산을 수행하여 어텐션 스코어를 얻고 ⓶ ($Softmax(QK^{T})$) 어텐션 스코어에 소프트맥스 함수를 취해 가중치를 얻었으며 ⓷ 가중치들을 각 단어의 밸류 벡터와 곱해 셀프 어텐션의 결과물을 얻었습니다

 

단지 차이점이라면 앞선 포스팅에서는 단어의 임베딩 벡터를 이용해 한 단어의 셀프 어텐션을 구하는 과정을 보여드렸다면 이번 포스팅에서는 쿼리/키/밸류 벡터를 이용했고 행렬을 이용해 한번에 모든 입력에 대해 셀프 어텐션 과정을 수행했습니다


이번 포스팅에서는 트랜스포머에서의 셀프어텐션에 대해 알아보았습니다

 

다음 포스팅부터는 본격적으로 트랜스포머의 구조에 대해 알아보겠습니다

 

감사합니다