
LLM이 실제로 작동하는 방식
요약
현대 LLM의 핵심인 Transformer 아키텍처의 작동 원리를 입문자 수준에서 설명합니다. 토큰화부터 임베딩, 어텐션 메커니즘, 다음 토큰 예측에 이르는 전체 파이프라인을 다룹니다.
핵심 포인트
- Transformer 기반 LLM의 핵심 구성 요소 이해
- 토큰화, 임베딩, 어텐션 등 주요 메커니즘 설명
- 서브워드 토큰화의 효율성과 작동 방식
- 모델 아키텍처와 학습된 가중치의 차이점
LLM이 실제로 작동하는 방식
- 26분 이 글은 LLM이 어떻게 작동하는지에 대한 안내서입니다. 현대의 LLM은 대부분 Transformer 블록을 반복해서 쌓아 구축되므로, Transformer 메커니즘을 이해하면 대부분의 과정을 파악할 수 있습니다.
복잡한 수학적 내용 없이 현대의 Transformer 기반 LLM 내부의 핵심 메커니즘을 다룰 것입니다. 오해는 마세요, 수학을 배워야 하는 것은 맞지만, 이 글은 입문용으로 활용될 수 있습니다.
대부분의 현대 LLM은 동일한 Transformer 계열의 골격을 공유합니다. 차이점은 각 모델이 무엇을 학습했는지, 규모와 구성(configuration) 선택, 그리고 그 위에 수행된 사후 학습(post-training)에서 발생합니다. 이 글을 다 읽을 때쯤이면, 여러분은 많은 현대 LLM 논문이나 모델 카드(model cards)를 읽으면서 각 섹션이 아키텍처의 어느 부분을 설명하고 있는지 알 수 있게 될 것입니다.
학습 경로는 다음과 같습니다:
- 토큰(Tokens): 텍스트 문자열이 어떻게 정수 시퀀스로 변하는지
- 임베딩(Embeddings): 그 정수들이 어떻게 의미를 갖게 되는지
- 위치 인코딩(Positional encoding): 모델이 토큰의 순서를 어떻게 아는지
- 어텐션(Attention): 토큰들이 서로 어떻게 정보를 공유하는지
- 멀티 헤드 어텐션(Multi-head attention): 모델이 어떻게 동시에 여러 종류의 관계를 추적하는지
- 피드 포워드 네트워크(Feed-forward network): 모델에 저장된 구조의 상당 부분이 존재하는 곳
- 잔차 연결(Residual stream) 및 레이어 정규화(Layer normalization): 깊은 층을 쌓은 모델을 학습 가능하게 만드는 요소
- 다음 토큰 예측(Predicting the next token): 모델이 실제로 무엇을 출력하며 생성 루프(generation loop)가 어떻게 작동하는지
- 아키텍처(Architecture) vs 학습된 가중치(Trained weights): 현대 LLM 전반에 걸쳐 공유되는 것과 차이점이 있는 것

