Week 2

Decoder-only LLM overview

“오늘 부산의 날씨는”이라는 문자열이 어떻게 다음 토큰의 확률로 바뀔까? LLM(large language model)의 구조와 학습을 정리한 Zhao 등의 서베이1를 바탕으로, 텍스트 입력부터 출력까지 따라간다. 여기서 잡을 큰 흐름은 텍스트의 수치화 → 문맥 반영 → 다음 토큰 선택이다.

1. 한 토큰의 생성 과정

“오늘 부산의 날씨는” 뒤를 이어 쓰게 한다고 하자. 먼저 텍스트를 token ID 열(sequence)로 바꾸고, 각 ID에 대응하는 벡터에 문맥을 반영한다. 마지막 위치의 벡터로 다음 토큰의 점수를 계산한 뒤 토큰 하나를 선택한다.

아래 토큰 분할과 ID는 설명을 위한 가상 값이다. 는 공백이며, 입력 ID가 다섯 개이므로 시퀀스 길이(sequence length) nn 은 5이다. 시퀀스 길이는 문자 수나 단어 수와 구분한다.

텍스트 → Tokenizer → ID 열오늘 · ␠부산 · 의 · ␠날씨 · 는[17, 42, 9, 83, 11]Embedding → Decoder 스택토큰마다 문맥 벡터 생성 · 마지막 위치 h₅ 사용LM head → Logits → Softmax 확률Vocabulary에 있는 모든 토큰에 대하여 확률 계산토큰 선택 → ID 21을 뒤에 추가 → 다음 예측[17, 42, 9, 83, 11, 21] · 길이 5 → 6Decode 결과: 오늘 부산의 날씨는 맑
가상 한국어 예문으로 직접 구성한 생성 흐름. 선택한 ID를 입력 뒤에 붙여 이 과정을 반복한다.

모델의 점수 계산과 토큰 선택 규칙을 구분해 두자. 모델이 같은 점수를 출력해도 가장 높은 후보를 고를지, 확률에 따라 뽑을지에 따라 이어지는 문장이 달라질 수 있다.

2. 모델 계산과 학습

도입 그림의 계산을 각 위치의 벡터를 행으로 모은 행렬로 살펴보자. 행 하나는 토큰 위치 하나에 대응한다. 생성에서는 마지막 행으로 다음 토큰을 고르고, 학습에서는 여러 행의 예측을 함께 채점한다.

2-1. Token ID와 embedding

Tokenizer는 어휘 집합(vocabulary)과 분할 규칙을 이용해 문자열을 정수 ID 열로 바꾼다. 도입 예문에서는 [17, 42, 9, 83, 11]이다. 임베딩(embedding)은 그 ID에 대응하는 실수 벡터를 제공한다. ID 42는 테이블의 행 번호일 뿐, ID 17보다 의미가 크거나 강하다는 뜻이 아니다.

이 노트의 기준 모델은 Llama 3 8B다.2 Vocabulary 크기 V=128,256V=128{,}256은 선택 가능한 전체 token ID 수이고, hidden dimension d=4,096d=4{,}096은 토큰 벡터 하나의 성분 수다.

ERV×d,xi=Eti,XRn×dE\in\mathbb{R}^{V\times d},\qquad x_i=E_{t_i},\qquad X\in\mathbb{R}^{n\times d}

nn은 앞에서 설명한 sequence length, 즉 입력 ID 열의 토큰 수다. 예문의 다섯 ID로 다섯 행을 조회하면 5×40965\times4096 행렬 XX가 된다. 같은 ID는 처음에 같은 embedding을 받지만, 모델을 통과한 뒤에는 앞선 문맥에 따라 다른 상태(hidden state)을 갖게 된다.

여기서는 tokenizer가 정해져 있다고 둔다. Vocabulary와 병합 규칙의 학습, 어휘 크기의 선택, 처음 보는 문자열의 처리는 다음 Tokenizer 노트에서 다룬다.

언급이 없으면, 배치(batch) 차원을 생략한다. 여러 입력을 한 번에 처리할 때에는 대부분의 텐서 앞에 batch 크기 BB가 붙는다.

2-2. Llama 3 8B 구조

임베딩 행렬은 32개의 decoder 블록을 차례로 통과한다. 각 블록의 구조는 같지만 가중치는 별개다.

