쿼리·키·값 Query, Key, Value
Query, Key, and Value · QKV · Query-Key-Value
어텐션에서 무엇을 찾을지 나타내는 쿼리와 비교 기준인 키, 선택된 정보를 전달하는 값으로 입력 표현을 투영한 세 집합이다.
개념과 원리
섹션 제목: “개념과 원리”개요와 핵심 정의
섹션 제목: “개요와 핵심 정의”어텐션에서 무엇을 찾을지 나타내는 쿼리와 비교 기준인 키, 선택된 정보를 전달하는 값으로 입력 표현을 투영한 세 집합이다.
어텐션 함수는 쿼리와 키의 유사도로 가중치를 만들고 그 가중치로 값 벡터를 합성한다. 이름은 검색 시스템의 질의·색인·내용 관계를 비유하지만 실제로는 학습된 선형 투영 결과다.
배경과 설명 범위
섹션 제목: “배경과 설명 범위”셀프 어텐션에서는 Q·K·V가 같은 입력에서 만들어지고, 크로스 어텐션에서는 쿼리와 키·값의 원천이 다르다. 멀티헤드 어텐션은 표현 차원을 여러 헤드로 나누어 각기 다른 투영과 관계를 학습한다.
이 문서는 표제어의 일반적 범위와 인접 개념을 외부 백과로 대조하되, 핵심 정의와 기술적 주장은 논문·표준·공식 문서를 기준으로 재서술한다. 제품별 구현 차이는 보편 정의와 분리해 기록한다.
작동 원리
섹션 제목: “작동 원리”scaled dot-product attention은 softmax(QKᵀ/√dₖ)V로 표현된다. √dₖ로 나누는 과정은 차원이 커질 때 내적 크기가 지나치게 커지는 현상을 완화한다. 마스크는 특정 키 위치가 가중치 계산에 참여하지 못하게 한다.
원리를 검증할 때는 입력, 중간 상태, 출력과 실패 조건을 분리한다. 결과값 하나만 확인하지 않고 어떤 가정과 변환을 거쳤는지 관찰 가능한 기록으로 남겨야 다른 구현과 비교할 수 있다.
관련성을 계산하는 세 가지 투영
섹션 제목: “관련성을 계산하는 세 가지 투영”어텐션에서 각 입력 표현은 서로 다른 학습 행렬을 거쳐 쿼리, 키, 값 벡터가 된다. 쿼리는 현재 위치가 찾는 정보의 관점, 키는 각 위치가 제공할 수 있는 정보의 색인, 값은 실제로 집계할 내용으로 이해할 수 있다. 쿼리와 모든 키의 내적을 계산하고 키 차원의 제곱근으로 나눈 뒤 softmax를 적용하면 합이 1인 가중치가 된다. 이 가중치로 값 벡터의 가중합을 구해 현재 위치의 출력 표현을 만든다. 스케일링은 차원이 커질 때 내적 크기가 커져 softmax가 지나치게 포화되는 것을 완화한다.
쿼리와 키가 같은 입력에서 나오면 자기 어텐션이고, 쿼리는 한 시퀀스에서 키와 값은 다른 시퀀스에서 오면 교차 어텐션이다. 디코더의 인과 마스크는 현재 위치가 미래 토큰의 키를 보지 못하게 한다. 패딩 마스크는 실제 토큰이 아닌 위치에 가중치가 가는 것을 막는다. 마스크 값과 형상이 잘못되면 실행은 되더라도 미래 정보 누출이나 패딩 오염이 생길 수 있다. 어텐션 가중치는 입력에 따른 동적 혼합 계수이며, 값 투영과 이후 층을 거치므로 가중치 하나만으로 모델의 최종 인과적 설명을 단정할 수 없다.
구성 요소와 처리 흐름
섹션 제목: “구성 요소와 처리 흐름”핵심 계약은 배치, 시퀀스 길이, 헤드 수, 헤드 차원과 마스크 shape다. 추론에서는 이전 토큰의 K·V를 캐시에 보관해 다시 계산하지 않는다. 멀티쿼리·그룹드쿼리 어텐션은 K·V 헤드를 공유해 캐시 비용을 줄인다.
구현 비교에서는 기본값에 기대지 않고 인터페이스, 자료형 또는 스키마, 버전과 오류 처리 방식을 명시한다. 같은 명칭의 기능도 라이브러리와 서비스에 따라 경계 조건이 다를 수 있으므로 작은 기준 사례를 고정한다.
다중 헤드와 텐서 형상
섹션 제목: “다중 헤드와 텐서 형상”다중 헤드 어텐션은 표현 차원을 여러 부분 공간으로 나누어 각 헤드가 별도의 쿼리·키·값 투영과 관련성 패턴을 학습하게 한다. 헤드 출력을 이어 붙인 뒤 출력 투영으로 섞는다. 모델 차원은 보통 헤드 수로 나누어져 헤드 차원을 만들며, 배치·헤드·질의 길이·키 길이 축의 순서를 명확히 해야 한다. 쿼리 길이와 키 길이는 교차 어텐션에서 다를 수 있고, 값 차원도 구현 계약을 확인해야 한다. 브로드캐스팅되는 마스크가 의도한 배치와 헤드에 적용되는지 작은 예제로 검사한다.
PyTorch MultiheadAttention은 쿼리, 키, 값 입력과 마스크, 배치 축 설정을 받으며 조건이 맞으면 최적화된 scaled dot product attention 경로를 사용할 수 있다. 추론 전용 자기 어텐션에서 입력 형상, 평가 모드, 그래디언트 비활성화 같은 조건이 빠른 경로 선택에 영향을 줄 수 있다. 성능을 위해 어텐션 가중치 반환을 끄는 옵션도 있다. 라이브러리 버전마다 허용 마스크 자료형과 빠른 커널 조건이 달라질 수 있으므로 API 문서와 프로파일러를 확인한다. 출력 값이 맞는지와 특정 최적화가 실제 선택되었는지를 별도 시험한다.
활용과 검증
섹션 제목: “활용과 검증”활용 분야와 선택 기준
섹션 제목: “활용 분야와 선택 기준”텍스트 생성, 번역, 검색 결합 생성, 이미지-텍스트 결합에 사용된다. 분석할 때는 어텐션 가중치를 곧바로 설명 가능성으로 간주하지 말고, 마스킹과 투영, 잔차 연결까지 포함한 전체 경로를 본다.
도입 여부는 정확도만이 아니라 지연시간, 비용, 설명 가능성, 데이터 요구량과 실패 시 피해를 함께 비교해 결정한다. 단순한 기준선과 실제 업무 데이터에서의 검증 결과가 복잡한 구성을 정당화해야 한다.
어텐션 변형을 고르는 기준
섹션 제목: “어텐션 변형을 고르는 기준”인코더의 양방향 자기 어텐션은 입력 전체를 함께 이해하는 분류와 표현 학습에 적합하고, 디코더의 인과 자기 어텐션은 미래 토큰을 가려 생성 확률을 올바르게 만든다. 인코더-디코더의 교차 어텐션은 번역이나 요약에서 출력 위치가 입력 표현을 조회하게 한다. 긴 문맥의 계산이 문제라면 국소·희소 패턴, 저랭크 근사, 상태 공간 모델과 메모리 검색 등 대안을 비교하되, 필요한 장거리 의존성과 실제 하드웨어 효율을 평가한다.
생성 추론에서는 과거 키와 값을 KV 캐시에 저장해 매 토큰마다 다시 계산하지 않는다. 다중 쿼리 어텐션은 여러 쿼리 헤드가 키·값 헤드를 공유하고, 그룹 쿼리 어텐션은 그 중간 형태로 캐시 크기와 메모리 대역폭을 줄인다. 공유가 많아지면 표현 용량과 품질에 영향을 줄 수 있으므로 모델 학습부터 설계되거나 적절한 변환이 필요하다. 단순히 실행 옵션으로 헤드 수를 바꿀 수 있는 것은 아니다. 서빙에서는 문맥 길이별 품질, KV 메모리와 토큰 지연을 함께 비교한다.
어텐션 구조를 비교할 때 파라미터 수만 같게 맞추는 것으로 충분하지 않다. 학습 토큰, 데이터, 최적화, 문맥 길이와 추론 커널을 통제하고 짧은 입력과 긴 입력의 품질을 나눈다. 특정 변형이 메모리를 줄여 더 큰 배치나 문맥을 가능하게 했다면 직접 효과와 자원 재배분 효과를 구분해 보고한다.
수치 사례: 한 쿼리와 세 키의 스케일된 점수가 (2,1,0)이라면 softmax는 첫 키에 가장 큰 가중치를 주지만 나머지 값을 완전히 버리지는 않는다. 첫 위치를 마스킹하면 softmax 전에 그 점수를 선택 불가능한 값으로 바꾸고 남은 위치 사이에서 다시 정규화해야 한다. softmax 뒤에 0을 곱하면 가중치 합이 1이 아니게 되어 다른 결과를 만든다.
마스크 구현 시험에서는 허용과 차단을 뜻하는 boolean 방향이 API마다 같은지 가정하지 않는다. 모든 키가 차단되는 입력, 빈 길이와 혼합 정밀도를 포함하고 NaN을 즉시 탐지한다. 긴 문맥 최적화는 이 기본 참조 구현과 작은 입력에서 일치한 뒤 성능 시험으로 넘어간다.
형상 표기에는 B(배치), H(헤드), Lq(질의 길이), Lk(키 길이), Dh(헤드 차원)를 사용해 점수 텐서가 B×H×Lq×Lk임을 명시한다. 이 표기는 구현 간 축 순서를 대조하는 기준이 된다.
KV 캐시를 구현할 때 배치에서 끝난 요청의 블록이 다른 요청에 재할당되기 전에 참조가 완전히 해제되는지 확인한다. 캐시 위치 오류는 정상적인 문장을 만들면서 요청 간 상태를 섞을 수 있어 단순 충돌보다 발견하기 어렵다. 서로 다른 길이의 요청을 반복 추가·취소하는 스트레스 시험과 요청별 결과 격리를 수행한다.
한계와 흔한 오해
섹션 제목: “한계와 흔한 오해”시퀀스 길이에 따른 점수 행렬 비용, 마스크 오류, 헤드 차원 불일치가 주요 문제다. 어텐션 가중치가 높다는 사실만으로 해당 입력이 최종 출력의 원인이라고 단정할 수 없으며 대체 입력 실험이 필요하다.
평균 성능만 보고 한계를 숨기지 않도록 하위 집단, 경계 입력, 분포 변화와 악의적 입력을 별도로 시험한다. 알려진 실패를 탐지하는 모니터링과 안전한 대체 경로가 없으면 운영 준비가 끝난 것으로 보지 않는다.
제곱 복잡도와 해석의 주의점
섹션 제목: “제곱 복잡도와 해석의 주의점”전체 어텐션 점수 행렬은 질의 길이와 키 길이의 곱에 비례해 커진다. 긴 문맥에서는 점수와 중간 활성값 메모리가 병목이 되며, FlashAttention 같은 정확한 I/O 최적화와 희소·선형 근사 같은 구조 변경이 서로 다른 해법을 제공한다. 메모리 효율 커널은 수학적 결과를 거의 유지하면서 메모리 왕복을 줄이지만 지원 자료형과 마스크에 제한이 있을 수 있다. 근사 어텐션은 계산을 줄이는 대신 어떤 장거리 관계를 놓치는지 과제별 평가가 필요하다.
높은 어텐션 가중치를 모델이 그 토큰만을 “이유”로 사용했다는 설명으로 해석하면 안 된다. 잔차 연결, 여러 헤드와 층, 값 벡터, MLP가 함께 출력을 결정한다. 서로 다른 파라미터가 비슷한 출력과 다른 가중치 지도를 만들 수 있다. 패딩·인과 마스크의 부호, boolean 의미, 매우 작은 상수는 정밀도에서 다르게 동작할 수 있다. 모든 키가 마스킹된 행은 softmax에서 정의되지 않은 값이 생길 수 있다. 혼합 정밀도에서는 큰 로짓과 마스크가 overflow나 NaN을 만들지 검사한다.
관련 개념과의 구분
섹션 제목: “관련 개념과의 구분”- attention: Q·K·V를 이용해 관련 정보를 모으는 상위 계산 원리다.
- self-attention: 세 집합이 같은 시퀀스에서 유도되는 어텐션 형태다.
- cross-attention: 쿼리와 키·값이 서로 다른 입력 표현에서 만들어지는 형태다.
구체적인 적용 예시
섹션 제목: “구체적인 적용 예시”질문 토큰을 쿼리로, 검색 문서 토큰을 키와 값으로 두면 질문과 유사한 키가 큰 점수를 받고 대응 값이 출력에 더 많이 반영된다. 테스트에서는 마스크 전후의 shape, 가중치 합, 패딩 위치의 기여도를 확인한다.
예시는 성공 사례뿐 아니라 실패하기 쉬운 입력을 포함한다. 실행 전 기대 결과와 허용 오차를 적고, 실행 뒤에는 결과뿐 아니라 중간 상태와 선택 이유를 비교해 문제가 데이터·구성·구현 중 어디에서 생겼는지 분리한다.
실무 적용과 검증 절차
섹션 제목: “실무 적용과 검증 절차”- 목적과 경계 정의: 이 개념이 해결할 업무와 해결하지 않을 업무를 한 문장씩 적는다.
- 입력·출력 계약: 자료 형식, 단위, 스키마와 오류 응답을 고정한다.
- 기준선 비교: 더 단순한 방법과 동일한 평가 자료에서 품질·비용·지연시간을 비교한다.
- 실패 시험: 결측값, 극단값, 분포 변화, 권한 오류와 악의적 입력을 포함한다.
- 재현 기록: Q·K·V 원천, 투영 차원, 헤드 수, 마스크 규칙, 캐시 자료형과 최대 시퀀스 길이를 기록한다.
- 운영 통제: 자동 중단·롤백 조건과 사람이 검토해야 하는 사건을 지정한다.
검토자는 문서의 출처 번호를 따라 정의와 한계를 다시 확인하고, 구현 버전이 바뀔 때 같은 기준 사례와 실패 시험을 반복한다. 개선 폭이 복잡성과 잔여 위험을 상쇄하지 못하면 단순한 기준선으로 돌아간다.
운영 기록 템플릿
섹션 제목: “운영 기록 템플릿”- 선택 근거와 제외한 대안을 함께 적어 나중에 결정 조건을 복원한다.
- 입력 데이터의 기준 시점, 표본 수, 결측 처리와 권한 범위를 고정한다.
- 정상 기준 사례, 경계 사례, 의도적으로 실패시킬 사례의 기대 결과를 배포 전에 승인한다.
- 품질·지연시간·비용과 안전 지표에 경고선과 중단선을 따로 둔다.
- 변경 뒤 동일 평가를 반복하고 결과 차이가 데이터, 코드, 모델 또는 정책 중 어디에서 생겼는지 분류한다.
- 자동화가 확신하지 못하거나 영향이 큰 경우 사람이 판단할 수 있도록 입력과 근거, 가능한 대안을 한 화면에 제공한다.
작은 행렬로 확인하는 구현
섹션 제목: “작은 행렬로 확인하는 구현”두세 토큰과 한 헤드의 작은 쿼리·키·값 행렬을 만들어 내적, 스케일링, 마스크, softmax, 값 가중합을 손으로 계산한다. 라이브러리 출력과 비교하고 각 단계의 형상을 단언한다. 인과 마스크를 적용했을 때 첫 토큰의 출력이 미래 토큰을 바꿔도 변하지 않는지 시험하면 정보 누출을 찾을 수 있다. 패딩 토큰의 값과 길이를 바꾸어 실제 토큰 출력이 유지되는지도 확인한다. 여러 배치와 교차 어텐션에서 질의·키 길이가 다른 경우를 별도 테스트한다.
실제 모델에서는 시퀀스 길이를 늘리며 지연, 최대 메모리와 커널 선택을 프로파일링한다. 일반 구현과 최적화 구현의 출력을 정한 허용 오차 안에서 비교하고 그래디언트도 작은 사례에서 확인한다. 어텐션 지도를 시각화할 때는 헤드와 층을 임의로 평균하기 전에 차이를 보존하고, 지도만으로 성능 결론을 내리지 않는다. 모델 리비전, 라이브러리, 자료형, 마스크 종류와 장치 정보를 실험 기록에 남긴다. 최적화 뒤에는 긴 문맥과 특수 마스크를 포함한 회귀 세트를 실행한다.
학습 체크
섹션 제목: “학습 체크”- 쿼리·키·값 개념의 입력, 처리와 출력을 한 문장씩 설명할 수 있는가?
- 관련 문서 세 개와의 차이를 실제 사례로 구분할 수 있는가?
- 운영 기록과 실패 시험에서 반드시 남겨야 할 항목을 제시할 수 있는가?
문서 관계
섹션 제목: “문서 관계”선행 개념
섹션 제목: “선행 개념”관련 문서
섹션 제목: “관련 문서”이 문서를 가리키는 문서
섹션 제목: “이 문서를 가리키는 문서”이 문서를 포함하는 코스
섹션 제목: “이 문서를 포함하는 코스”참고와 다음 학습
섹션 제목: “참고와 다음 학습”참고 문헌
섹션 제목: “참고 문헌”- Attention Is All You Need — paper
- PyTorch MultiheadAttention — documentation
- Attention (machine learning) — Wikipedia — encyclopedia
코스에서 계속 읽기
섹션 제목: “코스에서 계속 읽기”- LLM 내부 구조: 다음 문서 — 위치 인코딩
