Tech

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

임로켓 2025. 2. 1. 16:38
728x90

 

앞으로 살펴볼 글들에서는, 많은 수학적 지식 필요 없이도 우리 주변에 성큼 다가온 AI(LLM)이라는 것이 무엇인지, 개념적인 이해를 할 수 있도록 천천히 다뤄볼 예정입니다. 비전공자나, 이제 막 LLM 관련 업무를 시작하는 전공자 모두에게 약간이나마 이해를 도울 수 있으면 좋겠네요. 😀

 

우리가 흔히 말하는 GPT나 Deepseek과 같은 "AI"들은 쉽게 말해서 LLM (Large Language Model)이라는 "모델"을 GPU에서 구동하는 것입니다.  이 LLM이라는 것은 "생성형 AI"의 한 종류로, 인간의 언어(자연어)를 배워서 다양한 입력으로부터 "응답"을 생성해 내는 것이죠. "안녕하세요, 오늘 어때요?"라는 문장을 입력받으면, 이 문장을 "기억"하고, 이다음에 올 단어가 어떤 것이 될지를 "예측"해서 응답을 생성합니다. 

 

그럼 이 LLM은 어떻게 사람의 언어를 이해할까요? 복잡하게 생각하면 머리가 깨질수도 있으니 간단하게 설명해 보겠습니다. 

 

먼저 모델을 다양한 텍스트 "데이터"로 "학습(Training")" 해야 합니다. 요즘 Deepseek이 화제가 되면서 이 학습비용에 대한 많은 뉴스 기사와 콘텐츠들을 한 번쯤 보셨을 거라고 생각합니다. 이 학습은 대규모의 GPU에서 굉장히 오랜 시간을 엄청나게 많은 데이터와 함께 수행해야 하기 때문에 돈이 엄청나게 들어가는 것이죠. Deepseek은 이것을 약 600만 달러로 해냈다고 하여 이슈가 되는 것이고, 외부 분석에서는 실제로는 5억 달러 이상 소요됐을 거라고 보는 시각도 있습니다. 뭐 언젠가 진실은 밝혀지겠죠? 

 

이 학습은 그럼 어떻게 진행되는가를 아주 간단히 설명드리면, 먼저 텍스트 데이터를 읽어 "인코딩" 과정을 거쳐 "토큰"으로 만듭니다. 이 "토큰"이라는 것은 단어 단위일 수도 있고, 아닐 수도 있는데 그냥 쉽게 텍스트를 특정 규칙에 맞게 잘라서 "토큰"이라는 것으로 만들고, 이 토큰들에 대해 각각 번호를 붙여서 관리한다고 생각하시면 됩니다. 마치 국어사전 처럼요. 이걸 "Vocabulary, Embedding Matrix"라고 합니다. 

 

그래서 입력으로 우리가 텍스트를 입력하면, 그 텍스트를 특정한 규칙에 맞춰서 잘라서 "토큰"으로 만드는 과정(토큰화, Tokenizing)을 거치고요. 입력받은 길이 (sequence_length) 만큼 이 토큰이 생기는 거죠. 이런 입력을 여러 개 뭉쳐서 수행을 할 수 있는데 이것을 "batch"라고 합니다. 그래서 여러 개의 입력이 동시에 들어오면 아래 그림처럼 n개의 sequence length를 갖는 m개의 입력들이 모여서 하나의 배치를 이루게 돼요. (batch size = m) 각 입력의 길이가 다르면 그에 맞춰 padding 하거나, 자르거나 (truncation)하는 동작도 있는데, 머리가 어지러울 수 있으니 그냥 모든 입력의 sequence length가 같다고 생각하고 지나가겠습니다. 

 

이렇게 "토큰화"를 거치고 나면, "임베딩"이라는 과정을 거치는데요. 이 과정이 뭔지 알려면 다시 학습 과정으로 돌아가서 살펴 봐야 합니다. LLM이라는 것이 입력받은 텍스트에 대해서 다음 단어가 어떤 것이 될지를 예측하는 것이고, 이 예측을 어떻게 해야 하는지를 학습하면서 배우고 교정하게 되는 것인데요. 이때 문맥 내에서 각 단어와 단어의 "관계"를 살펴보고, 다음 단어가 어떤 것이어야 하는지를 배워서 "기록"해 둡니다. 예를 들어서 "귤"이라는 단어가 있다고 해볼께요. 이 귤의 token ID가 2이라고 하면 아래 그림에서 볼 수 있듯이 vocabulary에서 3번째 (0, 1, 2...) 인덱스를 참조해서 그 행에 있는 "벡터"를 가져다 다음 단어를 예측할 때 쓸 수 있도록 정보를 구성하는 것입니다. 따라서 이 벡터 (1, embedding_dim) 에는 사과라는 단어가 각 문맥에서 어떤 의미를 가져야 하는지에 대한 정보들이 들어 있겠죠? 이 값을 모델이 학습할 때 예측한 내용을 모범 답안과 비교하면서 오차가 얼마나 나는지를 파악해서 이 벡터 내의 값 (임베딩 값)을 수정하는 것입니다. 나중에 추론할 때 이 값을 참고해서 예측을 하기 위해서요. 그래서 학습할 때 모범 답안을 어떻게 주느냐에 따라서 특정 단어에 따라 모델 별로 다른 답변을 할 수 있게 되는 것입니다. 

 

