"token"에서 "MoE"까지: 의존 순서로 정리한 LLM 용어 사전
요약
LLM의 핵심 용어들을 알파벳 순이 아닌 개념 간의 의존 관계(dependency order)에 따라 체계적으로 정리한 가이드입니다. Token부터 MoE까지, 앞선 개념을 바탕으로 다음 개념을 이해할 수 있도록 설계되었습니다.
핵심 포인트
- 알파벳 순이 아닌 개념적 의존 순서로 구성된 용어 사전
- 네트워크, 캐시, 제어 루프 등 시스템 관리자 관점의 비유 활용
- Token, Embedding, Attention, KV Cache, MoE 등 핵심 개념 연결
- 현대적 소형 모델 아키텍처 수치를 기준으로 실질적 설명 제공
요약 (TL;DR) — LLM에 대해 읽을 때 마주치는 용어들인 token, embedding, attention, KV cache, GQA, MoE, quantization 등을 실제로 이해하기 위한 용어 사전입니다. 하지만 알파벳 순서가 아니라 **의존 순서 (dependency order)**로 구성되어 있습니다. 모든 항목은 위에서 이미 설명된 개념만을 사용하므로, 처음부터 끝까지 읽는다면 "Mixture of Experts"에 도달할 때쯤에는 이미 이를 이해하기 위한 모든 조각을 갖추게 될 것입니다. 비유는 이 블로그를 즐겨 찾는 사람들의 세계인 네트워크, 캐시 (cache), PID 제어기 (PID controllers), 튜닝 (tuning)에서 가져왔습니다. 수학적 전제 조건은 "배열 (array)이 무엇인지 안다"는 수준이면 충분합니다.
알파벳 순으로 정리된 LLM 용어 사전에는 구조적인 결함이 있습니다. "attention" 항목은 저 아래에 있는 "softmax"로 안내하고, 이는 다시 앞부분에 있는 "logits"를 사용하며, 이는 다시 "vocabulary"를 전제로 합니다. 결국 새벽 2시에 위키피디아 페이지를 이리저리 건너뛰는 것과 같은 상황에 처하게 됩니다.
이 문서는 그 반대 방식, 즉 사슬처럼 구축되었습니다. 이것은 제가 가졌으면 하고 바랐던 용어 사전이며, 비유들은 ML 박사가 아닌 시스템 관리자(sysadmin), 네트워크, 제어기 분야에서 온 제가 개념을 이해하는 데 도움이 되었던 것들입니다. 만약 여러분도 캐시 (cache), 에러 신호 (error signals), 제어 루프 (control loops)의 관점에서 생각한다면, 제대로 찾아오셨습니다.
시작하기에 앞서, 솔직하게 말씀드립니다. 이 용어 사전은 제가 이미 가지고 있던 지식에서 나온 것이 아닙니다. 이것은 제가 LLM에게 던진 질문들 — "KV cache를 설명해줘", "왜 저 $\sqrt{d}$가 필요한 거야?" — 과 LLM이 저를 위해 작성해 준 설명들로부터 만들어졌습니다. 어떤 것들은 머릿속에 깊이 박혔고, 어떤 것들은 여전히 곱씹고 있는 중입니다. 저는 여기서 읽게 될 모든 내용을 완전히 마스터하지는 못했으며, 그런 척하지도 않을 것입니다. 저에게 필요했던 것은 언제든 다시 돌아올 수 있는 단 한 곳, 즉 이 주제에 대해 무언가를 읽다가 이러한 용어 중 하나를 마주쳤을 때 천천히 다시 읽으며 저를 이해시켜 주는 비유들을 확인할 수 있는 노트였습니다. 여러분에게도 도움이 될까 하여 여기에 남겨두지만, 이 노트는 무엇보다도 우선 저의 것입니다.
현실적인 감각을 유지하기 위해, 저는 작지만 현대적인 아키텍처를 가진 모델의 수치를 관통하는 실마리(throughline)로 사용하겠습니다: 1억 8천만 개의 파라미터 (parameters), 32,768개의 토큰 (token) 어휘 사전 (vocabulary), 내부 크기 (internal size) 640, 20개의 레이어 (layers). 인간의 하드웨어로 학습시키기에 충분히 작으면서도, 2026년에 중요한 모든 개념을 담아낼 만큼 현대적입니다.
Level 0 — LLM이 실제로 하는 일
언어 모델링 (Language modeling)
게임의 핵심은 단 하나입니다: 텍스트 시퀀스(sequence)가 주어졌을 때, 다음 조각을 예측하는 것. "The cat is on the" → 아마도 "roof" 또는 "couch"가 될 것이고, "carburetor"가 될 확률은 낮습니다. LLM은 텍스트를 입력받아 다음 조각에 대한 확률 분포 (probability distribution)를 반환하는 거대한 함수입니다. 채팅, 추론, 코드 생성 등 그 외의 모든 것은 인간의 텍스트 위에서 이 작업이 수십억 번 반복되면서 나타나는 현상입니다. 모델이 "생성(generate)"할 때, 모델은 한 조각을 예측하고, 이를 입력값에 추가한 뒤, 다음 조각을 예측하는 과정을 반복합니다. 마치 자동 완성 (autocomplete) 기능을 극단적으로 밀어붙인 것과 같습니다.
토큰 (Token)
위에서 언급한 "조각"입니다. 단어도 문자도 아닌, 그 중간 단계의 빈번하게 나타나는 파편입니다. "computing"은 하나의 토큰일 수 있고, "quadcopter"는 "quad"+"cop"+"ter"로 나뉠 수 있습니다. **토크나이저 (tokenizer)**는 텍스트를 정수 시퀀스로 변환(↔)하는 구성 요소입니다 (각 토큰은 ID를 가집니다). 조회 테이블 (lookup table)을 생각해보세요: 토큰 4521 = " cat". **어휘 사전 (vocabulary)**은 알려진 모든 토큰의 집합이며, 우리의 참조 모델에서는 32,768개입니다.
비유: 이는 사전 압축 (dictionary compression)의 한 형태이며, 개념적으로는 LZ 방식의 사촌 격입니다. 빈번한 시퀀스가 하나의 기호 (symbol)가 됩니다.
BPE (Byte-Pair Encoding)
그 어휘 사전을 "만드는" 알고리즘입니다. 현대적인 바이트 수준 (byte-level) 변형에서는 단일 바이트에서 시작하여, 코퍼스 (corpus)에서 가장 빈번하게 인접한 쌍을 찾아 이를 새로운 기호로 병합하고, 원하는 어휘 사전 크기에 도달할 때까지 이 과정을 반복합니다. 순수하게 통계적이며, 언어학적인 마법은 없습니다.
Level 1 — 수학적 구성 요소 (최소한의 기초)
벡터 (Vector), 행렬 (Matrix), 텐서 (Tensor)
**벡터 (Vector)**는 부동 소수점(floats)의 배열입니다. **행렬 (Matrix)**은 2차원 배열입니다. **텐서 (Tensor)**는 이를 N차원으로 일반화한 것입니다. PyTorch 코드에서는 (B, T, D) = (배치(batch), 시퀀스 내 위치(positions in the sequence), 위치당 차원(dimensions per position))와 같은 형태(shape)를 볼 수 있습니다. 신비로운 것은 없습니다. NumPy와 같이 벡터화된 연산(vectorized operations)을 수행하는 다차원 배열일 뿐입니다.
행렬-벡터 곱셈 (Matrix-vector multiplication) = 변환 (transformation)
모든 딥러닝(deep learning)의 근본적인 연산은 y = W @ x입니다. 벡터 x를 가져와 가중치 (weights) 행렬 W와 곱하면 새로운 벡터 y가 생성됩니다. y의 각 요소는 x의 모든 요소들의 가중치 결합(weighted combination)입니다. 행렬은 하나의 공간에서 다른 공간으로 가는 하나의 학습된 변환(transformation)을 의미합니다. 냉정하게 말해, LLM은 이 곱셈들을 중간중간 약간의 비선형성(non-linearity)과 함께 수백 번 연속해서 수행하는 것입니다. "선형 레이어 (linear layer)" 또는 nn.Linear를 읽는다면, 이것이 바로 그 연산입니다. GPU가 쉼 없이 돌리는 커널인 GEMM(General Matrix Multiply, 일반 행렬 곱셈)을 읽는다면, 이 연산을 의미합니다.
파라미터 (Parameters, 또는 가중치)
해당 행렬들 내부에 들어있는 숫자들입니다. "180M-파라미터 모델"이란 모든 행렬의 모든 요소의 합이 1억 8천만 개의 부동 소수점이라는 뜻입니다. 학습(training) 중에 수정되는 것은 바로 이 파라미터들입니다. 모델의 "지식"은 전적으로 여기에 존재합니다. 아키텍처(architecture)가 인쇄 회로 기판(PCB)이라면, 파라미터는 학습 과정에서 납땜되어 붙는 부품의 값들과 같습니다.
임베딩 (Embedding)
토큰(tokens, 정수)과 수학(math, 벡터) 사이의 가교입니다. 일종의 테이블이라고 볼 수 있습니다. 예를 들어 4521번 행은 "cat"을 나타내는 640개의 부동 소수점으로 이루어진 벡터입니다. 핵심적인 부분은 다음과 같습니다. 학습 과정에서 이 벡터들은 **의미 (meaning)**에 따라 기하학적으로 스스로를 조직합니다. 즉, "cat"과 "feline"은 이 640차원 공간에서 서로 가까워지고, "cat"과 "lathe"는 멀리 떨어지게 됩니다. 방향 그 자체가 의미론적 관계(semantic relations)를 인코딩합니다. 만약 시맨틱 검색(semantic search)을 위해 pgvector나 벡터 데이터베이스(vector database)를 사용해 본 적이 있다면, 이는 정확히 같은 개념입니다. 다만 여기서는 임베딩이 모델의 _내부(internal)_에 존재하며 다른 모든 것과 함께 학습된다는 점이 다릅니다.
d_model
모델의 "너비(width)": 네트워크를 통해 흐르는 각 토큰을 얼마나 많은 부동 소수점(float)이 표현하는지를 나타냅니다. 본 레퍼런스에서는 640입니다. 각 토큰은 640차원 벡터로 입력되어, (문맥이 풍부해진 상태로) 모든 레이어를 거쳐 마지막까지 640차원 벡터로 출력됩니다. 이는 시스템의 데이터 버스(data bus) 역할을 합니다.
활성화 함수 (Activation function, 비선형성)
행렬 곱셈(matrix multiplication) 후에 요소별(element by element)로 비선형 함수를 적용합니다 (ReLU, SiLU, GELU — 모두 동일한 테마의 변형들로, 값을 압축하거나 통과시킵니다). 이것이 필요한 이유: 순수하게 선형적인 연산(linear operations)만 체인처럼 연결되면 수학적으로 단 하나의 선형 연산으로 붕괴됩니다. 즉, 복잡한 것을 학습할 수 없게 됩니다. 비선형성(non-linearity)이야말로 네트워크가 임의의 함수를 표현할 수 있게 해주는 핵심입니다. 코드에서 F.silu를 본다면, 바로 이것을 의미합니다.
Softmax
임의의 숫자들로 이루어진 벡터("점수" 또는 로짓 (logits))를 받아 확률 분포(probability distribution)로 변환하는 함수입니다. 모든 값은 양수이며, 합계는 1이 되고, 높은 점수가 지배적인 형태를 띱니다. 이는 다음 토큰을 선택하기 전의 마지막 단계이며, 어텐션(attention) 내부에서도 등장합니다. **시그모이드 (Sigmoid)**는 단일 케이스를 위한 Softmax의 사촌 격으로, 다른 값들과 독립적으로 하나의 숫자를 (0,1) 사이로 압축합니다.
레벨 2 — 학습 방법: 훈련 (training)
순전파 (Forward pass)
입력을 모델에 통과시켜 출력을 내보내는 과정입니다. 텍스트 → 토큰(tokens) → 임베딩(embeddings) → 20개의 변환 레이어 → 다음 토큰에 대한 확률. 이는 단순한 계산일 뿐, 학습은 일어나지 않습니다.
손실 (Loss, 비용 함수)
"얼마나 틀렸는지"를 나타내는 숫자입니다. LLM의 경우 **교차 엔트로피 (cross-entropy)**를 사용합니다: 훈련 텍스트에서 실제로 뒤따라온 토큰을 가져와 모델이 해당 토큰에 부여한 확률을 확인하고, 그 확률의 -log 값이 손실(loss)이 됩니다. 모델이 정답 토큰에 0.9의 확률을 주었다면 → 낮은 손실. 0.001의 확률을 주었다면 → 높은 손실. 이것이 유일한 학습 신호입니다. 모든 훈련은 "이 숫자를 낮추는 것"입니다.
실무자들이 첫 단계에서 사용하는 검증(sanity check) 방법이 있습니다. 갓 초기화된 모델은 모든 토큰에 대해 1/32,768의 무작위적이고 균등한 확률로 예측을 수행하므로, 초기 손실(loss)은 반드시 -log(1/32768) ≈ 10.4여야 합니다. 만약 이 지점에서 시작한다면 초기화가 건강하게 이루어진 것입니다. 평가 과정에서 발견하는 **당혹도 (perplexity)**는 단순히 e^loss이며, 이는 "모델이 효과적으로 망설이고 있는 토큰의 개수"를 의미합니다.
경사 (Gradient) 및 역전파 (backpropagation)
경사 (gradient)는 다음과 같은 질문에 답합니다: "내가 이 파라미터를 epsilon만큼 이동시킨다면, 손실이 올라가는가 내려가는가, 그리고 얼마나 변하는가?". **역전파 (backpropagation)**는 미분학의 연쇄 법칙 (chain rule)을 체계적으로 적용하여, 최종 오차로부터 역방향으로 전파하며 1억 8천만 개의 모든 파라미터에 대한 이 미분값을 한 번에 계산하는 알고리즘입니다. PyTorch에서는 loss.backward()라는 한 줄로 처리됩니다. 이는 자동화되어 있어 사용자가 직접 구현할 필요가 없습니다.
경사 하강법 (Gradient descent) 및 옵티마이저 (optimizer)
각 파라미터를 어느 방향으로 이동시켜야 할지 알게 되면, 모든 파라미터를 그 방향으로 아주 작은 단계만큼 이동시킵니다. 이 과정을 수백만 번 반복합니다. **학습률 (learning rate, LR)**은 이 단계의 크기이며, 가장 중요한 단일 하이퍼파라미터 (hyperparameter)입니다. 너무 높으면 손실이 폭발하거나 진동합니다. 너무 낮으면 달팽이처럼 느린 속도로 학습하게 됩니다.
PID 제어 루프를 다뤄본 사람을 위한 비유: 경사 (gradient)는 오차 신호이고, 학습률 (learning rate)은 이득 (gain)입니다. 이득이 너무 높으면 진동하며 충돌하고, 너무 낮으면 반응이 둔해집니다.
**옵티마이저 (optimizer)**는 경사를 사용하는 전략입니다. 가장 기본적인 방식인 SGD는 단순히 경사를 적용합니다. AdamW는 경사 (1차 모멘트, 1st moment)와 그 제곱 (2차 모멘트, 2nd moment)의 이동 평균을 유지하며, 이 2차 모멘트를 통해 파라미터별로 단계 크기를 조절합니다. Muon (2025년의 신입)은 행렬 경사를 사용하기 전에 기하학적인 "정리 (cleanup)"를 적용합니다. 지금 당장 그 원리를 이해할 필요는 없습니다. 다만 옵티마이저가 "어떻게 내려가는가"에 대한 방식이며, 어떤 방식이 더 빠르게 내려가는지만 알면 됩니다.
배치 (Batch)
한 번에 하나의 예시만 처리하는 것이 아닙니다. N개의 시퀀스를 하나로 묶고 (이것이 배치 (Batch) 입니다) 그래디언트 (gradient)를 평균냅니다. 이유 1: GPU는 병렬성 (parallelism)을 기반으로 작동합니다. 이유 2: 50만 개의 토큰에 대해 평균을 낸 그래디언트는 단일 시퀀스에서 얻은 것보다 훨씬 노이즈가 적습니다. 그래디언트 누적 (Gradient accumulation) (grad_accum 코드 상 명칭)은 VRAM이 충분하지 않을 때 거대한 배치를 시뮬레이션하는 기법입니다. 즉, 가중치를 업데이트(step)하기 전에 N개의 마이크로 배치 (micro-batch)의 그래디언트를 누적하는 방식입니다.
에포크 (Epoch), 스텝 (step), 체크포인트 (checkpoint)
스텝 (Step) = 한 번의 파라미터 (parameter) 업데이트. 에포크 (Epoch) = 데이터셋 전체를 한 번 통과하는 것 (LLM 사전 학습 (pre-training)에서는 역사적으로 단 한 번의 에포크도 완료하지 못하는 경우가 많았습니다. 데이터셋이 컴퓨팅 예산보다 더 컸기 때문입니다. 오늘날에는 선별된 고품질 데이터를 사용하여 데이터를 두 번 이상 보는 것이 다시 흔해졌습니다). 체크포인트 (Checkpoint) = 파라미터를 디스크에 덤프 (dump)하는 것, 즉 상태 저장 (state save)입니다.
과적합 (Overfitting) 및 홀드아웃 (held-out)
모델이 일반화 (generalizing)하는 대신 훈련 세트 (training set)를 암기해 버린다면, 훈련 손실 (training loss)은 떨어지지만 보지 못한 데이터에서는 떨어지지 않습니다. 이것이 정직한 측정 지표로서 홀드아웃 세트 (held-out set) (한 번도 보여준 적 없는 데이터)를 유지하는 이유입니다. 또한 이 현상을 반대로 활용하는 고전적인 무결성 검사 (sanity check) 방법도 있습니다. 바로 단일 배치를 의도적으로 과적합시키는 것입니다. 만약 모델이 단 32개의 시퀀스조차 암기하지 못한다면, 코드에 버그가 있는 것입니다.
하이퍼파라미터 (Hyperparameters)
학습되지 않고 당신이 직접 선택하는 모든 것들입니다: 학습률 (learning rate), 차원 (dimensions), 레이어 (layers) 수, 배치 크기 (batch size) 등... 하이퍼파라미터 튜닝 (Hyperparameter tuning)은 드론의 Betaflight를 튜닝하는 것과 같습니다. 이론이 있고, 합리적인 시작 값이 있으며, 그 외에 경험적인 숙련도가 필요합니다.
레벨 3 — 트랜스포머 (Transformer) 아키텍처
어텐션 (attention)이 필요한 이유: 컨텍스트 (context) 문제
토큰(token) 하나만으로는 모호합니다 ("bank": 강둑, 금융 기관, 혹은 비행기의 기울기?). 의미는 컨텍스트 (context)에 달려 있습니다. 아키텍처 측면에서의 문제는 다음과 같습니다: 500번째 위치에 있는 토큰의 표현(representation)이 이전 토큰들로부터 어떻게 정보를 통합하는가? 2017년 이전의 해답은 순환 신경망 (RNNs)이었는데, 이는 순차적으로 읽어 들여 모든 것을 하나의 상태 (state)로 압축했습니다. 이는 병목 현상 (bottleneck)을 일으키며 병렬 처리 (parallelism)가 불가능했습니다. Transformer의 해답 (2017, "Attention Is All You Need")은 어텐션 (attention)입니다.
셀프 어텐션 (Self-attention): 직관적 이해
각 토큰은 다른 토큰들의 "데이터베이스에 대한 쿼리 (query)"를 수행합니다. 기계적으로는, 각 토큰으로부터 세 개의 벡터(세 번의 행렬 곱셈, 전형적인 wq, wk, wv)를 도출합니다:
- 쿼리 (Query, Q): "내가 찾고 있는 것" — 예: 토큰 "on"은 자신과 결합할 주어를 찾습니다.
- 키 (Key, K): "검색 키로서 내가 제공하는 것" — 예: "cat"은 자신을 동물 주어로 광고합니다.
- 밸류 (Value, V): "내가 선택되었을 때 전달할 내용"
각 토큰에 대해: 자신의 Q와 모든 이전 토큰의 K 사이의 내적 (dot product)을 구하고 (→ 어피니티 점수 (affinity scores)), $\sqrt{\text{head dimension}}$ (여기서는 $\sqrt{64} = 8$)으로 스케일링을 조정합니다. 이 과정이 없다면 벡터가 커질 때 점수가 지나치게 커져 소프트맥스 (softmax)가 포화되고 그래디언트 (gradients)가 소실됩니다. 그 다음 점수들에 대해 소프트맥스를 적용하여 (→ 합계가 1이 되는 가중치), 토큰의 새로운 표현을 V의 가중 평균으로 산출합니다. 결과적으로: 각 토큰은 학습 가능하며 내용에 따라 결정되는 가중치를 통해 관련 토큰들로부터 정보를 "흡수"합니다.
비유: 해시 테이블 (hash table)에서의 조회와 유사하지만, 퍼지(fuzzy)하고 미분 가능합니다. 키(key)에 대한 정확한 일치 대신, 모든 키와의 유사도 점수를 얻고 그에 비례하여 모든 키로부터 정보를 가져옵니다.
인과적 마스크 (Causal mask)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기