Tech

[AI 상식] LLM은 어떻게 동작할까 - Attention

임로켓 2025. 2. 8. 08:40
728x90

 

The transformer - model architecture

 

이전 글에서 Input embedding과 Positional Encoding에 대해서 개념을 간략하게 알아봤습니다. 이 그림은 transformer architecture (Attention is all you need)인데, 아직은 자세히 살펴보지 않습니다. 다만 LLM model 들의 base가 되는 모델로써, 각 부분들이 개념적으로 어떻게 동작하는지를 보기 위해서 예시로 보여드리는 것입니다. 

 

이제 positional encoding을 거친 input은 multi-head attention이라고 쓰여져 있는 sub-layer로 들어가게 됩니다. 이번 글에서는 이 attention이라는 것이 무엇인지 알아보겠습니다. 

 

Google에서 2017년 발표한 "Attention is all you need" 논문에서는 attention에 대해서 이렇게 설명하고 있습니다. 

An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.

 

간단하게 말하면 어텐션 함수는 query, key, value, output 네 종류의 벡터가 있는데, query와 key-value pair를 output으로 매핑하는 것이라고 합니다. 😳 이해 되시나요?

 

다시 쉽게 개념적으로 이해할 수 있도록 설명을 곁들여 보겠습니다. 

 

Attention이란, 우리가 흔히 AI라고 하면서 사용하는 LLM (Large Language Model)에서 아주 중요한 부분인데요. 이 어텐션이라는 것은 어떤 문장을 번역하거나 문맥을 해석할 때, “현재 단어를 이해하는 데 도움이 될 만한 다른 단어(또는 위치)는 어디인가?”를 찾는 과정을 말합니다. 즉 우리가 영어 문장 “I love apples”를 한국어로 번역해 줘!라고 AI(LLM)에 요청을 하면, 이 모델은  “love”라는 단어를 번역하기 위해 주변 단어 “I”와 “apples” 중 어느 쪽에 좀 더 집중해야 하는지를 판단하는 과정이 필요하고, 이 어텐션이라는 것이, 어디에 집중해야 하는지를 계산해 주는 것입니다. 그리고 이 집중해야 하는 정도를 "가중치(Weight)"라고 부릅니다. 

 

자 머리 꽉 잡으세요. 수식 나가요. 

 

유명한 수식입니다. 하나하나 무슨 뜻인지 살펴보면 개념을 이해하기 더 쉬우실 겁니다. 

  • Q (Query): 무엇을 찾고 싶은지를 나타내는 벡터 (or 행렬)
  • K (Key): 어떤 정보가 어디 있는지를 알려주는 벡터 (or 행렬)
  • V (Value): 실제 값(정보) 자체를 담은 벡터 (or 행렬)
  • d_k: Key 벡터의 차원 
  • softmax: 확률처럼 모든 가중치의 합이 1이 되도록 만드는 함수 

수식의 의미는 이렇습니다. 먼저 Query와 Key를 내적 (QK)해서 Query와 Key의 유사도를 측정하고, 그 유사도 값들을 softmax()로 정규화(normalize)한 뒤, 최종적으로 그 비중만큼 Value를 가중합 해서 얻어 내는 과정입니다. 

 

더 쉽게 말하면, "Query가 Key와 얼마나 유사한지(점수)를 계산 → 정규화 → 그 비중대로 실제 정보(Value)를 가중합" 한다는 것이죠. 

더 더 쉽게 말하면, "(1) 내가 찾고 싶은 것(Query)을 기준으로, (2) 어디(Key)에 중요한 정보가 있는지 확인하고, (3) 그곳에서 실제 값(Value)을 가져와 조합한다.”라는 것입니다. 

 

다시 I love apples라는 문장이 있다고 해볼게요. 

모델은 "love"라는 단어 볼 때 문장 내의 다른 단어들 어디에 "주목"해야 하는 지를 판단해야 합니다. 이 판단의 의미는 이 문맥 내에서 어떤 단어가 중요한지를 알아낸다는 것입니다. 

 

Query는 "love"라는 단어가 무엇을 찾고 싶은지?이고, 