"독도는 누구 땅이야?" 라고 물었을 때, GPT와 Deekseek은 각각 어떻게 대답할까요? ^^ 

 

이렇게 하나의 단어가 여러 문맥에 대해서 어떻게 쓰이는지에 대한 복합적인 의미를 이 embedding_dimesion 내에 표현을 하게 되고요, 이 dimesion이 클수록 표현 능력이 커지겠죠? 대신에 메모리 공간과 계산 능력이 더 많이 필요해질 것입니다. 다시 정리하면 임베딩이라는 것은, "특정 단어가 여러 문장에서 쓰이는 다면적 의미를 embedding 차원 벡터에 담아서 추론할 때 이를 참고해서 사용한다"라고 이해하면 됩니다. dimesion이 너무 작으면 문맥에 대한 단어의 의미를 제대로 파악하지 못할 테니, 어느 정도 잘 동작하도록 값이 사용되어야겠죠?

 

"애플 제품은 어때?"라고 물었는데, 

"달고 맛있어"라고 하면 안 되잖아요?

 

 

이제 설명을 다 했으니 그림을 보면, 쉽게 이해가 되실 것 같습니다. 

처음 유저들로부터 들어오는 입력은 1 x sequence_length로 들어오고, 이러한 입력을 여러 개 (batch) 묶으면 batch_size x sequence_length의 벡터가 됩니다. 이때 각 단어들은 토큰화를 거쳐 토큰ID로 변환이 되고, LLM 동작 시 "임베딩 레이어"를 가장 먼저 통과하는데, 이 때 vocabulary에서 토큰 ID를 인덱스로 해서 embedding 정보를 가져오고, 이걸 각 토큰 별로 참조할 수 있도록 벡터를 재구성합니다. 그래서 임베딩 레이어를 통과하게 되면 그림 왼쪽에서 보는 것처럼 (batch_size, sequence_length)에서 (batch_size, sequence_length, embedding_dim)이 되는 것입니다. 모든 토큰들에 대해서 이렇게 변환이 일어나면 최종적으로 그림 맨 아래쪽의 형태가 되고, 다음 동작을 수행하게 되는 것입니다.

 

지금까지 문과적으로 설명을 했으니, 마지막에 이과적으로 설명을 조금 더 보태보면, 

batch_size = 2, sequence_length = 3, embedding_dim = 4라고 하면, 아래와 같은 형태가 됩니다. 

입력 텐서(벡터) 크기는 (2, 3)이 되고, 아래처럼 토큰 ID를 담고 있습니다. 

[
  [10, 45, 203],
  [82, 82, 17]
]

 

임베딩 레이어 (Embedding matrix)에는 각 토큰 ID에 대응하는 (1, embedding_dim) 형태의 벡터들이 저장되어 있습니다. 

따라서 임베딩 레이어를 통과하고 나면 텐서는, (2, 3, 4)가 됩니다. (batch_size, sequence_length, embedding_dim)

그래서 아래와 같은 형태가 되죠. (v10_0, v10_1, v10_2, v10_3 = 토큰 10에 대한 임베딩 벡터)

[

  [

       [v10_0,       v10_1,          v10_2,             v10_3],

       [v45_0,      v45_1,         v45_2,            v45_3],

       [v203_0,    v203_1,      v203_2,          v203_3]

   ],

  [

       [v82_0,      v82_1,         v82_2,           v82_3],

       [v82_0,      v82_1,         v82_2,           v82_3],

       [v17_0,        v17_1,          v17_2,            v17_3]

   ]

]

 

실제 학습 과정에서의 임베딩 matrix 과정을 자세히 살펴보려면 여러 용어들도 많고, 알아야 하는 부분들이 많은데 개념적인 이해만을 하기 위해 과감하게 생략했습니다. 

 

LLM의 전체 동작 시퀀스에 대한 설명을 하지 않았는데, 간략하게 보면 다음과 같은 동작을 합니다. 여기에서는 1), 2) 과정을 간단하게 살펴보았고, 다음 글들에서 순차적으로 살펴보겠습니다. 

1) 토큰화 및 배치, 시퀀스 구성

2) 임베딩 레이어

3) Positional Encoding

4) Self-Attention

5) Feed-Forward Network

6) 총 레이어 수만큼 4), 5) 반복

7) 출력 및 토큰 예측

 

끝. 

728x90