Q·K·V는 어디서 만들어질까? 가중치 행렬로 만드는 원리
지난 글에서는 Query와 Key의 내적으로 Attention Score를 만들고, √dₖ로 나눈 뒤 Softmax를 적용해 Value를 섞는 과정을 계산했습니다. 그런데 당시에는 Q·K·V 벡터가 이미 준비되어 있다고 가정했습니다. 이 세 벡터는 처음부터 따로 존재하는 것일까요?
Self-Attention에서는 같은 입력 표현 X에 서로 다른 가중치 행렬을 곱해 Query, Key, Value를 만듭니다. 하나의 토큰을 ‘무엇을 찾는가’, ‘어떤 정보와 연결되는가’, ‘실제로 전달할 내용은 무엇인가’라는 세 관점으로 바꾸는 과정입니다. 이번 글에서는 이 선형 투영을 작은 행렬로 직접 계산해 보겠습니다.
Q·K·V의 출발점은 같은 입력 X다
문장이 토큰으로 나뉘면 각 토큰은 임베딩 벡터로 변환됩니다. 여기에 위치 정보가 더해지고, 더 깊은 Transformer 층이라면 이전 층의 출력이 다음 층의 입력이 됩니다. 이렇게 Attention 층으로 들어오는 토큰별 표현을 X라고 하겠습니다.
토큰이 n개이고 각 표현의 크기가 dmodel이라면 X의 모양은 보통 n×dmodel입니다. 한 행은 토큰 하나, 한 열은 표현의 한 차원에 해당합니다. Self-Attention에서는 이 동일한 X로부터 다음 세 행렬을 계산합니다.
Q = XWQ
K = XWK
V = XWV
WQ, WK, WV는 사람이 미리 의미를 정해 넣은 표가 아니라 학습되는 가중치 행렬입니다. 학습 중 최종 예측의 오차가 역전파되면 세 행렬의 값도 조금씩 바뀝니다. 그 결과 모델은 주어진 과제에 도움이 되는 질문 관점, 비교 기준, 전달 내용을 스스로 형성합니다.
왜 같은 벡터를 그대로 세 번 쓰지 않을까?
입력 벡터를 Q·K·V에 그대로 사용해도 수학적 계산은 가능합니다. 그러나 세 역할에 서로 다른 투영을 사용하면 모델이 비교할 특징과 전달할 특징을 분리할 수 있습니다.
- Query는 현재 위치가 주변에서 찾으려는 특징을 강조합니다.
- Key는 각 위치가 어떤 질문에 잘 반응할지를 나타냅니다.
- Value는 관련성이 결정된 뒤 실제 출력에 섞을 정보를 담습니다.
예를 들어 대명사의 대상을 찾는 Head라면 Query는 ‘앞에서 지칭할 명사가 필요한가’를 나타내고, Key는 ‘나는 명사 후보인가’를 구분하는 방향으로 학습될 수 있습니다. Value에는 그 토큰의 의미나 문법적 정보가 담길 수 있습니다. 이는 이해를 위한 직관이며 실제 벡터 차원 하나하나가 이런 이름으로 깔끔하게 분리된다는 뜻은 아닙니다.
선형 투영이란?
투영(Projection)은 입력 벡터를 다른 좌표 표현으로 바꾸는 연산입니다. Transformer의 Q·K·V 생성에서는 기본적으로 행렬곱을 사용하므로 선형 투영이라고 부릅니다. 입력 x에 가중치 행렬 W를 곱하면 각 출력 성분은 입력 성분들의 가중합이 됩니다.
x = [x₁, x₂]
W = [[w₁₁, w₁₂],
[w₂₁, w₂₂]]
xW = [x₁w₁₁ + x₂w₂₁,
x₁w₁₂ + x₂w₂₂]
같은 x라도 W의 값이 다르면 결과 벡터의 방향과 크기가 달라집니다. Q·K·V가 서로 다른 정보를 새로 발명하는 것이 아니라, 동일한 입력에 담긴 정보를 각 역할에 유용한 방식으로 다시 조합한다고 이해하면 됩니다.
작은 행렬로 Q·K·V 직접 만들기
하나의 토큰 표현을 x=[1, 2]라고 하겠습니다. 이해를 위해 세 가중치 행렬도 2×2로 단순화합니다.
WQ = [[1, 0],
[0, 1]]
WK = [[1, 1],
[0, 1]]
WV = [[1, 0],
[1, 1]]
Query 계산
Q = xWQ
= [1×1 + 2×0, 1×0 + 2×1]
= [1, 2]
WQ가 단위행렬이므로 이 예제의 Query는 입력과 같습니다.
Key 계산
K = xWK
= [1×1 + 2×0, 1×1 + 2×1]
= [1, 3]
Value 계산
V = xWV
= [1×1 + 2×1, 1×0 + 2×1]
= [3, 2]
출발점은 모두 [1, 2]였지만 결과는 Q=[1, 2], K=[1, 3], V=[3, 2]로 달라졌습니다. 이 숫자들은 설명을 위해 선택한 값입니다. 실제 모델에서는 가중치가 훈련을 통해 정해지며 차원도 훨씬 큽니다.
문장 전체는 어떻게 한꺼번에 계산할까?
실제 Self-Attention은 토큰 하나만 처리하지 않습니다. 각 토큰의 입력 벡터를 X의 행으로 쌓은 뒤 같은 WQ, WK, WV를 한 번씩 곱합니다. 같은 Attention Head 안에서는 모든 토큰이 동일한 세 가중치 행렬을 공유합니다.
X = [x₁
x₂
x₃]
Q = XWQ, K = XWK, V = XWV
이렇게 얻은 Q의 각 행은 해당 토큰의 Query이고, K와 V의 같은 행은 같은 토큰에서 나온 Key와 Value입니다. 이후 QKT를 계산하면 모든 Query와 모든 Key의 내적이 들어 있는 n×n 점수 행렬이 만들어집니다. 지난 글의 한 Query 대 세 Key 계산을 문장 전체로 확장한 모습입니다.
행렬의 크기는 어떻게 맞을까?
X가 n×dmodel이고 WQ와 WK가 dmodel×dk라면 Q와 K는 n×dk가 됩니다. WV가 dmodel×dv라면 V는 n×dv입니다.
X : n × d_model
WQ : d_model × d_k → Q : n × d_k
WK : d_model × d_k → K : n × d_k
WV : d_model × d_v → V : n × d_v
Q와 K의 마지막 차원 dk가 같아야 내적할 수 있습니다. 반면 V의 차원 dv는 최종 출력에 전달할 정보의 폭을 결정합니다. Transformer 원 논문도 각 Attention Head가 Q·K·V를 서로 다른 학습된 선형 투영으로 만든다고 설명합니다.
Multi-Head에서는 가중치 행렬도 여러 세트다
Multi-Head Attention은 동일한 Q·K·V 계산 하나를 그대로 복사하는 것이 아닙니다. 각 Head는 자기만의 WQ, WK, WV를 가집니다. 따라서 같은 입력 X를 보더라도 Head마다 다른 표현 공간으로 투영할 수 있습니다.
한 Head는 가까운 단어 사이의 문법 관계에, 다른 Head는 멀리 떨어진 주어나 대명사의 관계에 유용한 패턴을 학습할 수 있습니다. 다만 Head의 역할을 사람이 사전에 지정하는 것은 아니며, 모든 Head가 명확하고 고정된 언어학적 기능을 갖는다고 단정할 수도 없습니다.
각 Head의 Attention 결과는 이어 붙인 뒤 출력 가중치 행렬 WO로 다시 투영됩니다. 이 부분은 이후 Multi-Head Attention 심화 글에서 계산 구조와 함께 자세히 다루겠습니다.
WQ·WK·WV는 어떻게 학습될까?
세 행렬은 Attention Score만 따로 보고 학습되는 것이 아닙니다. 모델이 다음 토큰 예측이나 번역 같은 최종 목표를 수행하고 손실을 계산하면, 역전파가 출력층부터 Transformer 내부까지 오차 신호를 전달합니다. WQ·WK·WV도 이 신호에 따라 예측 오류를 줄이는 방향으로 갱신됩니다.
그래서 Q·K·V의 의미는 데이터와 학습 목표에 따라 달라집니다. 초기에는 무작위에 가까운 투영이지만 학습이 반복되면 필요한 토큰을 찾고 유용한 정보를 전달하는 구조가 형성됩니다. Attention 가중치만 따로 저장하는 것이 아니라, 적절한 가중치가 나오도록 만드는 투영 행렬 자체를 배우는 것입니다.
자주 생기는 오해 정리
- Q·K·V는 토큰 종류가 아닙니다. 하나의 토큰 표현을 세 역할로 투영한 벡터입니다.
- Q·K·V가 항상 서로 다른 차원인 것은 아닙니다. 구현에서는 dk와 dv를 같게 정할 수도 있지만 역할과 가중치는 다릅니다.
- WQ·WK·WV는 임베딩 표와 별개의 매개변수입니다. 임베딩은 토큰 ID를 초기 벡터로 바꾸고, 투영 행렬은 층에 들어온 표현을 Attention 역할에 맞게 변환합니다.
- Query가 자연어 질문이라는 뜻은 아닙니다. 검색 비유는 역할을 이해하기 위한 설명이며 실제 Query는 숫자 벡터입니다.
정리
Self-Attention의 Q·K·V는 같은 입력 X에 서로 다른 학습 가중치 행렬 WQ·WK·WV를 곱해 만듭니다. Query는 찾을 특징, Key는 비교할 특징, Value는 전달할 내용을 담당합니다. 서로 다른 투영 덕분에 모델은 비교에 필요한 정보와 출력에 섞을 정보를 분리해 학습할 수 있습니다.
이제 입력에서 Q·K·V가 만들어지는 과정과 Q·K 내적으로 가중치를 만드는 과정을 모두 연결했습니다. 다음 글에서는 여러 토큰으로 이루어진 짧은 문장을 사용해 Q·K·V 생성부터 점수 행렬, 마스킹, Softmax, Value 가중합까지 Self-Attention 전체 과정을 한 번에 계산해 보겠습니다.
댓글
댓글 쓰기