Key는 "I", "love", "apples"가 각각 어떤 정보를 담고 있는의 "검색 태그"이고, 

Value는 실제 그 단어가 담고 있는 의미들입니다. 

 

Q(love)가 들어오면, K(I, love, apples)에 대해서 QK (내적) 연산을 통해 유사도를 측정해서 그것을 점수화하는 것이죠. 

그래서 예를 들면 Q(love)가 보기에는 I = 0.3, , love = 1.0 (자기 자신이므로), apples = 0.7 정도의 유사도 값을 갖는다고 해보면, softmax(정규화)로 이 점수들을 "확률"처럼 바꿔주는 것입니다. 즉 세 점수의 합이 100% 가 되도록 해주는 거예요. 왜 이렇게 하냐면, 단순히 숫자로 0.3, 0.7이 있으면 얼마나 높고 낮은지에 대해서 알기 어려우니까 (0.3, 1.0, 0.7)을 softmax 해서 대략 (0.15, 0.50, 0.35)처럼 바꾸는 것입니다. (I = 15%, loves = 50%, apples = 35%)

 

그리고 마지막으로 이 비중(=가중치)대로, Value를 가중합 해서 output(출력)을 만들어 냅니다. 

I의 Value = "주어, 인간, 나,..." 

love의 Value = "감정, 좋아함, 애정,..."

apples의 Value = "과일, 사과,..."라고 할 때, 각각의 비중 (15%, 50%, 35%)대로 섞으면, love라는 단어가 문맥 상 어떤 의미와 관련이 깊고, 어느 방향으로 해석되어야 하는지를 나타내는 최종 벡터가 생성됩니다. (출력)

 

수식에서 d_k (key의 차원)의 제곱근으로 나눠주는 부분이 있는데, 이건 유사도 값들이 너무 커지면 안 좋아지는 부분 (학습 시 모델이 불안정)이 있어서, 일정한 기준(d_k의 제곱근)으로 나누어서, 값이 너무 커지지 않게 스케일링하는 것입니다. 

 

그럼 이제 마지막으로, Q, K, V는 그럼 어디서 오는 거지? 어떻게 만들어지는 거지?라는 의문이 있으실 겁니다. 

I love apples라는 문장이 주어졌을 때, 이 문장들은 임베딩 과정을 거쳐 토큰이 되는데, 이를 x라고 하면, Query = xWq, Key = xWk, V = xWv 가 됩니다. 즉 Q(love) = love embedding x Wq 가 되는 것이죠. K(love) = love embedding x Wk가 되는 것이고요. 

즉, 임베딩 된 이 단어를 Query의 Weight 행렬과 연산(matrix multiplication)하는가, Key, Value의 Weight와 연산하는가에 따라서 Q, K, V가 되는 것입니다. 

 

이 Weight (Wq, Wk, Wv)라는 것은 모델이 학습을 하면서 생성되는 행렬입니다. 각 weight들의 목적에 맞게 모델이 학습을 진행하면서 이 값들을 업데이트하는 것이죠. "이 벡터를 이렇게 업데이트해야 성능이 좋아지겠구나!"를 학습 시 모델이 스스로 조정해 가는 것입니다. 그래서 Wq를 예로 들면, 이 안에는  입력 임베딩 중 어떤 부분은 질문자(Query) 입장에서 강조(+감쇄)할까? 에 대한 가중치가 들어 있다는 것이죠. 그래서 우리가 GPU에 모델을 로딩한다고 하면, 모델 아키텍처 (모델이 돌아가는 방법) + weight 값이 함께 로드돼서 동작합니다. 

 

이제 처음보다는 좀 더 이해가 되셨죠? 😀

내부적으로 더 복잡한 개념들과 수식들이 사용되지만, 이 정도의 개념을 알아 두시면 앞으로 더 많은 내용을 이해하기에 수월하실 거예요!

아직 attention 관련해서 K, V cache 업데이트나, attention의 종류 등에 대해서는 다루지 않았는데 관련 부분들은 논문 리뷰나 다른 글에서 더 자세히 알아보겠습니다. 

 

끝.

 

 

 

728x90