Attention Score란? Q·K 내적부터 Softmax까지 직접 계산하기

지난 글에서는 임베딩이 토큰을 학습 가능한 벡터로 바꾸고, Transformer 층을 지나면서 문맥에 맞는 표현으로 발전한다는 점을 알아봤습니다. 그렇다면 모델은 주변 토큰 중 무엇을 얼마나 참고해야 하는지 어떻게 결정할까요? 그 출발점이 바로 Attention Score입니다.

Attention Score는 현재 처리 중인 토큰의 질문과 다른 토큰이 가진 단서를 비교한 점수입니다. Transformer에서는 이 비교를 Query와 Key의 내적으로 계산합니다. 이어서 점수를 적절한 크기로 조정하고 Softmax를 적용해 합계 1의 가중치로 바꿉니다. 이번 글에서는 작은 2차원 벡터를 사용해 이 과정을 직접 계산해 보겠습니다.

Attention은 무엇을 해결할까?

문장 “철수는 사과를 먹었다. 그것은 달콤했다”를 생각해 보겠습니다. “그것”의 의미를 이해하려면 앞부분의 “사과”를 중요하게 참고해야 합니다. 모든 단어를 똑같이 섞으면 주체인 철수, 행동인 먹었다, 대상인 사과의 역할이 흐려집니다.

Attention은 각 토큰이 다른 토큰과 얼마나 관련 있는지 점수로 계산한 뒤, 관련성이 큰 정보에는 높은 가중치를 주는 방식입니다. Transformer 원 논문은 Attention을 Query와 Key-Value 쌍을 출력 벡터로 매핑하는 함수로 설명합니다. 가중치는 Query와 각 Key의 적합도를 이용해 구하고, 출력은 Value들의 가중합으로 만듭니다.

Query, Key, Value를 역할로 이해하기

Q·K·V는 서로 완전히 다른 원본 데이터가 아닙니다. Self-Attention에서는 같은 입력 표현에 서로 다른 학습 행렬을 곱해 세 가지 관점의 벡터를 만듭니다. 이번 글에서는 생성 과정 자체보다 계산 역할에 집중합니다.

  • Query(Q): 현재 토큰이 다른 토큰에서 찾으려는 정보입니다. 검색창에 입력한 질문에 비유할 수 있습니다.
  • Key(K): 각 토큰이 어떤 정보와 연결될 수 있는지 나타내는 비교용 특징입니다. 검색 색인에 가깝습니다.
  • Value(V): 점수 계산이 끝난 뒤 실제로 가져와 섞을 내용입니다.

Query와 Key는 “얼마나 관련 있는가”를 계산하는 데 사용되고, Value는 “관련성이 확인되었을 때 무엇을 가져올 것인가”를 담당합니다. Key와 Value가 같은 토큰에서 만들어지더라도 역할을 구분해야 Attention의 흐름을 정확히 이해할 수 있습니다.

1단계: Query와 Key를 내적으로 비교하기

설명을 위해 현재 토큰의 Query와 세 토큰의 Key를 다음처럼 정하겠습니다. 실제 모델은 훨씬 높은 차원을 사용하지만 계산 원리는 같습니다.

Q  = [1, 1]
K₁ = [1, 0]
K₂ = [1, 1]
K₃ = [0, 1]

내적은 같은 위치의 숫자끼리 곱한 뒤 모두 더합니다.

Q · K₁ = 1×1 + 1×0 = 1
Q · K₂ = 1×1 + 1×1 = 2
Q · K₃ = 1×0 + 1×1 = 1

따라서 원시 Attention Score는 [1, 2, 1]입니다. 두 번째 Key가 Query와 가장 잘 맞으므로 가장 큰 점수 2를 받았습니다. 내적은 대응하는 방향이 비슷할수록 커지는 경향이 있지만 벡터 크기의 영향도 받습니다. 그래서 이 점수를 곧바로 확률이나 관련성 백분율로 읽어서는 안 됩니다.

2단계: 왜 √dₖ로 나눌까?

Transformer가 사용하는 방식은 Scaled Dot-Product Attention, 즉 스케일된 내적 Attention입니다. 내적한 값을 그대로 Softmax에 넣지 않고 Key 벡터의 차원 수 dₖ의 제곱근으로 나눕니다.

scaled score = (Q · K) / √dₖ

우리 예제의 Key는 숫자 두 개를 가진 2차원 벡터이므로 dₖ=2이고 √2는 약 1.414입니다.

[1, 2, 1] ÷ √2
≈ [0.707, 1.414, 0.707]

차원이 커지면 여러 곱셈 결과가 더해지면서 내적값의 크기도 커질 수 있습니다. 큰 값들이 Softmax에 들어가면 출력이 지나치게 한쪽으로 몰리고 학습에 필요한 기울기가 매우 작아질 수 있습니다. Transformer 논문은 이를 완화하기 위해 내적값을 √dₖ로 나눕니다. 이는 벡터를 단위 길이로 만드는 코사인 정규화와는 목적과 계산이 다릅니다.

