부록 부록
A.1 (부록) 수학·배경 준비
이 책의 본문은 대략 열몇 개의 수학 조각에 기대어 작동한다. 임베딩은 벡터이고, 어텐션은 행렬곱이고, 손실은 교차엔트로피이고, 학습은 경사하강이고, 정밀도는 부동소수다. 본문은 이 조각들이 필요해지는 자리마다 그때그때 풀어 쓴다 — 배경이 없다고 독자를 좌초시키지 않는 것이 이 책의 약속이다. 하지만 그렇게 흩어 놓으면 같은 도구가 여러 장에서 조금씩 다른 측면으로 나타나 오히려 혼동한다. 그래서 여기 한곳에 모았다.
이것은 교과서가 아니라 도구상자다. 선형대수·확률·미적분을 처음부터 가르치려는 것이 아니라, 이 책을 읽는 데 실제로 손에 쥐게 되는 도구만 골라 직관과 핵심 식을 되살리고, 각 도구가 본문 어디에서 왜 다시 나타나는지를 다룬다. 증명은 대부분 생략하고, 정밀한 정리보다 "무엇이 무엇을 밀고 당기는가"의 방향성을 앞세운다. 순서대로 통독할 필요도 없다 — 본문을 읽다 어떤 개념에서 막히면 그 절만 뽑아 봐도 된다. 반대로, 이 부록으로 부족하다 싶으면 그것은 정상이다. 완전한 이해가 필요하면 표준 교재로 가야 하고, 맨 끝에 몇 권을 적어 뒀다.
네 갈래로 나뉜다. 선형대수가 트랜스포머와 서빙의 골격을 세우고, 확률·정보이론이 손실·정렬·증류의 언어를 주며, 미적분·최적화가 학습이라는 엔진을 가동하고, 수치가 그 모든 것을 유한 정밀도의 컴퓨터 위에서 붕괴하지 않게 붙든다.
A.1.1 벡터·행렬·텐서 — 모양이 곧 이야기다
딥러닝에서 데이터도, 파라미터도, 연산 결과도 거의 전부가 숫자 배열이다. 이 배열을 축의 개수로 부른다. 숫자 하나는 스칼라($x = 3.2$)다. 숫자를 한 줄로 늘어놓으면 벡터 $\mathbf{x} = [x_1, \dots, x_d] \in \mathbb{R}^d$인데, 이 책에서 벡터는 거의 항상 하나의 토큰·단어·문서의 의미를 담은 $d$차원 공간의 한 점이다 — 임베딩이 정확히 이것이고(1.2), 의미가 비슷한 것들이 그 공간에서 가까이 모이도록 학습된다(6.2). 숫자를 격자로 놓으면 행렬 $W \in \mathbb{R}^{m\times n}$($m$행 $n$열)이고, 신경망의 가중치가 대표적인 행렬이다. 축이 셋 이상이면 텐서라 부르는데, LLM 실무에서 만지는 활성값은 대개 (배치, 시퀀스, d_model) 꼴의 3축 텐서다. 수학의 "텐서"에는 더 엄밀한 정의가 있지만, 이 책에서는 "여러 축을 가진 숫자 배열"이라는 실용적 의미로 충분하다.
실무에서 이해의 90%, 그리고 버그의 90%가 모양(shape)에서 갈린다. 어떤 연산이든 "무슨 모양이 들어가 무슨 모양이 나오나"를 먼저 물어야 한다. 두 텐서를 더하려는데 축이 안 맞아 조용히 브로드캐스트되거나, 행렬곱의 안쪽 차원이 어긋나 잘못된 값이 나오는 일이 대규모 코드에서 끝없이 반복된다. 이 책이 어텐션을 설명하며 $n\times d_{model}$, $n\times n$, $n\times d_v$처럼 단계마다 모양을 집요하게 병기하는 이유가 여기 있다(1.4). 모양을 눈으로 따라가면 트랜스포머의 순전파 전체가 "숫자 배열이 모양을 바꿔 가며 흐르는 과정"으로 또렷하게 보인다.
A.1.2 행렬곱, 그리고 왜 딥러닝이 행렬곱의 사슬인가
신경망을 한 줄로 쓰게 해 주는 연산이 행렬곱이다. $A \in \mathbb{R}^{m\times k}$와 $B \in \mathbb{R}^{k\times n}$의 곱 $C = AB$는 $\mathbb{R}^{m\times n}$이고, 각 성분은 $A$의 한 행과 $B$의 한 열의 내적이다.
$$C_{ij} = \sum_{p=1}^{k} A_{ip} B_{pj}$$
규칙은 둘이다. 안쪽 차원이 맞아야 하고($A$의 열 = $B$의 행 = $k$), 결과 모양은 바깥 차원 $m\times n$이 된다. 그리고 행렬곱은 순서를 바꾸면 값이 달라진다 — 일반적으로 $AB \ne BA$이고, 애초에 모양이 안 맞아 한쪽 순서로는 곱셈 자체가 정의되지 않는 경우도 많다. "층을 쌓는다"는 것이 곧 "행렬을 순서대로 곱한다"는 뜻이니, 이 비가환성이 곧 층의 순서가 의미를 갖는 이유다.
완전연결층 $\mathbf{h} = W\mathbf{x}$를 작은 값으로 끝까지 실행해 보자.
$$W = \begin{bmatrix} 1 & 2 \\ 0 & 1 \\ 3 & -1 \end{bmatrix}, \quad \mathbf{x} = \begin{bmatrix} 2 \\ 1 \end{bmatrix} \;\Rightarrow\; \mathbf{h} = \begin{bmatrix} 1\cdot2+2\cdot1 \\ 0\cdot2+1\cdot1 \\ 3\cdot2+(-1)\cdot1 \end{bmatrix} = \begin{bmatrix} 4 \\ 1 \\ 5 \end{bmatrix}$$
$W$의 각 행이 하나의 출력 뉴런이고, 그 행과 입력 벡터의 내적이 그 뉴런이 내는 값이다. 그래서 행렬곱을 "여러 개의 내적을 한 번에 계산하는 연산"으로 읽는 습관이 중요하다 — 이 관점이 곧 어텐션 점수 $QK^\top$를 읽는 핵심이다.
입력이 여럿이면 벡터를 행으로 쌓아 $X$로 만들고 $H = XW^\top$처럼 한 번의 큰 행렬곱으로 전부 처리한다. GPU가 가장 빠르게 하는 일이 바로 이 대형 행렬곱(General Matrix Multiply, GEMM)이다. 그래서 "신경망 = 행렬곱의 사슬"이라는 사실이 곧 GPU로 대규모 학습·추론이 가능한 이유가 된다. 트랜스포머 블록의 핵심 두 부품이 이 사실을 그대로 보여 준다. 어텐션의 점수 $QK^\top$는 $Q,K \in \mathbb{R}^{n\times d_k}$의 곱이라 성분 $(QK^\top)_{ij} = \mathbf{q}_i\cdot\mathbf{k}_j$가 정확히 질의 $i$와 키 $j$의 내적, 곧 "토큰 $i$가 토큰 $j$에 얼마나 주목할지"의 유사도다. 행렬곱 한 번이 $n\times n$개의 내적을 동시에 낸다.
$$\text{Attention}(Q,K,V) = \text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_k}}\right)V$$
이 한 줄이 세 번의 굵은 행렬곱($QK^\top$, 그 가중치와 $V$의 곱, 그 전의 $Q,K,V$ 투영)으로 이루어진다. $\sqrt{d_k}$로 왜 나누는지는 내적의 분산이 $d_k$에 비례한다는 확률 논증에서 나오는데, 그것은 A.1.5에서 분산을 복습하며 잇는다. 다른 부품인 위치별 FFN $\sigma(xW_1)W_2$도 각 토큰 벡터를 넓은 공간으로 폈다가 접는 두 번의 행렬곱이고, 모델 파라미터의 큰 몫이 이 $W_1,W_2$에 몰려 있다.
결국 한 번의 순전파는 임베딩 조회로 시작해 (어텐션 행렬곱 + FFN 행렬곱)을 $L$층 반복하고 언임베딩 행렬곱으로 끝난다. 신경망의 학습·추론 비용이 사실상 GEMM 비용인 이유가 이것이고(비용을 실제 FLOP으로 세는 것은 1.4·5.1), 양자화(5.2)·병렬화(2.4)가 결국 "이 행렬곱들을 어떻게 더 싸게, 어떻게 나눠 하느냐"의 문제인 이유도 이것이다.
A.1.3 내적·노름·코사인 유사도
앞 절에서 내적이 어텐션의 핵심이라 했으니 그 자체를 조금 더 들여다볼 값이 있다. 두 벡터의 내적(dot product) $\mathbf{a}\cdot\mathbf{b} = \sum_i a_i b_i = \mathbf{a}^\top\mathbf{b}$는 두 벡터가 같은 방향을 가리킬수록 크고, 직교하면 0, 반대 방향이면 음수다. "질의와 키가 얼마나 닮았나"를 재는 어텐션의 도구가 정확히 이 내적이다(1.4).
벡터의 크기는 노름(norm)으로 잰다. 가장 흔한 L2 노름은 $\lVert\mathbf{x}\rVert_2 = \sqrt{\sum_i x_i^2}$, L1 노름은 $\lVert\mathbf{x}\rVert_1 = \sum_i |x_i|$다. 노름은 여러 곳에서 실무의 조정 변수가 된다 — 가중치가 너무 커지지 않게 손실에 $\lVert W\rVert^2$를 더하는 가중치 감쇠(L2 정규화, 1.3), 그래디언트의 노름이 임계값을 넘으면 잘라 학습 발산을 막는 그래디언트 클리핑(2.6), 임베딩을 단위 노름으로 맞춰 크기를 빼고 방향만 남기는 정규화(6.2)가 전부 노름의 응용이다.
크기를 빼고 방향만 비교하는 것이 코사인 유사도다.
$$\cos\theta = \frac{\mathbf{a}\cdot\mathbf{b}}{\lVert\mathbf{a}\rVert\,\lVert\mathbf{b}\rVert} \in [-1, 1]$$
1이면 같은 방향, 0이면 직교, −1이면 반대다. 두 텍스트가 의미상 얼마나 가까운지를 재는 의미 검색(벡터 DB)의 표준 척도가 이것이다(6.2) — 문서의 길이(벡터 크기)에 휘둘리지 않고 "무엇에 관한 글인가"의 방향만 비교하기 때문이다. 작은 예로 개략을 파악하자. $\mathbf{a}=[1,0]$, $\mathbf{b}=[1,1]$이면 내적은 $1$, $\lVert\mathbf{a}\rVert=1$, $\lVert\mathbf{b}\rVert=\sqrt2$이므로 $\cos\theta = 1/\sqrt2 \approx 0.707$, 곧 두 벡터 사이 각이 45°다.
A.1.4 랭크·저랭크·SVD — 행렬을 적은 정보로 압축하기
행렬에는 눈에 보이는 크기와, 실제로 담긴 정보량이 따로 있다. 어떤 공간을 펴는 데 필요한 독립 방향의 수가 차원(dimension)이고, LLM의 $d_{model}$이 임베딩 공간의 차원이다. 한 행렬 안에서 서로 독립인 행(또는 열)의 최대 수는 랭크(rank)라 부르는데, $m\times n$ 행렬의 랭크는 아무리 커도 $\min(m,n)$을 넘지 못한다. 랭크가 그보다 낮으면(저랭크, low-rank) 그 행렬은 겉보기 크기보다 훨씬 적은 정보로 표현할 수 있다.
이 사실이 실무에서 돈이 되는 지점이 있다. 미세조정으로 생기는 가중치 변화 $\Delta W \in \mathbb{R}^{m\times n}$가 대체로 저랭크라는 관찰이 그것이다. 그렇다면 $\Delta W$ 전체를 저장·학습할 것이 아니라 두 얇은 행렬의 곱 $\Delta W = BA$($B\in\mathbb{R}^{m\times r}$, $A\in\mathbb{R}^{r\times n}$, $r \ll m,n$)로 근사하면 된다. 파라미터가 $mn$에서 $r(m+n)$으로 급감한다. 숫자로 확정해 보자. $m=n=4096$이면 $\Delta W$ 전체를 학습할 때 파라미터가 $4096^2 = 16{,}777{,}216$개, 약 1680만이다. 랭크 $r=8$인 두 행렬로 근사하면 $8\times(4096+4096) = 65{,}536$개, 약 6만 5천으로 정확히 256분의 1이다. 이것이 LoRA가 소비자 GPU에서도 큰 모델을 미세조정하게 만드는 수학적 골격이다(3.8) — 뒤에 붙는 QLoRA는 여기에 양자화까지 겹쳐 메모리를 더 줄인다.
저랭크가 왜 통하는지, 그리고 "행렬에서 무엇이 중요한 방향인가"를 알려 주는 것이 특이값 분해(Singular Value Decomposition, SVD)다. 먼저 정사각 행렬의 직관부터. $A\mathbf{v} = \lambda\mathbf{v}$를 만족하는 방향 $\mathbf{v}$가 고유벡터, 그 배율 $\lambda$가 고유값이다 — $A$라는 변환이 대부분의 벡터는 방향을 틀어 놓지만, 이 특별한 몇 방향만은 방향을 그대로 둔 채 길이만 $\lambda$배 늘리거나 줄인다. 그 방향들이 그 변환의 "축"이다. 이것을 정사각이 아닌 일반 행렬로 확장한 것이 SVD다.
$$A = U\Sigma V^\top$$
$\Sigma$는 대각선에 특이값 $\sigma_1 \ge \sigma_2 \ge \dots \ge 0$을 내림차순으로 놓은 행렬이고 $U,V$는 직교(회전) 행렬이라, 이 식은 "어떤 선형변환이든 회전 → 축별로 늘이기 → 회전으로 분해된다"고 읽는다. 큰 특이값에 대응하는 축이 그 행렬의 주요 방향이고, 작은 특이값 축은 기여가 미미하다. 여기서 딥러닝에 곧장 닿는 사실 하나가 나온다. 가장 큰 $r$개의 특이값만 남기면 그것이 그 행렬의 최적 랭크-$r$ 근사가 된다(Eckart–Young 정리). 즉 SVD는 "행렬을 적은 랭크로 가장 잘 압축하는 법"을 정확히 알려 준다 — 저차원 임베딩(PCA), 저랭크 근사(LoRA의 정당화), 가중치 압축·양자화 분석(5.2)이 전부 이 한 사실에 기반을 둔다.
실무에서 LLM을 학습하며 SVD를 직접 실행할 일은 거의 없다. 여기서 챙길 것은 계산 절차가 아니라 "행렬에는 중요한 방향과 덜 중요한 방향이 있고, 적은 랭크로 근사할 수 있다"는 한 문장이다. 이 한 줄이 LoRA와 모델 압축을 읽는 렌즈가 된다.
A.1.5 확률의 언어 — 분포·조건부·베이즈·기댓값
언어모델은 근본적으로 확률 모델이다. 다음에 올 토큰의 확률분포를 내는 것이 그 전부다(1.1). 그러니 이 책이 손실·평가·정렬·증류에서 확률의 언어를 끊임없이 쓰는 것은 당연하다. 확률분포는 각 결과에 0 이상의 값을 주고 전부 합하면 1이 되는 것으로, 이산 분포 $p(x)$는 $\sum_x p(x) = 1$을 만족한다 — 언어모델 마지막 층의 softmax가 어휘 전체에 걸친 바로 이런 이산 분포다. 두 사건이 함께 일어날 확률은 결합확률 $p(x, y)$, 거기서 한 변수를 합해 없앤 것은 주변확률 $p(x) = \sum_y p(x, y)$, 그리고 $x$가 주어졌을 때 $y$의 확률은 조건부확률 $p(y \mid x) = p(x, y)/p(x)$다.
이 책에서 가장 중요한 것은 조건부다. 언어모델의 정의 자체가 조건부 분포의 곱이기 때문이다. 어떤 텍스트든 그 확률은 연쇄법칙으로 이렇게 분해된다.
$$p(x_{1:T}) = \prod_{t=1}^{T} p(x_t \mid x_{<t})$$
"앞 토큰들이 주어졌을 때 다음 토큰" 하나만 잘 모델링하면 어떤 문장의 확률이든 이 곱으로 얻는다 — 이것이 자기회귀이고, 생성이 왜 토큰을 하나씩 이어 붙이는 직렬 과정인지의 근원이다(1.7·5.1). 조건부의 정의를 뒤집으면 베이즈 정리가 나온다.
$$p(y \mid x) = \frac{p(x \mid y)\, p(y)}{p(x)}$$
사후확률 $\propto$ 가능도 $\times$ 사전확률, 곧 "증거 $x$를 보고 가설 $y$에 대한 믿음을 갱신한다"는 추론의 골격이다. 베이즈가 이 책에 전면으로 자주 나오진 않지만, 언어모델 학습을 "데이터를 설명하는 가능도를 최대화한다"로 읽을 때, 그리고 문맥 내 학습을 "암묵적 베이즈 추론"으로 보는 가설(6.1, 미해결)의 밑바탕에 조용히 내재되어 있다.
분포를 요약하는 두 수가 남았다. 기댓값(expectation) $\mathbb{E}_{x\sim p}[f(x)] = \sum_x p(x)\, f(x)$는 분포에 따른 평균, 곧 "무한히 많이 뽑아 평균 내면 수렴하는 값"이다. 분산(variance) $\text{Var}(X) = \mathbb{E}[(X - \mathbb{E}[X])^2]$는 그 평균에서 얼마나 퍼져 있나를 잰다. 기댓값은 정렬의 강화학습 목적함수에서 곧장 쓰인다 — PPO는 정책이 만든 응답의 기대 보상을 최대화한다(3.4). 분산은 어텐션의 $\sqrt{d_k}$를 정당화하는 데 쓰인다. $q$와 $k$의 각 성분이 독립이고 평균 0, 분산 1이라 가정하면 내적 $\mathbf{q}\cdot\mathbf{k} = \sum_{i=1}^{d_k} q_i k_i$의 분산은 독립 항들의 분산이 더해져 $d_k$가 되고, 따라서 표준편차가 $\sqrt{d_k}$다. $d_k=64$면 점수가 전형적으로 $\pm 8$, $d_k=128$이면 $\pm 11.3$까지 전부 커진다 — 이 상태로 softmax를 취하면 한 항으로 쏠려 포화한다. $\sqrt{d_k}$로 나눠 표준편차를 다시 1로 되돌리는 것이 그래서 필수다(유도의 나머지는 1.4). 분산은 또 미니배치 그래디언트가 전체 그래디언트의 잡음 섞인 추정이라는 사실에서도 핵심인데, 그 분산의 크기가 학습 안정성과 배치 크기 선택을 좌우한다(2.3).
A.1.6 엔트로피·교차엔트로피·KL — 손실과 정렬의 통화
정보이론의 세 양이 이 책을 관통한다. 손실도, 정렬의 제약도, 증류의 목표도 전부 이 세 양의 변주다. 시작은 엔트로피(entropy) — 분포 $p$가 담은 평균 불확실성이다.
$$H(p) = -\sum_x p(x)\log p(x) = \mathbb{E}_{x\sim p}\big[-\log p(x)\big]$$
직관은 이렇다. 확률 $p(x)$로 일어나는 결과 $x$를 관측했을 때의 "놀람(정보량)"이 $-\log p(x)$인데, 드문 일일수록($p$가 작을수록) 더 놀랍다. 엔트로피는 그 놀람의 기댓값이다. 모든 선택지가 동등한 균등분포에서 엔트로피가 최대이고(가장 예측하기 어렵다), 한 결과에 확률 1이 몰린 원-핫에서 0이다(불확실성이 없다). 로그의 밑에 따라 단위만 바뀐다 — 밑 2면 비트(bit), 자연로그면 내트(nat)이고 개념은 같다.
엔트로피 자체는 샘플링 온도(분포를 뾰족하게·평평하게 만들어 불확실성을 조절, 1.7)와 출력의 확신도 논의에 나오지만, 이 책에서 정작 매 장 등장하는 것은 그 사촌 둘이다. 첫째는 교차엔트로피(cross-entropy) — 참분포 $p$(정답)와 예측분포 $q$(모델) 사이의 양으로, "참은 $p$인데 $q$라고 믿고 부호화할 때 드는 평균 놀람"이다.
$$H(p, q) = -\sum_x p(x)\log q(x) = \mathbb{E}_{x\sim p}\big[-\log q(x)\big]$$
언어모델 학습이 최소화하는 손실이 바로 이것이다. 참분포 $p$가 정답 토큰 하나에 확률 1을 준 원-핫이면 합이 한 항으로 축약돼 $H(p, q) = -\log q(\text{정답 토큰})$, 곧 "정답 토큰에 부여한 확률의 음의 로그"가 된다 — 1.1·1.3·3.2에서 본 그 교차엔트로피 손실, 음의 로그가능도(NLL)와 정확히 같은 것이다. 정답에 확률 1을 주면 손실 0, 낮게 줄수록 손실이 급증한다. 시퀀스 전체로는 모든 위치의 이 값을 평균한다.
둘째는 쿨백–라이블러 발산(Kullback–Leibler divergence, KL) — 예측 $q$가 참 $p$에서 얼마나 벗어났는지를 재는 양이다.
$$D_{\mathrm{KL}}(p \parallel q) = \sum_x p(x)\log\frac{p(x)}{q(x)} = \mathbb{E}_{x\sim p}\!\left[\log\frac{p(x)}{q(x)}\right]$$
기억해 둘 관계 하나가 셋을 하나로 묶는다. KL은 교차엔트로피에서 엔트로피를 뺀 것이다.
$$D_{\mathrm{KL}}(p \parallel q) = H(p, q) - H(p)$$
그래서 참분포 $p$가 고정이면 $H(p)$가 상수라, 교차엔트로피를 최소화하는 것과 KL을 최소화하는 것이 같은 일이 된다. LM 학습에서 참분포가 원-핫이면 $H(p)=0$이라 아예 교차엔트로피 = KL이다 — 손실을 "정답 분포로부터의 KL"로 읽어도 똑같다. KL의 두 성질이 실무에서 결정적이다. 하나는 비음성으로, $D_{\mathrm{KL}}(p\parallel q) \ge 0$이고 $p=q$일 때만 0이다(Gibbs 부등식) — "두 분포가 같을수록 작다"는 거리다운 성질. 다른 하나는 비대칭으로, 일반적으로 $D_{\mathrm{KL}}(p\parallel q) \ne D_{\mathrm{KL}}(q\parallel p)$다. 그래서 KL은 엄밀한 거리(metric)가 아니라 "발산"이라 불리고, 어느 방향으로 쓰느냐가 결과를 바꾼다. 정방향 KL $D_{\mathrm{KL}}(p\parallel q)$은 $p$가 큰 곳을 $q$가 빠짐없이 덮게 밀어(mode-covering, 여러 봉우리를 평균적으로 아우름), 역방향 KL $D_{\mathrm{KL}}(q\parallel p)$은 $q$가 $p$의 한 봉우리에 몰리게 만든다(mode-seeking). 이 방향 차이가 정렬·증류에서 "어떤 KL을 쓰느냐"의 실제 학습 거동으로 이어진다.
KL은 이 책에서 정렬의 핵심 통화다. RLHF의 PPO는 정책이 참조 모델에서 너무 멀어지지 않도록 KL 페널티를 손실에 넣어 보상 해킹과 붕괴를 막고(3.4), DPO의 목적함수에도 참조 정책과의 KL이 유도 과정에 녹아 있으며(3.5), 헌법적 AI·RLAIF도 같은 계열의 제약을 쓴다(3.6). 지식 증류는 교사 분포와 학생 분포 사이의 KL(또는 그 변형)을 최소화하는 일 그 자체다(3.9).
A.1.7 세 값을 직접 — 그리고 퍼플렉서티
세 양이 어떻게 맞물리는지는 작은 분포로 끝까지 계산해 보면 명확해진다. 비트(밑 2) 단위로 하는데, 로그를 직접 쉽게 쓰려고 값을 골랐다 — 개략값이 아니라 정확히 떨어진다. 참분포 $p = [0.5,\ 0.25,\ 0.25]$, 예측분포 $q = [0.25,\ 0.25,\ 0.5]$로 두자.
먼저 참분포 자체의 불확실성인 엔트로피. $\log_2 0.5 = -1$, $\log_2 0.25 = -2$이므로
$$H(p) = -\big(0.5\log_2 0.5 + 0.25\log_2 0.25 + 0.25\log_2 0.25\big) = 0.5(1) + 0.25(2) + 0.25(2) = 1.5\ \text{비트}$$
참은 $p$인데 $q$로 예측할 때의 교차엔트로피는
$$H(p, q) = -\big(0.5\log_2 0.25 + 0.25\log_2 0.25 + 0.25\log_2 0.5\big) = 0.5(2) + 0.25(2) + 0.25(1) = 1.75\ \text{비트}$$
KL은 두 방법으로 확인한다. 관계식으로는 $D_{\mathrm{KL}}(p\parallel q) = H(p,q) - H(p) = 1.75 - 1.5 = 0.25$ 비트. 정의로 직접 계산해도
$$0.5\log_2\tfrac{0.5}{0.25} + 0.25\log_2\tfrac{0.25}{0.25} + 0.25\log_2\tfrac{0.25}{0.5} = 0.5(1) + 0.25(0) + 0.25(-1) = 0.25\ \text{비트}$$
로 일치한다. 읽는 법은 이렇다. 예측이 완벽했다면($q=p$) 교차엔트로피가 엔트로피 1.5비트와 같고 KL은 0이었을 것이다. $q$가 틀린 만큼 교차엔트로피가 1.75로 커졌고, 그 초과분 0.25비트가 곧 "예측이 참에서 벗어난 페널티", 즉 KL이다. 학습이란 이 초과분을 0으로 줄이는 일이다.
여기서 흔한 오해 하나를 정면으로 살펴보자. 위 예의 $p,q$는 서로 거울상이라 우연히 $D_{\mathrm{KL}}(q\parallel p)$도 0.25로 같게 나오는데, 이것을 대칭성으로 착각하면 안 된다. 비대칭이 드러나는 예를 계산해 보면 분명하다. $p=[0.5, 0.5]$, $q=[0.9, 0.1]$이면 $D_{\mathrm{KL}}(p\parallel q)\approx 0.737$비트지만 $D_{\mathrm{KL}}(q\parallel p)\approx 0.531$비트로 서로 다르다. 정렬과 증류에서 "어느 분포를 기준으로 삼아($p$) 어느 것을 맞추느냐($q$)"의 방향이 실제 결과를 바꾸는 이유가 이 숫자에 있다.
교차엔트로피를 사람이 읽기 좋은 단위로 되돌린 것이 퍼플렉서티(perplexity, PPL)다. 평균 손실 $L$(내트 단위)을 지수로 변환한다.
$$\mathrm{PPL} = e^{L} = \exp\!\left(-\frac{1}{T}\sum_{t=1}^{T}\log p_\theta(x_t \mid x_{<t})\right)$$
해석은 "모델이 매 스텝 평균적으로 몇 개의 균등한 선택지 사이에서 헷갈리는가"의 실효 분기 계수다. 예를 들어 모델이 실제로 나온 토큰마다 확률 0.1을 줬다면 토큰당 NLL은 $-\ln 0.1 \approx 2.303$ 내트, PPL은 $e^{2.303} = 10$이다 — 매 토큰이 대략 10지선다 수준의 불확실성이라는 뜻이다. 완벽하게 확률 1을 줬다면 NLL 0, PPL 1(혼동 없음)이고, 어휘 $V$개에 균등하게 $1/V$씩 흩뿌렸다면 PPL이 $V$(최대 혼란)다. 교차엔트로피와 퍼플렉서티는 같은 것의 두 표현일 뿐이다.
한 가지 흔한 단정은 위험하다. "퍼플렉서티가 낮으면 더 좋은 모델"은 조건이 붙어야 참이다. PPL은 토크나이저와 코퍼스에 의존해서, 서로 다른 토크나이저 사이에서는 비교 자체가 무의미하고(1.2), 유용성·정직성·안전 같은 제품 품질과는 다른 축이다. 같은 토크나이저·같은 깨끗한 코퍼스에서 같은 계열 모델의 사전학습 진척을 볼 때에만 안전한 지표다 — 평가의 함정 전반은 4.1에서 다룬다.
A.1.8 미분·그래디언트·연쇄법칙 — 학습이 내려가는 길
학습은 손실을 낮추는 방향으로 파라미터를 조금씩 옮기는 일이고, 그 "방향"을 주는 것이 미분이다. 도함수 $\frac{df}{dx}$는 $x$를 아주 조금 섭동할 때 $f$가 얼마나, 어느 쪽으로 변하는가 — 곡선의 순간 기울기다. 변수가 여럿일 때 하나만 변경하고 나머지는 고정한 변화율이 편미분 $\frac{\partial f}{\partial x_i}$이고, 모든 편미분을 한 벡터로 모은 것이 그래디언트다.
$$\nabla f = \left[\frac{\partial f}{\partial x_1}, \dots, \frac{\partial f}{\partial x_d}\right]$$
그래디언트의 핵심 성질은 "$f$가 가장 가파르게 증가하는 방향을 가리키고, 그 크기가 증가율"이라는 것이다. 그러니 손실을 줄이려면 그래디언트의 반대 방향으로 걸으면 된다 — 이것이 경사하강의 전부다(A.1.9). 신경망은 파라미터가 수십억 개인 함수라, 손실의 그래디언트는 그 수십억 개 각각에 대한 편미분을 모은 초고차원 벡터다.
이 초고차원 그래디언트를 실제로 구하는 방법이 연쇄법칙(chain rule)이다. 합성함수의 미분은 국소 미분들의 곱이라, $y = g(u)$, $u = h(x)$이면
$$\frac{dy}{dx} = \frac{dy}{du}\cdot\frac{du}{dx}$$
신경망은 층층이 합성된 함수 $L = \ell(f_L(\dots f_2(f_1(x))))$다. 이 사슬에 연쇄법칙을 손실에서 입력 쪽으로 거꾸로 체계적으로 적용해 모든 파라미터의 그래디언트를 얻는 것이 역전파(backpropagation)다. 여기에 결정적인 사실 하나가 있다. 한 번의 순전파와 한 번의 역전파로 모든 파라미터의 그래디언트를 순전파와 같은 차수의 비용에 얻는다(reverse-mode 자동미분). 파라미터가 수십억 개인데도 그래디언트를 파라미터마다 따로 계산하지 않고 한 번의 역방향 통과로 전부 얻어 낸다는 이 효율이 대규모 신경망 학습을 가능케 한 근본 이유다 — 그리고 그 역전파에 쓸 중간 활성값을 다 들고 있어야 해서 학습 메모리가 커지고, 그것을 아끼려 일부를 버렸다 다시 계산하는 것이 활성값 체크포인팅이다(2.4). 계산 그래프를 직접 따라가는 예제는 1.3에 있다.
한 가지 함의를 명시해 두면 나중에 강화학습이 왜 필요한지가 선명해진다. 역전파가 성립하려면 순전파의 모든 연산이 미분 가능해야 한다. argmax나 이산 샘플링처럼 미분 불가능한 연산이 중간에 개입하면 그 지점에서 그래디언트가 끊긴다 — 텍스트를 실제로 뽑아내는 샘플링이 정확히 이런 연산이라, "샘플링해서 나온 결과의 좋고 나쁨"으로 모델을 학습시키려면 표준 역전파로는 안 되고 정책 기울기 같은 강화학습 계열 처리가 필요해진다(3.4·3.7).
A.1.9 경사하강과 손실 표면의 모양
손실 $L(\theta)$를 줄이는 표준 알고리즘은 그래디언트 반대 방향으로 학습률 $\eta$만큼 한 걸음 내딛는 것이다.
$$\theta \leftarrow \theta - \eta\,\nabla_\theta L$$
$\eta$가 걸음 크기이고, 이 값 하나가 학습의 성패를 크게 가른다. 아주 단순한 손실로 왜 그런지 직접 보자. $L(\theta) = \theta^2$이면 $\nabla L = 2\theta$이니 갱신이 $\theta \leftarrow \theta - \eta\cdot 2\theta = (1 - 2\eta)\theta$가 되어, 매 스텝 $\theta$에 인자 $(1-2\eta)$가 곱해진다. $\eta=0.1$이면 인자가 $0.8$이라 $\theta$가 $1 \to 0.8 \to 0.64 \to 0.512 \to \dots$로 최소점 0을 향해 매끄럽게 줄어든다. 그런데 $\eta$를 키우면 이야기가 달라진다. $\eta=0.5$면 인자가 0이라 한 걸음에 최저점에 도달하고, $\eta=1.0$이면 인자가 $-1$이라 $1 \to -1 \to 1 \to -1$로 영원히 진동하며 수렴하지 못하고, $\eta=1.5$면 인자가 $-2$라 $1 \to -2 \to 4 \to -8$로 골짜기를 건너뛰며 발산한다. 학습률이 너무 크면 손실 스파이크와 NaN으로 학습이 중단되고(2.6), 너무 작으면 한없이 느린 이유가 이 작은 계산 안에 다 들어 있다. 그래서 학습률은 신경망에서 가장 중요한 하이퍼파라미터로 꼽힌다.
문제는 실제 손실 표면이 이 매끈한 그릇과는 딴판이라는 데 있다. 국소 최소가 곧 전역 최소인 볼록(convex) 함수라면 어디서 내려가도 같은 최저점에 도달해 최적화가 쉽지만, 골짜기와 언덕이 여럿인 비볼록(non-convex) 함수에서는 국소 최소에 갇힐 수 있다.
신경망의 손실은 극도로 비볼록이다. 그런데도 경사하강이 잘 통하는 이유는 이론적으로 완전히 규명되지 않았다 — 이것은 활발한 연구 주제이지 엄밀하게 증명된 이야기가 아니다. 실무적으로 통용되는 이해는 두 가지다. 고차원에서는 나쁜 국소 최소가 오히려 드물어서(대부분은 어떤 방향으로는 오르고 어떤 방향으로는 내려가는 안장점이고, 여러 국소 최소가 성능이 엇비슷하다는 경험적 관찰이 있다), 그리고 미니배치 그래디언트에 섞인 잡음이 얕은 국소 최솟값에서 벗어나게 돕는다는 것이다. 확실한 것은 전역 최소를 보장할 수 없다는 점, 그리고 초기화·학습률·스케줄이 어느 골짜기에 도달하는지를 크게 좌우한다는 실무적 사실이다(1.3·2.3·2.6). 실전에서는 전체 데이터가 아니라 미니배치로 그래디언트를 추정하는 확률적 경사하강(SGD)을 쓰고, 순수 SGD 위에 모멘텀과 적응적 스텝을 추가한 AdamW가 LLM 학습의 사실상 표준이다 — 걸음의 정교화와 웜업·코사인 스케줄은 2.3에서 다룬다.
A.1.10 부동소수 — 범위와 정밀도의 비교 평가
수학이 종이 위에서 맞아떨어져도, 유한한 정밀도의 컴퓨터에서 그대로 계산하면 오버플로·언더플로로 붕괴한다. LLM은 파라미터가 수십억 개라 이 수치 문제가 학습 안정(2.6)과 서빙 비용(5.2)의 1급 관심사다. 컴퓨터는 실수를 세 조각 — 부호(sign)·지수(exponent)·가수(mantissa) — 로 저장하는데, 지수 비트가 표현할 수 있는 범위(range)를, 가수 비트가 정밀도(precision)를 정한다.
| 형식 | 비트 | 지수/가수 | 특징 | 주 용도 |
|---|---|---|---|---|
| FP32 | 32 | 8 / 23 | 넓은 범위·높은 정밀도, 원소당 4바이트 | 마스터 가중치·옵티마이저 상태 |
| FP16 | 16 | 5 / 10 | 정밀도는 준수하나 범위가 좁음(과소·과대에 취약) | 혼합정밀도(손실 스케일링 필요) |
| BF16 | 16 | 8 / 7 | FP32와 같은 범위, 정밀도는 낮음 | 현대 LLM 학습의 사실상 표준 |
| FP8 (E4M3·E5M2) | 8 | 4/3 · 5/2 | 더 공격적, 범위·정밀도를 더 희생 | 학습·추론 가속(5.2) |
핵심 트레이드오프는 범위 대 정밀도다. 왜 같은 16비트인데 BF16이 학습에서 FP16을 대체했는지가 이 비교 평가에 있다. FP16은 지수 비트가 5개뿐이라 표현 범위가 대략 $6\times10^{-5}$에서 $65504$까지로 좁다. 그런데 학습 후반의 그래디언트는 값의 스케일이 크게 크게 변동해 $10^{-7}$처럼 아주 작은 값이 흔한데, 이 값은 FP16의 하한 아래라 그대로 0으로 언더플로해 버린다 — 그래디언트가 0이 되면 그 파라미터는 학습을 멈춘다. FP16으로 학습하려면 손실에 큰 수를 곱해 그래디언트를 FP16 범위 안으로 옮겼다가 되돌리는 손실 스케일링 같은 보정이 그래서 필요하다. BF16은 지수 비트를 FP32와 똑같이 8개 줘서 범위가 대략 $10^{-38}$에서 $10^{38}$로 넓다. 가수가 7비트뿐이라 정밀도는 낮지만, 학습에서는 정밀도보다 범위가 중요하기에 보정 없이도 안정적이다. 정밀도를 어디까지 낮춰도 되는가라는 질문이 곧 양자화이고(INT8·FP8·GPTQ·AWQ, 5.2), 정확한 형식·레시피는 하드웨어와 구현마다 다르므로 최신값은 해당 문서로 확인해야 한다. 자세한 학습 맥락은 2.6다.
A.1.11 수치 안정 — max-빼기·로그공간·logsumexp
유한 정밀도가 부리는 사고는 둘이다. 너무 커서 $\infty$나 NaN이 되는 오버플로, 너무 작아 0으로 붕괴하는 언더플로. LLM 파이프라인에서 이 둘을 막는 세 가지 습관이 있는데, softmax가 대표적인 위험 요소라 거기서 시작하자. $p_i = e^{z_i} / \sum_j e^{z_j}$에서 로짓 $z_i$가 조금만 커도 $e^{z_i}$가 오버플로한다 — $e^{1000}$은 부동소수 범위를 아득히 넘는다. 표준 해법은 최댓값 $m = \max_j z_j$를 모든 로짓에서 빼고 계산하는 것이다.
$$p_i = \frac{e^{z_i - m}}{\sum_j e^{z_j - m}}$$
값은 수학적으로 완전히 동일하다 — 분자와 분모에 $e^{-m}$이 곱해져 상쇄되기 때문이다. 이제 가장 큰 지수 항이 $e^0 = 1$이라 오버플로가 사라진다. 숫자로 확인하자. $z = [1000, 1001, 1002]$를 그대로 지수화하면 세 항 모두 오버플로하지만, 최댓값 1002를 빼면 지수의 인자가 $[-2, -1, 0]$이 되어 $e^{-2}, e^{-1}, e^0$의 합 $\approx 1.5032$로부터 $[0.0900, 0.2447, 0.6652]$가 안전하게 나온다. 그리고 이 결과는 $\text{softmax}([1,2,3])$과 정확히 같다 — softmax는 입력 전체를 같은 값만큼 밀어도 결과가 변하지 않는 이동 불변성을 가지므로, max를 빼는 것은 값을 바꾸지 않고 오버플로만 없앤다. 이 "max 빼기"는 softmax·어텐션·교차엔트로피 구현 어디에나 있고, FlashAttention 같은 커널은 이 안정화를 타일 단위로 온라인 수행한다(5.3).
두 번째 습관은 작은 확률을 다룰 때 로그공간으로 옮기는 것이다. 확률 0.001을 1000번 곱하면 부동소수에서는 정확히 0이 된다. 그래서 확률은 로그로 다룬다 — $\log(ab) = \log a + \log b$라 곱이 합이 되어 언더플로를 피한다. 시퀀스 확률을 로그가능도의 합으로 쓰는 이유가 이것이다(1.1).
$$\log p(x_{1:T}) = \sum_{t=1}^{T} \log p(x_t \mid x_{<t})$$
세 번째는, 로그공간에 있는 값들의 "확률 합"이 필요할 때(여러 경로의 확률 합산, 빔서치 점수 정규화 등, 1.7) 쓰는 logsumexp다. 여기에도 같은 max-빼기 안정화가 들어간다.
$$\log\sum_i e^{x_i} = m + \log\sum_i e^{x_i - m}, \qquad m = \max_i x_i$$
앞의 $x = [1000, 1001, 1002]$로 확인하면, 순진하게 $\log(e^{1000}+e^{1001}+e^{1002})$를 계산하면 지수부터 오버플로하지만, 안정형은 $1002 + \log(1.5032) \approx 1002 + 0.4076 = 1002.4076$을 오버플로 없이 정확히 낸다. 세 습관 — softmax의 max 빼기, 확률 곱의 로그공간, 로그합의 logsumexp — 이 LLM 파이프라인의 수치 안정을 뒷받침한다. 이 습관을 어기면(예를 들어 softmax를 취한 뒤 다시 log를 취하면) 조용히 NaN이 나거나 정밀도가 손실된다. 그래서 프레임워크의 cross_entropy와 log_softmax는 확률이 아니라 로짓을 직접 받아 내부에서 안정적으로 처리하도록 설계돼 있고, 직접 softmax → log를 수작업으로 잇지 말라는 것이 실무의 못이다(1.3).
A.1.12 개념 → 쓰이는 장 지도
부록 전체를 한 표로 압축한다. 본문을 읽다 어떤 수학이 걸리면 여기서 개념을 찾아 이 부록의 해당 절과, 그 개념이 실제로 작동하는 장으로 가면 된다.
| 수학 도구 | 한 줄 정의 | 이 부록 | 주로 쓰이는 장 |
|---|---|---|---|
| 벡터·임베딩 | 의미를 실수 벡터로 | A.1.1 | 1.2, 6.2 |
| 행렬곱(GEMM) | 선형층·투영·어텐션 | A.1.2 | 1.3, 1.4, 5.1 |
| 내적·코사인 유사도 | 방향 유사도 | A.1.3 | 1.4, 6.2 |
| 노름 | 벡터 크기·클리핑·정규화 | A.1.3 | 1.3, 2.6 |
| 랭크·저랭크·SVD | 행렬을 적은 랭크로 근사 | A.1.4 | 3.8, 5.2 |
| 조건부확률·자기회귀 | 다음 토큰 확률 | A.1.5 | 1.1, 1.7 |
| 베이즈 | 사후 ∝ 가능도 × 사전 | A.1.5 | 1.1, 6.1 |
| 기댓값·분산 | 분포 평균·퍼짐 | A.1.5 | 1.4, 2.3, 3.4 |
| 엔트로피 | 불확실성 | A.1.6 | 1.1, 1.7, 4.1 |
| 교차엔트로피 | LM·SFT 손실 | A.1.6 | 1.1, 1.3, 2.3, 3.2 |
| KL 발산 | 분포 이탈(비대칭) | A.1.6 | 3.4, 3.5, 3.6, 3.9 |
| 퍼플렉서티 | exp(교차엔트로피) | A.1.7 | 1.1, 4.1 |
| 그래디언트·연쇄법칙 | 역전파 | A.1.8 | 1.3, 2.3, 2.4 |
| 경사하강·학습률 | 파라미터 갱신 | A.1.9 | 1.3, 2.3, 2.6 |
| 볼록/비볼록 | 손실 표면 | A.1.9 | 1.3, 2.3 |
| 부동소수·정밀도 | 범위 대 정밀도 | A.1.10 | 2.6, 5.2 |
| 수치안정(max-빼기·logsumexp) | 오버·언더플로 방지 | A.1.11 | 1.3, 1.4, 2.6 |
다시 강조하면 이 부록은 본문을 읽기 위한 최소 복습이지 완전한 교재가 아니다. 여기 담긴 것은 정밀한 정리가 아니라 "무엇이 무엇을 밀고 당기는가"의 방향성이고, 그것으로 트랜스포머와 서빙과 정렬의 수식을 읽어 낼 수만 있으면 이 부록은 제 몫을 다한 것이다. 더 깊이 심층 분석할 준비가 됐다면 표준 교재로 넘어가는 것이 맞다 — 선형대수는 Strang의 Introduction to Linear Algebra(또는 시각적으로 이해하고 싶다면 3Blue1Brown의 Essence of Linear Algebra 영상 강의), 확률·정보이론과 최적화의 딥러닝 맥락은 Goodfellow·Bengio·Courville의 Deep Learning 앞부분과 MacKay의 Information Theory, Inference, and Learning Algorithms, 머신러닝에 특화된 수학 배경은 Deisenroth 외 Mathematics for Machine Learning이 좋은 출발점이다(교재 추천은 견해이며, 판·구성은 각자 확인하라). 이 배경을 실제 환경에서 운용해 보는 실습 준비는 A.2로, 그것을 데이터에서 서빙까지 엔드투엔드로 잇는 예제는 A.3로 이어진다.