배경 지식에 상관없이 누구나 따라올 수 있도록 곳곳에 작은 설명(Tiny explainers)이 등장합니다.
토큰화 (Tokenization)
모델은 텍스트를 직접 읽지 않습니다. 정수 ID를 읽습니다. 여러분의 프롬프트를 해당 정수 시퀀스로 변환하는 단계입니다.
그 변환 단계를 토큰화(tokenization)라고 부릅니다. 토크나이저(tokenizer)는 문자열을 입력받아 정수 시퀀스를 생성하며, 각 정수는 고정된 어휘 사전(vocabulary)의 항목을 가리킵니다. 현대 LLM의 어휘 사전은 보통 수만 개에서 수십만 개의 항목을 포함합니다.
작은 설명: 토큰 ID
토큰 ID (token ID)는 모델이 하나의 어휘 사전 (vocabulary) 항목에 대해 사용하는 정수입니다. 모델은 문자 그대로의 단어가 아니라 이 숫자를 사용하여 작동합니다.
토큰은 보통 완전한 단어가 아닙니다. 대개 서브워드 (subword) 조각들입니다. "tokenization"이라는 단어는 ["token", "ization"]으로 나뉠 수 있습니다. "running"이라는 단어는 ["run", "ning"]으로 나뉠 수 있습니다. 그 이유는 효율성 때문입니다. 단어 단위의 어휘 사전 (whole-word vocabularies)은 너무 크고 새로운 단어에 대해 일반화하기 어렵습니다. 문자 단위의 어휘 사전 (character-level vocabularies)은 너무 작아서 모델이 아주 단순한 패턴조차 처음부터 학습해야 합니다. 서브워드 토큰화 (subword tokenization)는 그 중간에 위치합니다. 가장 흔한 조각들은 단일 토큰이 되고, 드물거나 새로운 단어들은 더 작은 조각들로 구성됩니다.
작은 설명: 어휘 사전 (vocabulary)
어휘 사전 (vocabulary)은 토크나이저 (tokenizer)의 고정된 조각 목록입니다. 각 조각은 ID를 가지며, 모델은 해당 목록에 있는 ID만을 직접적으로 전달받을 수 있습니다.
이러한 트레이드오프 (trade-off)는 사람들이 예상하지 못한 곳에서 나타납니다. 전형적인 예로, LLM에게 "strawberry"에 'r'이 몇 개 들어있는지 물어보는 것입니다. 과거에 LLM은 이를 틀리곤 했습니다. 이는 모델이 숫자를 세는 데 실패한 것이 아닙니다. 모델이 문자를 직접 다루는 것이 아니라, 인간이 글자 단위로 나눌 단어를 우연히 철자로 나타내는 토큰 ID (token IDs)로만 작동하기 때문입니다.

모델 제품군마다 서로 다른 토크나이저 (tokenizers)를 사용합니다. GPT 모델들은 Byte Pair Encoding (BPE) 변형들을 사용합니다. SentencePiece는 LLaMA 스타일의 모델에서 흔히 사용됩니다. 이러한 선택은 연산량 (compute, 토큰이 적을수록 작업량이 적음)과 다국어 커버리지 (multilingual coverage) 같은 요소들에 영향을 미치지만, 기본적인 형태는 동일합니다. 텍스트가 입력되면 정수가 출력됩니다.
이제 프롬프트 (prompt)가 정수의 시퀀스 (sequence)가 되었으므로, 다음 단계는 이 정수들에 의미를 부여하는 것입니다.
임베딩 (Embeddings)
1024와 같은 토큰 ID (token ID)는
단순히 행 인덱스 (row index)일 뿐입니다. 그 자체로는 아무런 의미가 없습니다. 여기에 의미를 부여하는 것은 임베딩 행렬 (embedding matrix)이라고 불리는 거대한 테이블입니다.
모든 모델은 이를 가지고 있습니다. 어휘 사전 (vocabulary)의 각 항목당 하나의 행을 가지며, 각 행은 긴 숫자 벡터 (vector)입니다. 각 행의 길이는 모델의 은닉 크기 (hidden size)입니다. 많은 7B급 모델의 경우, 이는 토큰당 4,096개의 숫자를 의미합니다. 더 큰 모델들은 보통 더 넓은 벡터를 사용합니다.
작은 설명: 벡터 (vector)
벡터는 숫자들의 목록입니다. 트랜스포머 (transformer)에서 각 토큰은 모델이 수학적 연산을 수행할 수 있도록 벡터가 됩니다.
토크나이저 (tokenizer)가 모델에 정수 (integer)를 전달하면, 모델은 해당 행을 찾아보고 대신 그 벡터를 사용합니다. 그 벡터가 바로 토큰의 임베딩 (embedding)입니다. 이는 학습 과정에서 습득된, 해당 토큰이 무엇을 "의미"하는지에 대한 모델의 표현입니다.
작은 설명: 임베딩 행렬 (embedding matrix)
임베딩 행렬은 조회 테이블 (lookup table)입니다. 토큰 ID가 입력되면 학습된 벡터가 출력됩니다.
이러한 임베딩의 흥미로운 특성은 의미론적으로 유사한 토큰들이 결과적으로 유사한 벡터를 갖게 된다는 점입니다. "king"의 벡터는 공간상에서 "queen"의 벡터와 가깝고, "Paris"의 벡터는 "France"와 가깝습니다. 이 중 어느 것도 하드코딩된 것이 아닙니다. 이는 충분한 텍스트로 학습하면서 나타나는 현상이며, 모델은 이러한 위치를 학습함으로써 텍스트를 잘 예측할 수 있게 됩니다.
임베딩에 산술 연산을 수행할 수 있으며, 때로는 이것이 작동하기도 합니다. 유명한 예시는 king − man + woman ≈ queen 입니다.
임베딩 공간의 기하학적 구조는 아무도 모델에게 그렇게 만들라고 지시하지 않았음에도 불구하고 실제적인 의미론적 구조를 담고 있습니다.

