Attention

이정훈·2026년 1월 5일

[Deep Learning] Transformer의 핵심, Attention의 Q, K, V 완벽 이해하기

어텐션(Attention) 메커니즘을 공부할 때 가장 처음 마주치는 난관이자, 가장 헷갈리는 개념이 바로 Q(Query), K(Key), V(Value)입니다.

이 글에서는 복잡한 수식 대신, 우리가 매일 사용하는 구글 검색도서관 시스템에 비유하여 이 3가지 개념을 직관적으로 정리해보겠습니다.


1. 직관적 비유: 구글 검색 시스템

어텐션의 작동 원리는 검색 엔진과 놀랍도록 닮아 있습니다. 여러분이 구글에서 자료를 찾는 상황을 상상해 보세요.

Query (질문): 검색창에 입력하는 단어

예: "맛있는 사과 고르는 법"

  • 역할: "나 지금 이거 궁금해, 관련된 정보 있어?"라고 물어보는 주체입니다.
  • 현재 처리하고자 하는 나 자신(토큰)의 상태를 나타냅니다.

Key (키워드/제목): 검색 결과의 제목들

예: "사과 재배법", "아이폰 수리", "백설공주 줄거리", "맛있는 과일 고르기"

  • 역할: "내 내용은 이런 거야"라고 자신의 정체성을 알리는 꼬리표입니다.
  • Query와 얼마나 관련이 있는지 확인(매칭)하기 위한 용도입니다.

Value (내용): 웹사이트의 실제 내용

예: 클릭했을 때 나오는 글 본문

  • 역할: "검색어가 일치하면 이 내용을 가져가"라고 내어주는 실제 정보입니다.
  • 결국 우리가 얻고자 하는 알맹이 값입니다.

[작동 과정]

  1. Q(내 검색어)K(웹사이트 제목)를 비교합니다. (유사도 계산 = 내적)
    • "맛있는 사과..."(Q) vs "아이폰 수리"(K) \rightarrow 관련 없음 (점수 낮음)
    • "맛있는 사과..."(Q) vs "맛있는 과일..."(K) \rightarrow 관련 있음! (점수 높음)
  2. 관련도(점수)가 높은 K를 찾습니다.
  3. 그 K에 연결된 V(실제 내용)를 가져와서 내 정보에 반영(Weighted Sum)합니다.

2. 문장 예시로 보는 실제 작동

다음과 같은 문장이 있다고 가정해 봅시다.

"나는 [강]가에서 낚시를 했다."

여기서 "강"이라는 단어가 문맥을 파악하기 위해 어텐션을 수행하는 과정입니다. (한국어에서 '강'은 River일 수도, 성씨 Kang일 수도 있으니까요.)

1단계: Query (Q) - "강"

"강"이 질문을 던집니다.

"내 주변 단어들아, 나랑 관련된 애 누구야? 나 지금 River인지 Surname인지 헷갈려."

2단계: Key (K) - 주변 단어들의 대답

주변 단어들이 자신의 명찰(Key)을 보여줍니다.

  • "나는": "난 주어(Subject)야." (관련도 낮음)
  • "낚시를": "난 물고기 잡는 행위(Fishing)야." (관련도 매우 높음!)
  • "했다": "난 동사야." (관련도 낮음)

3단계: 매칭 (Dot Product & Softmax)

Q("강")는 K("낚시를")와 계산했을 때 가장 높은 매칭 점수를 기록합니다.

4단계: Value (V) - 정보 가져오기

점수가 가장 높은 "낚시를"의 Value(V)를 중점적으로 가져옵니다.

  • "낚시를"의 V에는 "물, 자연, 취미" 같은 정보가 담겨 있습니다.
  • 결과적으로 "강"은 이 정보를 흡수해서 "흐르는 물(River)"이라는 문맥적 의미를 확정 짓습니다.

3. 핵심 질문: 왜 굳이 벡터를 3개(Q, K, V)로 나눌까?

그냥 단어 벡터 XX 하나로 다 계산하면 안 될까요? 안 됩니다. 역할이 다르기 때문입니다.

① 내가 찾을 때(Q)와 보여줄 때(K)의 모습이 다르다

소개팅을 한다고 가정해 봅시다.

  • Q (나의 이상형): "재밌고 활발한 사람"을 찾음.
  • K (나의 매력 포인트): "나는 조용하고 잘 들어주는 사람"이라고 홍보함.

내가 상대를 찾는 기준(Q)과, 남에게 보여주는 내 특성(K)은 다를 수 있습니다. 학습 효율을 위해 이를 분리합니다.

② 매칭용 정보(K)와 실제 알맹이(V)도 다르다

  • K (책 표지): "성공하는 법" (화려한 제목으로 시선을 끔)
  • V (책 내용): "일찍 일어나라" (실제 담고 있는 정보)

어텐션 점수를 계산할 때는 매칭에 특화된 벡터(K)를 쓰고, 정보를 섞을 때는 의미 전달에 특화된 벡터(V)를 쓰는 것이 효율적입니다.


4. 요약 정리

개념역할비유 (검색 엔진)비유 (문장 속 단어)
Query (Q)질문하는 역할검색창에 친 검색어현재 단어: "나랑 친한 애 누구야?"
Key (K)대조되는 역할검색 결과의 제목다른 단어들: "난 이런 단어야." (매칭용)
Value (V)제공되는 정보클릭하면 나오는 내용다른 단어들: "매칭됐으니 내 정보를 줄게." (내용물)

수식으로

이제 Transformer 논문(Attention Is All You Need)의 수식이 조금 더 친근하게 느껴지실 겁니다.

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V) = \text{softmax}\left(\frac{Q K^T}{\sqrt{d_k}}\right) V
  1. QQKK를 곱해서(내적) 각 단어(벡터)간 유사도 점수를 내고 매핑된 Q, K space에서의 similarity를 나타낸다
  2. 그 점수(확률)만큼 VV를 가져와서 섞는다(Weighted Sum).

코드 예제
  class SelfAttention_v2(nn.Module):

    def __init__(self, d_in, d_out, qkv_bias=False):
        super().__init__()
        self.W_query = nn.Linear(d_in, d_out, bias=qkv_bias)
        self.W_key   = nn.Linear(d_in, d_out, bias=qkv_bias)
        self.W_value = nn.Linear(d_in, d_out, bias=qkv_bias)

    def forward(self, x):
        keys = self.W_key(x)
        queries = self.W_query(x)
        values = self.W_value(x)

        attn_scores = queries @ keys.T
        attn_weights = torch.softmax(attn_scores / keys.shape[-1]**0.5, dim=-1)

        context_vec = attn_weights @ values
        return context_vec

torch.manual_seed(789)
sa_v2 = SelfAttention_v2(d_in, d_out)
print(sa_v2(inputs))

profile
AngDDo

0개의 댓글