블록을 지나는 동안 n×dn\times d라는 모양은 유지되고, 마지막 LM(language model) head에서 각 토큰의 벡터가 vocabulary 전체의 점수로 바뀐다.

Llama 3 8B · 전체 구조토큰 ID 열 (n개)Token embedding128,256개 행 × 4,096개 성분n × 4,096Decoder block 1Decoder block 2Decoder block 32각 블록의 구성Pre-norm + residualCausal GQAQ: 32 heads · K/V: 8 headshead 차원: 128RoPE: Q와 K에 적용SwiGLU FFN4,096 → 14,336 → 4,096n × 4,096최종 RMSNormn × 4,096lm_head (Linear)4,096 → 128,256Logits: n × 128,25632개 블록은 구조가 같고가중치는 각각 다르다.입력 embedding과출력 head는 가중치 미공유
Meta의 Llama 3 공식 구현을 바탕으로 구성한 전체 구조도. 배치 차원은 생략했다. SwiGLU의 두 입력 투영 경로는 차원 변화로 요약했으며, 블록 내부의 연산과 residual 경로는 §2-3에서 설명한다.

2-3. 문맥과 벡터 변환

Decoder 블록 안에서는 attention과 FFN(feed-forward network)이 서로 다른 일을 한다. Attention은 위치 사이의 정보를 섞고, FFN은 point-wise (or, token-wise)하게 벡터를 비선형 변환한다. Causal mask 때문에 각 위치는 자신과 앞선 위치만 참조한다. 예문의 마지막 “는”은 앞의 “오늘 부산의 날씨”를 반영할 수 있지만, 첫 “오늘”은 뒤쪽 토큰을 보지 못한다.

Llama는 각 연산 전에 RMSNorm(root mean square normalization)으로 벡터의 크기를 정규화한다. 연산 결과를 원래 입력에 더하는 경로가 잔차 연결(residual connection)이다. 블록 하나의 입력을 XX, 중간 결과를 AA, 출력을 YY라고 하면 다음과 같다.4

A=X+Attn(RMSNorm(X))A=X+\operatorname{Attn}(\operatorname{RMSNorm}(X)) Y=A+FFN(RMSNorm(A))Y=A+\operatorname{FFN}(\operatorname{RMSNorm}(A))

더하는 두 행렬의 모양이 같아야 하므로 attention과 FFN은 각각 n×dn\times d 형태로 결과를 돌려준다. 전체 구조도에 표시한 부품들은 이 두 연산을 구체화한다.

  • GQA(grouped-query attention): 여러 query head가 key–value head를 공유한다. Llama 3 8B에서는 query head 4개가 한 쌍의 key–value head를 공유한다.
  • RoPE(rotary position embedding): 각 층의 query와 key에 위치에 따른 회전을 적용해 위치 관계를 반영한다.
  • SwiGLU(Swish-gated linear unit): FFN의 두 입력 투영 중 한 경로에 활성화 함수를 적용하고, 다른 경로와 원소별로 곱한 뒤 출력 차원으로 투영한다.

여기서는 각 부품의 역할까지 이해하면 된다. RoPE·GQA·SwiGLU의 세부 연산은 3주차에서 다룬다.

2-4. Logits와 확률

마지막 decoder 출력에 최종 RMSNorm을 적용한 결과를 HH라고 하자. HHii번째 행 hih_iii번째 위치의 문맥을 반영한 벡터다. 도입 그림의 h5h_5는 이 행렬의 마지막 행이다. LM head는 hidden dimension dd를 vocabulary dimension VV로 바꾸는 선형 변환(linear projection)이다. Llama 3 8B에서는 Linear(4096, 128256, bias=False)에 해당한다.4

HRn×d,WLMRd×V,Z=HWLMRn×VH\in\mathbb{R}^{n\times d},\qquad W_{LM}\in\mathbb{R}^{d\times V},\qquad Z=HW_{LM}\in\mathbb{R}^{n\times V}

행렬 곱 Z=HWLMZ=HW_{LM}동일한 LM head를 각 행에 적용한 결과를 모은 것이다. 한 행만 쓰면 zi=hiWLMz_i=h_iW_{LM}이고, 예문의 마지막 행에서는 다음과 같다.

h51×4096  WLM4096×128256=z51×128256\underbrace{h_5}_{1\times4096}\; \underbrace{W_{LM}}_{4096\times128256} =\underbrace{z_5}_{1\times128256}