3단계: Softmax로 가중치 만들기

스케일된 점수는 여전히 음수나 큰 양수가 될 수 있고 합도 1이 아닙니다. 지난 글에서 다룬 Softmax를 적용하면 각 값은 0과 1 사이가 되고 전체 합은 1이 됩니다.

Softmax([0.707, 1.414, 0.707])
≈ [0.2485, 0.5030, 0.2485]

두 번째 토큰은 약 0.5030의 가장 높은 가중치를 받고, 첫 번째와 세 번째 토큰은 각각 약 0.2485를 받습니다. 여기서 0.5030은 “의미가 50.30% 동일하다”는 뜻이 아닙니다. 현재 Query가 이번 Attention 계산에서 Value들을 어떤 비율로 섞을지를 나타내는 상대적 가중치입니다.

점수 차이가 작으면 가중치가 비교적 고르게 분산되고, 차이가 크면 특정 토큰에 집중됩니다. Softmax는 입력 순서를 보존하므로 가장 큰 점수는 가장 큰 가중치가 됩니다. 다만 어떤 토큰에 집중할지는 학습된 Q·K 변환과 입력 문맥에 따라 달라집니다.

4단계: 가중치만큼 Value 섞기

Attention의 목적은 점수표를 만드는 데서 끝나지 않습니다. 계산된 가중치를 각 Value에 곱한 다음 모두 더해 새로운 문맥 벡터를 만듭니다.

출력 = 0.2485V₁ + 0.5030V₂ + 0.2485V₃

두 번째 Value가 가장 큰 비율로 반영되지만 다른 두 Value도 사라지지 않습니다. 결과 벡터에는 현재 토큰 자체의 표현뿐 아니라 관련 있다고 판단된 주변 토큰의 정보가 함께 담깁니다. Transformer는 이 연산을 한 Query씩 순서대로 처리하기보다 여러 Query를 행렬 Q에, Key와 Value를 행렬 K와 V에 묶어 병렬로 계산합니다.

Attention(Q, K, V)
= Softmax(QKᵀ / √dₖ)V

QKᵀ는 모든 Query와 모든 Key의 내적 점수를 한꺼번에 담은 행렬입니다. 행마다 Softmax를 적용하면 각 Query가 모든 Key를 바라보는 가중치 분포가 만들어집니다. 마지막에 V를 곱하면 각 Query에 필요한 문맥 벡터가 한 번에 계산됩니다.

마스킹은 언제 점수 계산에 들어갈까?

다음 토큰을 생성하는 디코더는 아직 나오지 않은 미래 토큰을 보면 안 됩니다. 이때 미래 위치의 점수에 매우 큰 음수, 구현상 흔히 음의 무한대에 해당하는 값을 더한 뒤 Softmax를 적용합니다. 지수화된 값이 사실상 0이 되므로 해당 위치의 Attention 가중치도 0이 됩니다.

문장 길이를 맞추기 위해 넣은 패딩 토큰도 비슷한 방식으로 제외할 수 있습니다. 마스크는 Q·K의 관계를 새로 계산하는 장치라기보다, 참고하면 안 되는 연결을 Softmax 이전에 차단하는 규칙입니다.

Attention Score를 해석할 때 주의할 점

  • 가중치가 곧 완전한 설명은 아닙니다. 높은 Attention 값은 해당 계산에서 많이 반영되었다는 뜻이지만, 모델의 최종 판단 원인을 전부 증명하지는 않습니다.
  • 한 층과 한 Head만 보면 일부 관계만 보입니다. 실제 Transformer에는 여러 층과 여러 Attention Head가 있으며 서로 다른 관계를 학습할 수 있습니다.
  • 입력 길이가 늘면 점수 행렬도 커집니다. 토큰 수가 n이면 기본적인 Self-Attention의 점수 행렬은 n×n 크기가 됩니다.
  • 숫자는 학습된 투영에 따라 달라집니다. 이번 예제의 Q와 K는 원리를 보여주기 위한 값이며 실제 모델이 동일한 벡터를 사용한다는 뜻은 아닙니다.

정리

Attention Score는 현재 토큰의 Query와 각 토큰의 Key가 얼마나 잘 맞는지를 나타내는 비교 점수입니다. Q와 K의 내적을 계산하고, √dₖ로 나누어 크기를 안정화한 뒤, Softmax로 합계 1의 가중치를 만듭니다. 마지막에는 이 가중치만큼 Value를 섞어 새로운 문맥 벡터를 얻습니다.

이번 계산에서 가장 중요한 흐름은 내적 → 스케일링 → Softmax → Value의 가중합입니다. 다음 글에서는 한 단계 앞쪽으로 이동해, 같은 임베딩에서 출발한 Q·K·V가 각각 어떤 가중치 행렬을 통해 만들어지는지 살펴보겠습니다.

댓글

이 블로그의 인기 게시물

AI의 학습 과정

AI란 무엇일까?

머신러닝과 딥러닝이란?