1. 토큰(token)과 왜 Key·Value를 만드는가
• 토큰(token)
자연어 처리 모델에서는 문장을 “단어”나 “어절”, 심지어는 “자모” 단위로 쪼갠 뒤, 이를 다시 숫자 벡터로 변환합니다. 이 쪼개진 최소 의미 단위를 토큰이라고 부릅니다.
왜 토큰마다 Key·Value가 필요할까?
• 모델이 “어떤 토큰이 지금 중요한지판단할 때, 토큰마다 정보를 담고 있는 표식이 있어야 합니다.
Key와 Value는 어텐션 연산의 두 축으로,
Key(K): “이 토큰이 어떤 특징을 가졌는지”를 나타내는 벡터
Value(V): “실제로 이 토큰이 어텐션 결과에 기여할 때 얼마만큼의 정보를 줄 것인지”를 담은 벡터
• 즉,
1. Key로 토큰별 “관심도 판단 기준”을 만들고,
2. Value로 “관심도가 높을 때 실제로 불러올 정보량”을 조절합니다.



2. 어텐션(attention) 연산이란?
• 비유로 이해하기
• 여러분이 긴 보고서를 읽으면서 “이 부분이 중요하다” 싶으면, 그 부분을 줄 표시하거나 메모를 남기죠.
• 어텐션도 이와 비슷하게, “어떤 토큰에 집중(attend)할지”를 수치로 계산해서 모델 안에서 표시하는 과정입니다.
• 수학적 과정 (단순화해서)
1. Query(Q): “지금 내가 찾고 싶은 정보”를 묻는 질문 벡터
2. Key(K): “문서 안에 이런 정보가 있어요”라는 표시 벡터
3. Value(V): “실제 그 정보는 이만큼 제공할게요”라는 데이터 벡터
4. Query와 모든 Key를 **내적(dot product)**해서 “유사도” 점수를 계산
5. 그 점수에 소프트맥스(Softmax)를 적용해 “어떤 토큰에 얼마만큼 집중할지” 확률화
6. 이 확률값을 각 Value에 곱한 뒤 합산 → 어텐션 결과
• 결과
• 어텐션 연산을 거치면, 모델은 “지금 이 문맥에서 중요한 정보만 골라서” 다음 연산(예: 다음 단어 예측)에 사용하게 됩니다.



3. 인코더(Encoder) 모델 vs. 디코더(Decoder) 모델

구분
인코더(Encoder)
- 입력 문장 전체를 한 번에 이해(인코딩)
- 병렬 처리: 모든 토큰을 동시에 처리 가능
- 일반적으로 단일 방향(Self-Attention)

디코더(Decoder)
- 한 토큰씩 차례로 생성(디코딩)
- 순차 처리: 이전에 생성된 토큰 정보를 재사용
- “이전까지 나온” K·V를 저장해 두었다가 재사용

1. 인코더(Encoder)
입력된 토큰 전체를 한꺼번에 보고, 각 위치별로 풍부한 문맥 표현을 만듭니다.
• 예: 번역 모델의 “원문 이해” 단계
2. 디코더(Decoder)
이미 생성된(혹은 주어진) 앞부분 토큰들을 바탕으로, 다음 토큰을 한 글자씩 예측·생성합니다.
• 이때 “이미 계산된 K·V”를 캐시에 저장해 두면, 매번 처음부터 다시 계산하지 않고 빠르게 재활용할 수 있습니다.



4. 디코더에서 KV 캐시의 역할
왜 캐시(cache)하나?
• 예: “I am a st…”까지 생성된 상태에서 다음 ‘u’, ‘den’, ‘t’ 등을 예측할 때,
“I”, “am”, “a” 같은 앞 토큰에 대한 Key·Value를 매번 다시 계산하면 불필요한 시간이 듭니다.
한 번 계산된 K·V는 캐시에 저장해 두었다가, 나중에 “이전에 나온 토큰들” 어텐션에 반복 사용합니다.
• 효과
불필요한 중복 계산 제거 → 추론 속도 향상
• 다만, 토큰 수가 늘어남에 따라 캐시도 커지므로 메모리 관리가 중요해집니다.



요약
1. 토큰마다 Key·Value를 만드는 이유
어텐션에서 “어디에 집중할지”(Key)와 “얼마나 정보를 가져올지”(Value)를 각각 다르게 표현하기 위해
2. 어텐션 연산
Query·Key 유사도 계산 → 확률화 → Value 가중합 → 중요한 정보만 뽑아 쓰는 과정
3. 인코더 vs. 디코더
인코더: 문장 전체를 한 번에 이해
디코더: 한 토큰씩 생성하며, 이미 계산된 K·V를 캐시에 저장해 재활용

반응형

+ Recent posts