모든 다섯 행에 적용하면 5×1282565\times128256 행렬 ZZ가 된다. 각 행은 해당 위치까지 읽었을 때 그다음 토큰의 점수(logits)다. 생성에서는 이 중 마지막 행 z=z5z=z_5가 필요하며, 앞선 네 행의 logits까지 계산할 필요는 없다. 도입 그림은 바로 이 마지막 행의 계산을 보여 준다.

Softmax는 각 행의 vocabulary 축에 적용한다. 따라서 각 행마다 합이 1인 확률 분포가 생긴다. 마지막 행에 대한 식은 다음과 같다.

p(vt1:n)=exp(zv)u=1Vexp(zu)p(v\mid t_{1:n})=\frac{\exp(z_v)}{\sum_{u=1}^{V}\exp(z_u)}

계산을 작게 보기 위해 vocabulary가 세 후보뿐이라고 가정하자. 실제 Llama 출력에서 일부만 발췌한 값이 아닌, 별도의 가상 예제다.

후보 (가상 ID)LogitSoftmax 확률
␠맑 (21)266.5%
␠흐 (35)124.5%
␠비 (64)09.0%

세 점수 [2,1,0][2,1,0]을 softmax에 넣으면 약 [0.665,0.245,0.090][0.665,0.245,0.090]이 된다. LM head가 dd개 성분을 VV개 점수로 바꾸고, softmax는 개수를 유지하면서 합이 1인 확률로 바꾼다. 실제 모델에서는 vocabulary 전체에 대해 같은 계산을 수행한다.

입력 embedding과 LM head는 모양이 전치(transpose) 관계여서 가중치를 공유하는 weight tying도 가능하다. 주로 on-device 모델(상대적으로 작은 모델)에서 사용한다. Llama 3 8B 모델은 그림처럼 별도 가중치를 쓴다.4

2-5. 다음 토큰 학습

생성할 때는 현재 입력 뒤에 올 토큰을 모르므로 마지막 행에서 토큰을 선택했다. 학습할 때는 데이터에 이어지는 토큰이 이미 주어져 있어, 각 행의 예측을 한 칸 뒤의 정답과 함께 비교할 수 있다. 도입 예문 뒤에 ␠맑이 이어지는 학습 데이터를 가정하면 다음과 같다. 토큰 분할과 ID는 앞의 가상 예제를 그대로 사용한다.

입력 위치해당 행이 참조할 수 있는 토큰다음 토큰 정답
1: 오늘오늘␠부산 (42)
2: ␠부산오늘 · ␠부산 (9)
3: 오늘 · ␠부산 · 의␠날씨 (83)
4: ␠날씨오늘 · ␠부산 · 의 · ␠날씨 (11)
5: 오늘 · ␠부산 · 의 · ␠날씨 · 는␠맑 (21)

입력 ID 열은 [17, 42, 9, 83, 11], 정답 ID 열은 [42, 9, 83, 11, 21]이다. Causal mask가 각 위치에서 볼 수 있는 범위를 제한한다.

이처럼 학습하는 방식을 teacher forcing이라고 한다. 각 행이 한 칸 뒤의 정답에 준 확률로 cross-entropy loss를 구한다. 예를 들어 마지막 행의 정답이 ␠맑이고 그 확률이 0.5라면, 그 위치의 loss는 log0.50.693-\log0.5\approx0.693이다. 이 값이 작아지도록 역전파하면 embedding·decoder·LM head의 가중치가 갱신된다. tokenizer는 이 gradient로 바뀌지 않는다.

Causal mask는 뒤의 정답을 읽지 못하게 하면서 여러 위치에 대하여 한 번의 forward로 계산하게 한다. 학습에서는 정답 시퀀스가 이미 있으므로 자기회귀적인 방법으로 학습을 하지 않아도 된다.

3. 생성

3-1. Greedy와 sampling

가장 높은 점수의 토큰을 고르는 방식이 greedy decoding이고, 확률에 따라 뽑는 방식이 sampling이다. 도입 예문에서 greedy는 ␠맑을 고른다. Sampling은 같은 모델 출력에서도 ␠흐␠비를 고를 수 있다.

3-2. Sampling parameter

Temperature T>0T>0는 softmax 전에 logits를 나누어 분포의 집중도를 조절한다.

pT(v)=exp(zv/T)uexp(zu/T)p_T(v)=\frac{\exp(z_v/T)}{\sum_u\exp(z_u/T)}