명확히 해둘 점: 이 단계에서는 모든 토큰이 임베딩으로 대체되었지만, 임베딩 자체만으로는 토큰이 시퀀스 내 어디에 위치하는지에 대해 아무것도 말해주지 않습니다. "dog"라는 단어가 프롬프트의 첫 번째 단어이든 다섯 번째 단어이든, "dog"의 벡터는 동일합니다. 이것이 문제입니다.
그것이 바로 위치 인코딩 (positional encoding)이 메우는 간극입니다.
위치 인코딩 (Positional encoding)
순수한 셀프 어텐션 (self-attention)은 단어 순서에 대한 내장된 표현을 가지고 있지 않습니다. 어떤 위치 신호가 없다면, 모델은 "dog"가 "bites" 뒤가 아니라 앞에 왔다는 것을 알 수 있는 직접적인 방법이 없습니다.
단어 순서는 의미를 변화시킵니다. 따라서 모델에는 다른 요소가 필요합니다. 각 토큰의 위치를 수학적 계산에 주입할 방법이 필요합니다.
간단한 설명: 위치 인코딩 (Positional encoding)
위치 인코딩 (Positional encoding)은 모델이 순서 정보를 얻는 방식입니다. 이는 모델에게 각 토큰이 시퀀스 내의 어디에 위치하는지를 알려줍니다.
오리지널 트랜스포머 (Transformer) 논문 (Vaswani et al. 2017)에서는 각 위치에 고유한 숫자 패턴을 부여하고, 다른 처리가 이루어지기 전에 각 토큰의 임베딩 (Embedding)에 이를 직접 더하는 방식으로 이를 수행했습니다. 위치 1은 하나의 패턴을 가졌고, 위치 5는 다른 패턴을 가졌으며, 위치 100은 또 다른 패턴을 가졌습니다. 이 패턴들은 서로 다른 주파수를 가진 사인 (Sine) 및 코사인 (Cosine) 파동에서 유래했습니다. 결과적으로 위치 1에 있는 "dog"의 임베딩은, 단지 더해진 위치 패턴이 다르다는 이유만으로 위치 5에 있는 "dog"의 임베딩과 달라졌습니다.
이 방식은 효과적이었으며, 사인 함수 기반 인코딩 (Sinusoidal encodings)이 선택된 이유 중 일부는 훈련 중에 본 정확한 시퀀스 길이를 넘어 외삽 (Extrapolate)할 수 있기 때문이었습니다. 하지만 가산적 위치 체계 (Additive position schemes)는 모델의 규모가 커짐에 따라 중요해진 두 가지 문제를 여전히 안고 있었습니다.
첫째, 임베딩 (Embedding)이 동일한 숫자 집합 안에 의미와 위치를 모두 담아야 했습니다. 담을 수 있는 정보량에는 한계가 있습니다.
둘째, 특히 학습된 절대적 위치 임베딩 (Learned absolute position embeddings)은 깔끔하게 일반화 (Generalize)되지 않습니다. 만약 최대 2,048 토큰 길이의 프롬프트로 훈련했다면, 모델은 훈련 과정에서 위치 5,000을 본 적이 없으며, 해당 위치에 대한 임베딩은 동일한 방식으로 학습되지 않았습니다.
현대적인 모델들은 대부분 2021년 Su 등이 도입한 Rotary Position Embeddings (RoPE)라고 불리는 다른 방식을 사용하며, 현재 LLaMA, Mistral, Gemma, Qwen 및 대부분의 다른 오픈 웨이트 (open-weight) 모델군에서 사용되고 있습니다. 그 직관은 다음과 같습니다. 각 토큰의 벡터에 위치 정보를 더하는 대신, RoPE는 토큰의 위치에 따라 결정되는 각도로 Query와 Key 벡터를 회전시킵니다. 위치 1에 있는 토큰은 작은 회전을 받고, 위치 100에 있는 토큰은 더 큰 회전을 받습니다. 이후 어텐션 (attention) 과정에서 두 토큰이 비교될 때 중요한 것은 두 토큰의 Query와 Key 회전 사이의 차이이며, 이것이 두 토큰이 얼마나 떨어져 있는지를 인코딩합니다.
간단한 설명: RoPE
RoPE는 Rotary Position Embeddings의 약자입니다. 위치 벡터를 더하는 대신, Query와 Key 벡터를 회전시켜 어텐션 과정에서 상대적 거리(relative distance)가 나타나도록 합니다.

