단어들끼리 얼마나 관련 있는지 계산하고 그 비율만큼 정보를 섞어서
문맥을 만드는 기술이다.
사용자의 텍스트 "I like cat" 를 임베딩하면 이런 식으로 벡터데이터로
저장되는데... 예를 들자면 이런 식이다.
I -> [1, 2, 3]
like -> [3, 4, 5]
cat -> [5, 6 ,7]
같은 단어가 출현하더라도 위치에 따른 의미가 달라질 수 있기 때문에
임베딩 후 위치 정보를 넣는다. 이것도 공식이 별도로 있는데 나중에 다뤄볼 생각...
I -> [1, 2, 3] + 1번 위치
like -> [3, 4, 5] + 1번 위치
cat -> [5, 6 ,7] + 1번 위치
각 단어(토큰)의 역할을 비유하자면 이렇게 되는데...
I -> Q : 누구를 참고할까?
I -> K : 나는 이런 특징을 가지고 있어.
I -> V : 나는 이런 정보를 전달할거야.
like -> Q : 누구를 참고할까?
like -> K : 나는 이런 특징을 가지고 있어.
like -> V : 나는 이런 정보를 전달할거야.
cat -> Q : 누구를 참고할까?
cat -> K : 나는 이런 특징을 가지고 있어.
cat -> V : 나는 이런 정보를 전달할거야.
이건 모델이 자동으로 생성해 준다.
예를 들자면 "like" 가 다른 단어들을 얼마나 참고해야 할지 계산한다.
like 의 Q 와 각 단어의 K 를 비교하는데 이건 벡터끼리 곱해서 점수를 계산하는 것이다.
결과 예시는 다음과 같다.
I -> 0.3
like -> 0.1
cat -> 2.0
대충 like 는 cat 과 가장 관련이 있다는 뜻이다.
I -> 10%
like -> 5%
cat -> 85%
이제 그 비율만큼 각 단어의 V를 섞어야 한다.
0.1 × V_I +
0.05 × V_like +
0.85 × V_cat
이렇게 하여 문맥이 반영된 like 가 만들어진다.
Q_I, K_I, V_I 생성
KV cache: [K_I, V_I]
Q_like 생성
KV cache: [K_I, V_I]를 가져와서 Q_love·K_I 계산
V를 곱해서 attention 결과 생성
K_love, V_love 추가 → KV cache: [K_I, V_I, K_love, V_love]
Q_cat 생성
KV cache: [K_I, V_I, K_love, V_love]
Q_cat·K_? 계산 → softmax → V 합산
K_cat, V_cat 추가 → KV cache 업데이트