TT가 작을수록 큰 logit에 확률이 집중된다. T=0T=0을 이 식에 대입하지는 않는다. 구현에서 temperature 0을 greedy 선택의 의미로 받는 경우가 있다. Top-k는 상위 kk개, top-p는 누적 확률이 기준에 도달하는 최소 후보 집합을 남기고 확률의 합이 1이 되도록 다시 정규화(renormalization)한다.5

같은 logits [2,1,0][2,1,0]에서도 설정에 따라 실제로 뽑는 분포가 달라진다. 아래 값은 §2-4의 세 후보만 놓고 계산한 예다. 각 행은 별도 설정이며, top-k와 top-p 예시는 T=1T=1을 사용한다.

설정␠맑␠흐␠비효과
T=1T=166.5%24.5%9.0%원래 softmax 분포
T=0.5T=0.586.7%11.7%1.6%높은 점수에 더 집중
T=2T=250.6%30.7%18.6%낮은 점수의 후보도 더 자주 선택
Top-k, k=2k=273.1%26.9%0%후보 수를 두 개로 제한
Top-p, p=0.8p=0.873.1%26.9%0%누적 확률 80%에 도달하려면 앞의 두 후보가 필요

Top-k는 후보 수를 고정하지만, top-p는 그 시점의 분포에 따라 남기는 후보 수가 달라진다. Temperature를 높인다고 응답 품질이 반드시 좋아지는 것은 아니다. 더 다양한 토큰을 시도하는 효과와 낮은 확률의 부적절한 토큰을 고를 가능성을 함께 보아야 한다.

이 밖에도 반복을 억제하는 penalty나 생성 길이·종료 조건을 정하는 parameter가 있다. 지원 항목과 여러 설정을 적용하는 순서는 구현마다 다를 수 있다.

3-3. 생성 루프 (Autoregressive Generation)

선택한 token ID를 기존 ID 열 뒤에 붙이면 다음 입력이 된다. 도입 예문은 이후 다음처럼 이어질 수 있다.

오늘 부산의 날씨는 맑       → 습니다
오늘 부산의 날씨는 맑습니다 → 종료 토큰

실제 문자열은 ID에 대응하는 바이트 조각을 이어 붙여 복원하며, 한 토큰이 항상 한 단어나 완성된 글자인 것은 아니다.

정해진 종료 토큰이나 길이 제한에 도달하면 생성을 멈춘다. 효율적인 구현에서는 과거 위치의 key와 value를 KV(key–value) cache에 보관해 재사용한다. 캐시는 이전 계산을 반복하는 비용을 줄인다.

4. 정리 영상

3Blue1Brown, Transformers, the tech behind LLMs (2024). 입력 벡터에서 출력 확률까지의 흐름을 복습한다.

5. CS336 강의 자료

Stanford의 CS336: Language Modeling from Scratch는 데이터 준비부터 언어모델 구현·학습·평가까지 다루는 강의다. 아래는 2026년 봄 학기 공식 강의 목록이며, 녹화는 공식 YouTube 재생목록에서 볼 수 있다.

CS336 강의 목록 펼치기 (Spring 2026, 1–17강)
LectureDescription
1Overview, tokenization
2PyTorch (einops), resource accounting (FLOPs, memory, arithmetic intensity)
3Architectures, hyperparameters
4Attention alternatives and mixture of experts
5GPUs, TPUs
6Kernels, Triton
7Parallelism
8Parallelism
9Scaling laws
10Inference
11Scaling laws
12Evaluation
13Data (sources, datasets)
14Data (filtering, deduplication, mixing, synthetic data)
15Mid/post-training (SFT/RLHF)
16Post-training - RLVR
17Alignment - multimodality

Footnotes

  1. Zhao, W. X., et al. (2025). A Survey of Large Language Models. arXiv:2303.18223v16.

  2. Dubey, A., et al. (2024). The Llama 3 Herd of Models. arXiv:2407.21783v1.

  3. Bae, S., et al. (2025). Mixture-of-Recursions: Learning Dynamic Recursive Depths for Adaptive Token-Level Computation. NeurIPS 2025. 논문.

  4. Meta. (2024). Llama 3 reference implementation. tokenizer.py, model.py. 2 3

  5. Holtzman, A., Buys, J., Du, L., Forbes, M., & Choi, Y. (2020). The Curious Case of Neural Text Degeneration. ICLR 2020. arXiv:1904.09751.