실질적인 이점은 분명합니다. RoPE는 상대적 위치를 자연스럽게 인코딩합니다 (이는 어텐션이 실제로 원하는 방식에 더 가깝습니다). 또한 더 긴 컨텍스트 (context)로 더 잘 일반화됩니다. 그리고 모델에 새로운 파라미터 (parameter)를 추가하지 않습니다.
훌륭한 위치 인코딩 (positional encoding)을 사용하더라도, 현대의 LLM들은 기록된 바 있는 "중간에서의 상실 (lost in the middle)" 문제 (Liu et al. 2023)를 겪습니다. 이들은 긴 프롬프트의 중간에 묻혀 있는 정보보다 프롬프트의 시작과 끝에 있는 정보를 더 신뢰성 있게 사용합니다. 이것이 "중요한 컨텍스트를 앞에 두세요" 또는 "핵심 정보를 끝에 반복하세요"와 같은 프롬프트 엔지니어링 (prompt engineering) 팁이 실제로 도움이 되는 이유입니다. 모델은 프롬프트의 모든 부분을 동일하게 잘 사용하지 못합니다.
토큰의 의미와 위치가 모두 인코딩되면, 다음 질문은 토큰들이 실제로 어떻게 정보를 교환하느냐는 것입니다.
어텐션 (Attention)
이것이 바로 이 아키텍처(architecture)에 이름을 부여한 메커니즘입니다. 바로 어텐션 (Attention)입니다.
모든 트랜스포머 (transformer) 레이어 내부에서 어텐션은 한 가지 일을 수행합니다. 각 토큰이 자신이 볼 수 있도록 허용된 다른 토큰들을 살펴보고, 다음에 올 내용에 어떤 토큰들이 중요한지 결정할 수 있게 해줍니다.
어텐션은 각 토큰에 세 가지 역할을 동시에 부여함으로써 이 작업을 수행합니다. 각 토큰은 Query, Key, Value (Q, K, V)라고 불리는 세 개의 새로운 벡터로 변환됩니다.
간단한 설명: Q, K, V
Query는 "내가 무엇을 찾고 있는가"를 의미하고, Key는 "내가 무엇과 매칭되는가"를 의미하며, Value는 매칭이 강력할 때 복사되는 정보입니다.
- Query는 "다른 토큰들로부터 내가 무엇을 찾고 있는가?"라고 묻습니다.
- Key는 "나를 보고 있는 토큰들에게 내가 제공하는 것은 이것이다"라고 말합니다.
- Value는 "매칭이 발생했을 때 전달되는 것은 이것이다"라는 내용을 담고 있습니다.
동일한 토큰이 이 세 가지 역할을 동시에 수행합니다. Q, K, V 변환은 학습된 행렬(learned matrices)이므로, 모델은 학습 과정에서 각 토큰이 무엇을 찾아야 하고 무엇을 제공해야 하는지를 파악합니다.
매칭은 유사도 점수(similarity score)를 통해 일어납니다. 각 토큰의 Query는 스케일드 닷 프로덕트(scaled dot product)를 사용하여, 해당 토큰이 볼 수 있도록 허용된 각 토큰의 Key와 비교됩니다. 직관적으로 이는 두 벡터가 얼마나 일치하는지를 측정합니다. 스케일링(scaling)은 softmax를 적용하기 전에 숫자들을 안정적으로 유지해 줍니다.
간단한 설명: 닷 프로덕트 (dot product)
닷 프로덕트는 두 벡터가 얼마나 정렬되어 있는지를 점수화하는 간단한 방법입니다. 정렬도가 높을수록 더 강력한 매칭을 의미합니다.
그 후 매칭 점수는 softmax를 사용하여 가중치(weights)로 변환됩니다. Softmax는 어떤 숫자 집합이든 합계가 1이 되는 확률과 유사한 분포로 변환합니다. 매칭 점수가 높은 토큰은 더 높은 가중치를 얻으며, 이 가중치들은 Value 벡터들의 가중 평균(weighted average)을 구하는 데 사용됩니다.
간단한 설명: softmax
Softmax는 원시 점수(raw scores)를 합계가 1이 되는 가중치로 변환합니다. 큰 점수는 큰 가중치를 얻고, 작은 점수는 작은 가중치를 얻습니다.
예를 들어보겠습니다. “The cat that I saw yesterday was sleeping(내가 어제 본 그 고양이는 자고 있었다).”라는 문장을 가정해 봅시다. 모델이 “was”를 처리할 때, 무엇이 자고 있는지를 파악해야 합니다. “was”의 쿼리 (Query) 벡터는 모델이 볼 수 있도록 허용된 토큰들의 키 (Key) 벡터들과 비교됩니다. “cat”과의 내적 (dot product) 값은 높게 나타나는데, 이는 모델이 “was”와 같은 동사는 주어가 필요하며, “cat”과 같은 주어는 잘 일치하는 키 (Key) 벡터를 생성한다는 것을 학습했기 때문입니다. 반면 “yesterday”와의 내적 값은 낮습니다. 소프트맥스 (Softmax)는 이러한 점수들을 가중치로 변환하며, “cat”은 높은 가중치를, “yesterday”는 낮은 가중치를 얻게 됩니다. 그런 다음 모델은 해당되는 값 (Value) 벡터들의 가중 합 (weighted sum)을 구하므로, “cat”의 값이 결과에 지배적인 영향을 미칩니다. 이제 “was”의 새로운 표현 (representation)은 주로 “cat”의 값에 의해 형성됩니다. 이것이 몇 단계 앞선 토큰이 지칭 대상 (referent)이 되는 방식입니다.
GPT 스타일의 언어 모델에는 특정한 제약 사항이 있는데, 바로 텍스트를 왼쪽에서 오른쪽으로 생성한다는 점입니다. 5번 위치의 토큰은 1번부터 5번 위치까지만 어텐드 (attend)할 수 있습니다. 6, 7, 8번 위치의 토큰들은 아직 생성되지 않았기 때문에 어텐드할 수 없습니다. 이를 인과적 마스킹 (causal masking)이라고 부릅니다. 구현 방식은 간단합니다. 미래의 토큰들은 매치 점수 (match scores)가 매우 낮게 설정되어, 소프트맥스 (Softmax)를 거친 후 실질적으로 0에 가까운 가중치를 갖게 됩니다.
간단한 설명: 인과적 마스킹 (causal masking)
인과적 마스킹 (causal masking)은 미래의 토큰을 숨깁니다. 이는 디코더 전용 (decoder-only) 언어 모델이 다음 토큰을 예측하는 동안 앞을 내다보지 못하게 합니다.

AI 자동 생성 콘텐츠
본 콘텐츠는 Lobste.rs AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기