AEGLOSLAB ChatGPT 같은 AI를 만들고 서비스하기

제1부 기반: 언어모델과 트랜스포머

1.1 언어모델이란 — 자기회귀·확률·다음 토큰 예측

이 책이 다루는 거의 모든 것 — 트랜스포머의 어텐션, 수천 장의 GPU를 몇 달씩 가동하는 사전학습, 사람이 직접 말투를 다듬는 정렬, KV 캐시를 아끼려 애쓰는 서빙, 환각을 막으려 검색을 결합하는 RAG — 은 결국 한 줄 목표를 실현하거나, 관리하거나, 파는 일이다. 그 한 줄은 이것이다. 앞을 보고, 바로 다음에 올 토큰 하나에 확률을 매겨라. 놀라울 만큼 사소해 보인다. "정교한 자동완성"이라는 비아냥이 나오는 것도 무리가 아니다. 그런데 이 사소한 목표를 충분히 큰 모델에 충분한 데이터로 끝까지 확장하면, 번역을 하고 코드를 작성하고 증명의 다음 줄을 잇고 처음 보는 지시를 따르는 물건이 나온다. 이 장은 그 물건이 수학적으로 정확히 무엇인지를 세운다. 트랜스포머라는 구현(1.4)으로 들어가기 전에, 그것이 계산하려는 대상이 무엇인지부터 명시해야 하기 때문이다. 그리고 이 정의 하나에서 언어모델의 힘과 약점이 — 왜 이렇게 폭넓게 유능하며 왜 태연하게 거짓말을 하는지가 — 함께 따라 나온다는 것을 보인다. 정의가 바뀌면 이후 60개 장이 전부 안개 속에서 진행된다.

1.1.1 언어모델은 텍스트에 확률을 매기는 함수다

"언어모델"이라는 이름은 오해를 부른다. 문법 규칙집도 아니고, 인터넷 전체를 학습한 지식 데이터베이스도 아니다. 수학적으로 언어모델은 가능한 모든 텍스트에 확률을 부여하는 함수 하나다. 그것이 전부다.

텍스트는 먼저 토큰(token)이라는 조각으로 잘린다 — 단어일 수도, 부분단어일 수도, 문자일 수도 있다(정확히 무엇을 토큰으로 삼느냐가 1.2의 주제다). 텍스트 하나를 토큰 시퀀스 $x_{1:T} = (x_1, x_2, \dots, x_T)$ 로 보면, 각 $x_t$ 는 크기 $V$ 짜리 어휘(vocabulary)에서 뽑힌 기호 하나다. 언어모델은 이 시퀀스 전체에 하나의 결합확률(joint probability) 을 준다.

$$p(x_{1:T}) = p(x_1, x_2, \dots, x_T)$$

읽는 법은 단순하다. "있음직한·자연스러운" 문장에는 큰 확률을, "말이 안 되는" 문장에는 작은 확률을 배분한다는 뜻이다. 잘 학습된 모델이라면 $p(\text{"하늘이 파랗다"})$ 가 $p(\text{"하늘이 삼각형을 먹었다"})$ 보다 압도적으로 크도록 확률질량을 나눠 갖는다. 여기서 이미 몇 가지 오해를 조용히 걷어낼 수 있다. 모델은 문장을 저장하지 않는다 — "하늘이 파랗다"라는 문자열이 어딘가에 파일로 들어 있는 것이 아니라, 그 문자열에 큰 수를 대응시키는 함수의 파라미터가 있을 뿐이다. 모델은 정답을 조회하지도 않는다 — 확률을 계산할 뿐, 어디선가 답을 꺼내 오는 것이 아니다. 이 두 가지를 처음부터 염두에 두면, 이 장 마지막에서 다룰 "LLM은 검색엔진이다"라는 흔한 착각이 왜 틀렸는지가 저절로 풀린다.

문제는 이 정의를 곧이곧대로 구현할 수 없다는 데 있다. $x_{1:T}$ 가 가질 수 있는 경우의 수는 $V^T$ 로 급증한다. 어휘가 5만이고 문장이 고작 10토큰이어도 $50000^{10} \approx 10^{47}$ 가지다. 이 표 전체를 저장하거나 학습하는 것은 원리적으로 불가능하다. 그래서 결합확률을 직접 다루는 대신, 확률의 한 항등식으로 이 거대한 대상을 잘게 부순다. 그 항등식이 이 책 전체의 축이다.

1.1.2 체인룰 — 결합확률을 다음 토큰 예측들의 곱으로

확률의 연쇄법칙(chain rule) 은 어떤 결합확률이든 조건부확률의 곱으로 정확히 분할한다. 근사가 아니라 항등식이다 — 어떤 가정도 없이 성립한다. 왜 그런지 두 변수부터 보자. 조건부확률의 정의 $p(B\mid A) = p(A,B)/p(A)$ 를 옮기면 $p(A,B) = p(A)\,p(B\mid A)$ 다. 세 변수면 $A,B$ 를 하나로 묶어 한 번 더 적용한다.

$$p(x_1,x_2,x_3) = p(x_1,x_2)\,p(x_3\mid x_1,x_2) = p(x_1)\,p(x_2\mid x_1)\,p(x_3\mid x_1,x_2)$$

이 절차를 $T$ 개까지 반복하면 전개가 끝까지 풀린다.

$$p(x_{1:T}) = p(x_1)\, p(x_2 \mid x_1)\, p(x_3 \mid x_1, x_2)\cdots p(x_T \mid x_1,\dots,x_{T-1})$$

곱셈 기호로 압축하면, 이 책을 관통하는 한 줄이 나온다.

$$\boxed{\,p(x_{1:T}) = \prod_{t=1}^{T} p(x_t \mid x_{<t})\,}$$

여기서 $x_{<t} = (x_1, \dots, x_{t-1})$ 는 "지금까지의 앞부분"(프리픽스, 문맥)이다. 이 분해가 말하는 바는 실로 놀랍다. 어떤 길이의 텍스트든 그 확률 전체를 모델링하는 대신, 앞을 보고 바로 다음 하나를 맞히는 문제 $p(x_t \mid x_{<t})$ 하나만 잘 풀면 된다. 그 작은 문제를 시퀀스를 따라 곱해 나가면 $V^T$ 짜리 괴물이 저절로 조립된다. $10^{47}$ 짜리 표를 학습하는 문제가, 어휘 $V$ 위의 분포 하나를 문맥에 따라 내놓는 문제로 바뀐 것이다. 이것이 언어모델을 실제로 학습 가능하게 만든 결정적 전환이다.

이렇게 "왼쪽에서 오른쪽으로, 자기가 이미 만든 앞부분을 조건으로 삼아 다음을 예측"하는 구조를 자기회귀(autoregressive) 라 부른다. 각 스텝이 푸는 문제 $p(x_t \mid x_{<t})$ 가 그 유명한 다음 토큰 예측(next-token prediction) 이다. GPT의 G가 가리키는 Generative의 골격이 바로 이 한 줄이다.

한 가지 덧붙일 것은, 왼쪽에서 오른쪽이라는 순서가 수학적 필연은 아니라는 점이다. 체인룰은 어떤 순서로 풀어도 성립한다 — 오른쪽에서 왼쪽으로, 혹은 아무 순서로나 조건을 걸어도 같은 결합확률이 나온다. 왼쪽→오른쪽을 택하는 것은 사람이 글을 읽고 쓰는 방향이자, 아래에서 볼 "생성"이 자연스럽게 그 방향으로 흐르기 때문이다. 가운데를 비워 두고 양쪽으로 조건을 거는 다른 분해(빈칸 채우기, masked LM)도 가능하며 실제로 BERT 계열이 그렇게 한다. 대화형 LLM이 왼쪽→오른쪽 자기회귀로 수렴한 이유는 1.4에서 따로 따진다 — 요지는 모든 과제를 "이어 쓰기" 하나로 통일할 수 있고, 인과 마스크 덕에 생성 시 KV 캐시가 성립하기 때문이다.

체인룰로 스텝마다 곱하면 프리픽스 x<t (지금까지의 토큰들) 모델 pθ 다음 토큰 분포 p(xt | x<t) 어휘 V개 위의 확률 시퀀스 전체 확률 ∏ p(xt | x<t)

1.1.3 모델이 실제로 내놓는 것 — 로짓과 소프트맥스, 그리고 "분포"라는 사실

신경망(1.4)은 프리픽스 $x_{<t}$ 를 받아 어휘의 각 토큰에 대한 실수 점수 벡터 $z \in \mathbb{R}^V$ 를 낸다. 이 점수를 로짓(logit) 이라 부른다. 로짓은 아직 확률이 아니다 — 음수일 수도, 합이 1이 아닐 수도 있다. 이를 확률분포로 바꾸는 마지막 연산이 소프트맥스(softmax) 다.

$$p_\theta(x_t = i \mid x_{<t}) = \frac{\exp(z_i)}{\sum_{j=1}^{V}\exp(z_j)}$$

지수를 취해 전부 양수로 만든 뒤 합으로 나눠 정규화한다. 결과는 모든 성분이 0 이상이고 합이 정확히 1인, 어휘 크기 $V$ 짜리 확률분포다. $\theta$ 는 모델의 학습되는 파라미터다. 소프트맥스에는 정리해 둘 성질이 하나 있다. 모든 로짓에 같은 상수를 더해도 결과가 변하지 않는다 — 분자와 분모에서 $\exp(c)$ 가 상쇄되기 때문이다. 그래서 로짓의 절대 크기는 의미가 없고 차이만 의미가 있다. 이 성질은 나중에 수치 안정성(가장 큰 로짓을 빼고 계산하기)과 온도 조절(1.7)의 토대가 된다.

여기서 이후 장들을 편하게 해 줄 두 가지를 확정하자. 첫째, 모델은 "정답 하나"가 아니라 "분포 전체"를 준다. "하늘이" 다음에 무엇이 올지 하나를 고르는 것이 아니라, 수만 개 후보 각각에 확률을 매긴다. 아래 그림처럼, 출력은 어휘 전체에 걸친 하나의 봉우리 진 분포다.

0.0 0.1 0.2 0.3 0.4 파랗다 0.41 맑다 0.20 높다 0.12 흐리다 무너 사과 … p(xt) 긴 꼬리
"하늘이 " 다음 토큰의 분포 — 정답 하나가 아니라 어휘 $V$개 위의 확률

이 분포에서 실제 토큰을 어떻게 하나 뽑을지 — 가장 확률 높은 것을 고를지, 확률에 비례해 표집할지, 온도로 뾰족함을 조절할지 — 가 디코딩이며 1.7의 주제다. 지금 기억해 둘 것은 "출력은 분포"라는 사실 하나다. 둘째, 문맥 길이에는 한계가 있다. 이론적 체인룰은 $x_{<t}$ 전체를 조건으로 삼지만, 실제 모델은 컨텍스트 윈도(context window) 안의 토큰만 본다. 이 유한 문맥이 "긴 대화에서 앞을 잊는" 현상의 근원이고, 그것을 늘리는 방법과 대가가 1.6·5.6의 주제다.

1.1.4 왜 "다음 단어 맞히기"가 문법·사실·추론을 모두 요구하나

자연스러운 의심이 든다. 고작 다음 단어 맞히기가 어떻게 번역·요약·코딩·추론으로 이어지나. 단순히 통계적 자동완성 아닌가. 이 절의 논지는 하나다. 손실을 끝까지 낮추는 유일한 길이 텍스트 뒤에 있는 세계의 구조를 모델 안에 담는 것이기 때문에, 폭넓은 능력이 부산물로 딸려 온다. 다음 빈칸들을 잘 채우려면 각각 무엇을 "알아야" 하는지 보라.

프리픽스(빈칸 앞)다음 토큰을 맞히려면 필요한 것요구 능력
"그 소녀들이 어제 도서관에 ___"주어 수·시제 일치("갔다")문법
"대한민국의 수도는 ___""서울"이라는 사실사실·세계지식
"23 곱하기 3은 ___"63이라는 계산 결과산술·추론
"그는 우산을 안 챙겼고, 결국 비에 흠뻑 ___"인과 추적("젖었다")상식·추론
"『토지』를 쓴 작가는 ___"개체 관계 회수("박경리")지식 회수
"def add(a, b):\n return ___"코드 구문·의도("a + b")구조·프로그래밍

대략 맞히는 모델은 문법의 표면만 흉내 낸다 — "___" 자리에 그럴듯한 동사를 아무거나 넣는다. 하지만 마지막 한 조각의 손실까지 줄이려면 점점 더 깊은 것을 포착해야 한다. 시제를 맞히려면 문법을, "서울"을 맞히려면 세계에 관한 사실을, "63"을 맞히려면 덧셈이 아니라 곱셈의 절차를, "젖었다"를 맞히려면 우산과 비와 젖음 사이의 인과를 내부 어딘가에 갖고 있어야 한다. 여기서 핵심은 이 능력들이 목표에 명시되지 않았다는 점이다. 우리는 모델에게 "문법을 배워라"라거나 "덧셈을 익혀라"라고 말한 적이 없다. 오로지 "다음 토큰을 맞혀라"라고만 했다. 그런데 그 목표를 최소화하는 경로 위에 문법과 사실과 산술이 놓여 있으니, 최적화가 그것들을 스스로 주워 담는다. 능력은 목표가 아니라 목표를 잘 달성하기 위한 수단으로 학습된다. 이것이 다음 토큰 예측이라는 단순한 목표가 왜 그토록 멀리까지 데려가는지의 첫 번째 설명이다. 두 번째 설명은 이 관찰을 정보이론으로 포장한다.

1.1.5 압축 = 예측 = 이해 — 정보이론이 말하는 것과 말하지 않는 것

"좋은 예측이 곧 좋은 압축"이라는 말은 비유가 아니라 등식이다. 정보이론의 골격인 섀넌의 소스 코딩 정리가 그 등식을 준다. 어떤 기호에 모델이 확률 $p$ 를 부여했다면, 그 기호를 최적으로 부호화하는 데 드는 비트 수는 정확히 $-\log_2 p$ 다. 자주 나오는(확률 높은) 기호에는 짧은 코드를, 드문(확률 낮은) 기호에는 긴 코드를 준다 — 모스 부호에서 흔한 e에 점 하나를 배정한 것과 같은 원리다. 그러면 텍스트 전체를 부호화하는 데 드는 총 비트는 스텝별 $-\log_2 p$ 의 합이다.

$$\text{총 비트} = \sum_{t=1}^{T} \big(-\log_2 p_\theta(x_t \mid x_{<t})\big)$$

산술 부호화(arithmetic coding)라는 실제 알고리즘이 이 하한을 코퍼스 전체에서 상수 몇 비트 이내로 달성한다. 즉 이 합은 추상이 아니라 실제 파일 크기다. 그리고 이 합은 곧 다음 절에서 정의할 교차엔트로피 손실에 로그 밑만 바꾼 것이다. 모델이 다음 토큰을 잘 예측하도록 손실을 낮추는 것과, 그 텍스트를 더 작게 압축하는 것은 문자 그대로 같은 일이다.

숫자로 확정해 보자. 100만 토큰 길이의 코퍼스가 있고, 어떤 모델이 토큰당 평균 2 nats(자연로그 기준)의 손실을 낸다고 하자. $2\ \text{nats} = 2/\ln 2 \approx 2.885$ 비트다. 그러면 이 모델로 코퍼스를 압축한 크기는 $2.885 \times 10^6$ 비트 $\approx 361{,}000$ 바이트 $\approx 352$ KB다. 이제 더 나은 모델이 손실을 1.5 nats($\approx 2.164$ 비트/토큰)로 낮췄다면 압축 크기는 $\approx 270$ KB로 줄어든다. 손실을 0.5 nats 낮춘다는 추상적 진술이, 파일이 82 KB 작아진다는 물리적 사실로 번역된 것이다. 텍스트를 잘 예측하는 것과 잘 압축하는 것이 같은 일이라는 것을 진지하게 받아들인 대회도 있다 — 위키백과 1 GB를 얼마나 작게 압축하느냐로 지능을 겨루는 휴터 프라이즈(Hutter Prize)가 그렇다.

여기서 "압축 = 이해 = 지능"이라는 큰 프레이밍이 나온다. 세상에 관한 방대한 텍스트를 유한한 파라미터로 압축하려면, 텍스트를 낱낱이 외우는 대신 그것을 생성한 규칙을 뽑아내야 한다는 논리다. 외우기는 압축이 아니다 — 원본만큼 크기 때문이다. 실제 압축은 규칙성을 찾아 짧은 프로그램으로 데이터를 재생성하는 것이고, 이 아이디어는 콜모고로프 복잡도(어떤 문자열의 복잡도 = 그것을 출력하는 가장 짧은 프로그램의 길이)와 솔로모노프 귀납이라는 고전적 기원을 갖는다. "이해란 결국 좋은 압축"이라는 이 렌즈는 강력하고, 이 책은 그것을 유용한 사고 도구로 쓴다.

그러나 여기서 정직해야 한다. 방금 두 종류의 진술을 섞어 말했는데, 그 둘은 지위가 다르다. 하나는 경험적 관찰이다 — 다음 토큰 예측 손실(또는 퍼플렉서티)을 낮추면 여러 하류 과제의 성능이 대체로 예측 가능하게 좋아진다는 것은 스케일링 연구에서 반복 관찰되며(2.2), 데이터로 뒷받침된다. 다른 하나는 철학적 프레이밍이다 — "압축 = 이해 = 지능"이라는 등식은 정리(theorem)가 아니라 직관이다. 손실이 낮다는 사실과 "모델이 세계를 진짜로 이해한다"를 동일시하는 것은 여전히 논쟁적이고, 애초에 무엇을 "이해"로 볼지에 대한 합의조차 없다. 특히 "다음 토큰 예측만으로 임의의 지능이 자연히 출현한다"는 강한 단정은 데이터가 아니라 마케팅에 가깝다. 이 책은 이 지점에서 조심스럽게 걷는다 — 압축과 예측의 등가는 증명된 사실로 쓰되, 그것이 곧 이해나 지능이라는 도약은 유용한 가설로만 쓴다. 실제로 뒤에서 볼 사후학습·정렬(3.1)이 없으면 사전학습된 다음 토큰 예측기는 "유용한 조수"처럼 굴지 않는다. 능력의 단초를 갖는 것과 그것을 쓸모 있게 만드는 것은 다른 문제다.

1.1.6 교차엔트로피 손실 — 최대가능도에서 "정답에 얼마나 놀랐나"까지

정의와 직관을 세웠으니 이제 학습을 본다. 목표는 단순하다. 코퍼스에 실제로 나타난 다음 토큰에 모델이 높은 확률을 주도록 파라미터 $\theta$ 를 조정한다. 이를 원리에서부터 유도하면 손실의 형태가 저절로 나온다. 코퍼스 전체의 가능도(likelihood)는 체인룰에 따라 모든 스텝 확률의 곱이다.

$$\mathcal{L}_{\text{lik}}(\theta) = \prod_{t=1}^{T} p_\theta(x_t \mid x_{<t})$$

이 곱을 최대화하는 것이 최대가능도 추정(maximum likelihood estimation)이다. 그런데 확률을 수천·수만 번 곱하면 값이 $10^{-3000}$ 수준으로 언더플로하고, 곱은 미분·최적화에도 불편하다. 그래서 로그를 취해 곱을 합으로 바꾸고(로그는 단조증가라 최댓값 위치가 안 변한다), 최대화를 최소화로 뒤집기 위해 부호를 바꾸고, 시퀀스 길이로 나눠 평균을 낸다. 그 결과가 교차엔트로피 손실(cross-entropy loss), 곧 음의 로그가능도(negative log-likelihood)의 평균이다.

$$\mathcal{L}(\theta) = -\frac{1}{T}\sum_{t=1}^{T} \log p_\theta(x_t \mid x_{<t})$$

직관은 놀람(surprisal)이다. $-\log p$ 는 "그 사건에 얼마나 놀랐나"의 척도다 — 모델이 실제 정답에 확률 1을 줬다면 놀람은 0, 확률을 0에 가깝게 줬다면 놀람은 무한대로 치솟는다. 손실을 낮춘다는 것은 정답에 덜 놀라도록 만드는 일이다. 이 놀람 함수가 왜 그렇게 비대칭인지 — 확률을 조금만 낮게 주면 벌이 완만하지만 아주 낮게 주면 폭발하는지 — 를 그려 보면 이후의 수계산이 명확해진다.

0.0 0.2 0.4 0.6 0.8 1.0 0 1 2 3 4 5 정답에 준 확률 p → 놀람 −ln p p = 0.1 → 2.30 p = 1 → 놀람 0 p → 0 이면 놀람 →∞
놀람 $-\ln p$ — 정답에 낮은 확률을 줄수록 벌이 폭발한다

"교차엔트로피"라는 이름의 출처도 정리해 둘 값어치가 있다 — 여기서 이 지표의 한계와 학습의 목적지가 함께 드러난다. 한 스텝의 정답을 원-핫 분포로 보면(정답 토큰에 1, 나머지에 0), 위의 $-\log p_\theta(\text{정답})$ 은 정확히 그 원-핫 분포 $q$ 와 모델 분포 $p_\theta$ 사이의 교차엔트로피 $H(q, p_\theta) = -\sum_i q_i \log p_{\theta,i}$ 다. 코퍼스 전체로 보면 우리가 최소화하는 것은 데이터의 참 분포 $p_{\text{data}}$ 와 모델 분포 사이의 교차엔트로피이고, 이것은 다음과 같이 분할된다.

$$H(p_{\text{data}}, p_\theta) = \underbrace{H(p_{\text{data}})}_{\text{언어 자체의 엔트로피(고정)}} + \underbrace{D_{\mathrm{KL}}(p_{\text{data}} \,\|\, p_\theta)}_{\text{모델이 참 분포에서 벗어난 정도}}$$

$H(p_{\text{data}})$ 는 언어에 내재한 예측 불가능성으로, 모델이 어쩌지 못하는 상수다. 학습으로 줄일 수 있는 것은 두 번째 항, 모델 분포가 참 분포에서 벌어진 정도인 KL 발산뿐이다. 여기서 두 가지가 나온다. 첫째, 손실에는 하한이 있다. 아무리 완벽한 모델도 언어 자체의 엔트로피 아래로는 못 내려간다 — 그래서 실제 텍스트에서 퍼플렉서티가 1에 닿는 일은 없다(다음 절). 둘째, 손실을 최소화하는 것은 모델 분포를 참 분포에 최대한 가깝게 미는 일이다. 이 손실을 배치·시퀀스에 걸쳐 경사하강으로 줄이는 것이 사전학습의 전부다. 소프트맥스+교차엔트로피의 기울기가 예쁘게도 $(p_\theta - q)$, 즉 "예측 분포 빼기 정답 원-핫"으로 떨어진다는 사실과 그 최적화 기계 전반은 1.3에서 푼다.

1.1.7 퍼플렉서티 — 손실을 "체감 가지 수"로 되돌리기

손실은 로그 스케일이라 규모가 와닿지 않는다. 2.1과 1.9의 차이가 얼마나 큰 것인지 직관이 없다. 이를 지수로 되돌려 사람이 느낄 수 있는 단위로 만든 것이 퍼플렉서티(perplexity, PPL) 다.

$$\mathrm{PPL} = \exp\!\left(-\frac{1}{T}\sum_{t=1}^{T}\log p_\theta(x_t\mid x_{<t})\right) = \exp\big(\mathcal{L}\big)$$

이 식이 무엇을 세는지 보려면 지수와 로그를 풀어 보면 된다. $\exp$ 안의 평균 로그는 확률들의 기하평균의 로그이므로,

$$\mathrm{PPL} = \left(\prod_{t=1}^{T} p_\theta(x_t\mid x_{<t})\right)^{-1/T} = \left(\prod_{t=1}^{T} \frac{1}{p_\theta(x_t\mid x_{<t})}\right)^{1/T}$$

즉 퍼플렉서티는 정답 확률의 역수들의 기하평균이다. "매 스텝 평균적으로 몇 개의 균등한 선택지 사이에서 헷갈리고 있는가", 곧 실효 분기 계수(effective branching factor) 로 읽는다. 세 극단을 놓고 보면 개략이 드러난다. 어휘가 $V$ 인데 모델이 아무것도 모르고 균등 추측하면 매 스텝 $p = 1/V$, 역수는 $V$, 따라서 $\mathrm{PPL} = V$ (최악). 공정한 6면 주사위를 예측하는 문제라면 매번 $p=1/6$ 이라 $\mathrm{PPL} = 6$ — "6지선다만큼 헷갈린다"가 문자 그대로 맞다. 반대로 모델이 정답을 완벽히 확신하면 $\mathrm{PPL} = 1$ (이상, 실제 언어에선 도달 불가). 실제 좋은 LM은 이 사이 어딘가에서 "매 스텝 사실상 몇 가지 후보로 좁혀 놓은" 상태다. 낮을수록 좋다. PPL 20은 "평균 20지선다만큼", PPL 8은 "8지선다만큼" 혼동한다는 뜻이다.

로그의 밑을 섞지 않도록 주의하자. 위는 자연로그 $\ln$ 기준이라 $\mathrm{PPL} = \exp(\mathcal{L})$ 이고 손실 단위는 nats다. 로그를 밑 2로 쓰면 $\mathrm{PPL} = 2^{\mathcal{L}}$ 이고 손실 단위는 비트다(앞 절의 압축 크기가 바로 이 비트다). 둘은 같은 값을 다른 단위로 표현할 뿐이지만, 밑과 단위를 뒤섞으면 계산이 어긋난다.

1.1.7.1 수계산 — 4토큰 문장의 퍼플렉서티

작은 예로 끝까지 실행해 보자(모두 설명용 개략값, 자연로그 기준). 4토큰 문장에서 모델이 각 정답 토큰에 준 확률이 다음과 같다고 하자.

스텝 $t$정답 토큰에 준 확률 $p_\theta$놀람 $-\ln p$
10.50.693
20.251.386
30.12.303
40.40.916

평균 손실과 퍼플렉서티는 이렇게 나온다.

$$\mathcal{L} = \frac{0.693 + 1.386 + 2.303 + 0.916}{4} = \frac{5.298}{4} \approx 1.325$$

$$\mathrm{PPL} = e^{1.325} \approx 3.76$$

읽는 법: 이 모델은 이 문장에서 매 토큰 평균 약 3.76지선다만큼 혼동했다. 어휘가 5만이었다면 균등 추측의 PPL은 5만이므로, 3.76은 "거의 다 좁혀 놓은" 아주 좋은 상태다. 여기서 로그의 비대칭을 수치로 확인해 보자. 스텝 3에서 정답에 0.1 대신 0.6을 줬다면 그 항의 놀람이 2.303에서 0.511로 떨어지고, 평균 손실은 $(0.693+1.386+0.511+0.916)/4 \approx 0.877$, PPL은 $e^{0.877} \approx 2.40$ 으로 뚝 떨어진다. 스텝 하나에서 저지른 한 번의 큰 놀람이 전체 평균을 크게 높인다 — 앞의 놀람 곡선에서 봤듯 $-\log p$ 는 확률이 작아질수록 가파르게 폭발하기 때문이다. 이 비대칭은 실무에서 중요하다. 대부분의 토큰을 잘 맞혀도 결정적 토큰(고유명사·숫자·핵심 사실)을 한 번 크게 틀리면 그 문장의 손실 전체가 나빠진다.

1.1.8 퍼플렉서티로 하지 말아야 할 것 — 토크나이저가 값을 바꾼다

퍼플렉서티는 학습을 모니터링하고 같은 계열 모델의 진척을 볼 때 편리하다. 그러나 그것을 "얼마나 똑똑한가"의 점수로 읽으면 크게 오도된다. 가장 치명적이고 가장 자주 저지르는 실수부터 직접 확인하자 — 토크나이저가 다른 두 모델의 퍼플렉서티는 직접 비교할 수 없다.

이유는 퍼플렉서티가 "토큰당" 값이라는 데 있다. 같은 텍스트라도 토크나이저에 따라 토큰 수가 달라지면 분모가 달라져 값 전체가 변동한다. "unbelievable"이라는 단어를 예로 들자. 두 모델이 이 단어에 똑같은 확률 $p(\text{단어}) = 0.01$ 을 부여한다고 하자 — 즉 이 단어를 예측하는 능력은 동일하다. 하지만 토크나이저 A는 이 단어를 토큰 1개로 자르고, 토크나이저 B는 "un / bel / iev / able" 4개로 자른다.

  • 토크나이저 A: 토큰 1개, 그 토큰의 놀람 $-\log_2 0.01 = 6.64$ 비트. $\mathrm{PPL}_A = 2^{6.64} \approx 100$.
  • 토크나이저 B: 토큰 4개, 놀람 총합은 같은 6.64비트(단어 확률이 같으므로), 토큰당 평균 $6.64/4 = 1.66$ 비트. $\mathrm{PPL}_B = 2^{1.66} \approx 3.16$.

같은 단어에, 같은 예측 능력에, 퍼플렉서티가 100 대 3.16으로 벌어졌다. 오로지 토큰을 몇 조각으로 잘랐느냐 때문이다. 이 숫자만 보고 "B 모델이 30배 낫다"고 결론지으면 완전히 틀린다 — 두 모델은 정확히 똑같이 예측했다. 토큰을 잘게 자를수록 스텝당 예측이 쉬워져(각 조각은 앞 조각이 주는 힌트가 크다) 퍼플렉서티가 인위적으로 낮아진다. 그래서 토크나이저가 다르면 PPL 비교가 무의미하다.

이 함정을 피하는 정공법은 토크나이저에 독립인 단위로 재는 것이다. 위 예에서 단어는 12글자이고 총 놀람은 두 경우 모두 6.64비트이므로, 글자당 비트(bits-per-character) 는 $6.64/12 \approx 0.55$ 로 둘이 정확히 같다. 바이트당 비트(bits-per-byte)도 마찬가지다. 이런 지표는 분절 방식에 무관하게 "이 텍스트를 얼마나 압축했나"만 재므로, 토크나이저가 다른 모델도 공정하게 비교한다. 서로 다른 모델을 진지하게 비교하려는 연구가 퍼플렉서티 대신 bits-per-byte를 보고하는 이유가 이것이다.

토크나이저 의존은 퍼플렉서티의 여러 한계 중 가장 미묘한 하나일 뿐이다. 나머지도 정리해 두자. 값은 어떤 코퍼스로 쟀는지에 따라 크게 변동한다 — 도메인·언어가 다르면 숫자가 달라진다. 평가 코퍼스가 학습 데이터와 겹치면(외운 것) PPL이 인위적으로 낮아져 "좋아 보이는 착시"를 만든다(데이터 오염, 4.1). 무엇보다 퍼플렉서티는 "다음 토큰 가능도"만 잴 뿐, 지시를 따르는지·사실을 말하는지·안전한지는 재지 못한다 — PPL이 낮아도 도움이 안 되거나 거짓말을 하거나 위험할 수 있다. 그리고 스텝별 놀람의 평균이라 긴 범위의 논리적 일관성을 잘 포착하지 못한다. 문장 하나하나는 매끄러운데 문단 논리는 붕괴하는 모델도 PPL은 좋을 수 있다. 그래서 "퍼플렉서티가 낮은 모델이 더 좋은 모델"이라는 흔한 요약은 거칠고 위험하다. 그것은 같은 토크나이저·같은 클린 코퍼스라는 조건에서 같은 계열 모델의 사전학습 진척을 볼 때만 안전한 지표이고, 제품 품질은 퍼플렉서티가 아니라 과제·안전·선호 평가(제4부)로 판단한다.

1.1.9 생성은 조건부 분포에서 표집하는 자기회귀 루프다

학습이 "정답에 높은 확률 주기"였다면, 생성(추론)은 그 방향을 뒤집는다 — 학습된 조건부 분포에서 실제 토큰을 뽑아 시퀀스를 한 칸씩 늘려 가는 것이다. 자기회귀 정의가 그대로 생성 루프가 된다.

아니오 예 프롬프트를 토큰화 초기 시퀀스 x<t 모델 forward: 로짓 z ∈ ℝV 계산 softmax → 다음 토큰 분포 p(xt | x<t) 디코딩: 분포에서 토큰 xt 선택 (argmax · 표집 — 1.7) EOS 이거나 최대 길이? xt 를 시퀀스 끝에 붙임 x<t ← x<t + xt 생성 종료 토큰들을 텍스트로 디토큰화

한 토큰을 뽑을 때마다 그것을 다시 입력에 붙여 다음 스텝의 조건으로 쓴다 — "자기가 만든 것을 먹는다"는 자기회귀의 문자 그대로의 의미다. 여기서 미리 다룰 세 가지가 이후 여러 장의 단초가 된다.

어떻게 뽑을지가 결과를 좌우한다. 가장 확률 높은 토큰만 고르면(greedy/argmax) 결정적이지만 단조롭고 반복에 빠지기 쉽다. 분포에서 확률에 비례해 표집하면 다양하지만 변동한다. 온도(temperature)로 분포의 뾰족함을 조절하고, top-k·top-p로 꼬리를 잘라내는 갖가지 디코딩 전략이 1.7의 전용 주제다. 같은 모델, 같은 프롬프트라도 이 선택 하나로 결과의 성격이 완전히 달라진다. 여기서는 "생성 = 조건부 분포에서 뽑기"라는 골격만 확정한다.

매 토큰이 forward 한 번이다. $N$ 개 토큰을 생성하려면 원칙적으로 순전파를 $N$ 번 실행해야 하고, 각 순전파는 직전이 뽑은 토큰에 의존한다. 이 직렬성이 생성이 느린 근본 이유다 — 아무리 GPU가 많아도 다음 토큰을 모르는 채로 그다음을 계산할 방법이 없다. 이 장벽을 부분적으로 우회하는 KV 캐시·투기적 디코딩·연속 배칭이 제5부(5.1)의 핵심이다.

오류가 스스로 증폭된다. 한 번 이상한 토큰을 뽑으면 그것이 다음 스텝의 조건이 되어 더 이상해질 수 있다. 학습 때는 항상 정답 프리픽스를 조건으로 봤는데(교사 강요, teacher forcing) 생성 때는 자기가 만든, 어쩌면 틀린 프리픽스를 조건으로 삼는 이 어긋남을 노출 편향(exposure bias)이라 부른다. 이 자기증폭이 반복 루프·주제 이탈·환각과 얽힌다 — 곧 볼 환각의 한 경로가 여기서 열린다.

1.1.10 맥락 내 학습 — 가중치를 안 바꾸고 배우는 것처럼 보이는 일

같은 다음 토큰 예측기인데, 규모가 커지면 학습 때 명시적으로 가르치지 않은 방식으로 쓰이는 현상이 관찰된다. 그 첫째가 맥락 내 학습(In-Context Learning, ICL) 이다 — 파라미터를 전혀 갱신하지 않고, 프롬프트 안에 예시 몇 개를 넣어 주는 것만으로 모델이 새 과제를 수행한다.

영어를 한국어로 번역:
sea -> 바다
sky -> 하늘
tree ->

모델은 "tree" 다음에 "나무"를 생성한다. 가중치는 그대로인데, 프롬프트라는 문맥만으로 번역이라는 과제를 그 자리에서 배운 것처럼 행동한다. 예시가 0개면 zero-shot, 몇 개면 few-shot이라 부른다. 이것이 프롬프트 엔지니어링(6.1)과 이 책 응용부 전체의 실무적 토대다 — 새 과제마다 모델을 다시 학습시키는 대신 프롬프트만 바꿔 시키는 것이 가능한 이유가 ICL이다. 왜 신기한가. 학습(가중치 갱신)과 추론(고정 가중치)의 경계가 흐려진다. 상식적으로 "배우려면 파라미터가 바뀌어야" 하는데, ICL은 파라미터를 손대지 않고도 배우는 것처럼 보인다.

정직하게 말하면, 이것이 어떻게 가능한지는 미해결이고 여러 가설이 경합한다. 어텐션이 문맥의 예시들로부터 일종의 "암묵적 경사하강"을 순전파 안에서 흉내 낸다는 견해가 있다. 모델이 프롬프트에 담긴 과제에 대해 베이즈 추론 비슷한 것을 수행해, 예시를 관찰할수록 "지금 시키는 과제가 번역이다"라는 사후 믿음을 좁혀 간다는 견해도 있다. 그리고 특정 회로가 패턴을 복사한다는 견해가 있는데, 이 마지막 것이 1.4과 직접 이어진다. 1.4.9에서 본 induction head 는 "A B … A"처럼 앞서 나온 패턴을 감지해 두 번째 A 다음에 B가 올 것을 예측하도록 돕는 회로로 역설계됐다. 위 예시에서 "sea -> 바다 … sky -> 하늘 … tree ->"의 구조를 감지해 그 패턴을 이어 가는 능력이, 바로 이 복사 회로가 하는 일과 닮았다. induction head가 ICL의 메커니즘 후보 중 하나로 지목되는 이유다. 다만 어느 하나로 정리되지 않았으므로 — "모델이 문맥에서 진짜로 학습한다"는 표현은 편리한 은유로 받아들이되, 확정된 기제로 단정하지 말아야 한다.

1.1.11 창발 — 상전이인가, 우리가 고른 자의 착시인가

두 번째 현상은 창발(emergence) 이다. 작은 모델에는 (거의) 없던 능력이 규모(파라미터·데이터·컴퓨트)가 어떤 지점을 넘어서면 갑자기 나타나는 것처럼 보이는 것을 가리킨다. 다자릿수 산술이나 특정 추론 과제에서, 성능이 규모에 따라 완만하지 않고 문턱을 넘듯 급등하는 곡선이 보고되었고(대략 2022년경), 이것이 "창발적 능력(emergent abilities)"으로 불렸다. 만약 참이라면 함의가 크다 — "더 키우면 예상 못 한 새 능력이 튀어나온다"는 뜻이고, 이는 안전과 예측 가능성에 심각한 문제를 던진다. 다음 모델이 무엇을 할 수 있을지 미리 알 수 없다는 말이기 때문이다.

그런데 이 주장은 뜨거운 논쟁의 한복판에 있다. 반론(대략 2023년경)의 핵심은, 그 "급등"의 상당 부분이 실재하는 상전이가 아니라 측정 방식의 산물일 수 있다는 것이다. 논거는 이렇다. 정확도(정답/오답)나 완전 일치(exact match)처럼 전부-아니면-전무인 불연속 지표를 쓰면, 모델이 5자리 곱셈에서 마지막 자리 하나까지 다 맞혀야 점수를 얻는다. 규모가 커지며 자리별 정확도가 매끄럽게 오르더라도, "전부 맞힘" 확률은 어떤 문턱 근처에서 계단처럼 증가한다 — 여러 개의 완만한 곡선을 곱하면 급등하는 곡선이 되기 때문이다. 그런데 같은 능력을 토큰 단위 확률이나 부분 점수 같은 연속·매끄러운 지표로 다시 재면, 성능이 문턱 없이 완만하게 오른다는 것이 반론의 관찰이다. 즉 창발이 세계 속의 급격한 상전이인지, 아니면 우리가 고른 자(척도)가 매끄러운 향상을 계단으로 보이게 만든 착시인지가 논쟁 중이다.

이 책의 태도는 어느 쪽도 확정 사실로 쓰지 않는 것이다. 규모가 커지며 많은 능력이 좋아진다는 것 자체는 관찰이다. 그러나 그것이 "예측 불가능한 문턱 도약"인지 "매끄러운 향상을 거친 척도가 계단으로 보이게 한 것"인지는 지표 선택에 달려 있다는 단서를 항상 병기한다. 이 구분은 학술적 트집이 아니다 — 만약 능력이 정말 예측 불가능하게 창발한다면 안전 대비가 달라져야 하고, 반대로 매끄럽게 오른다면 스케일링 곡선으로 다음 세대의 능력을 어느 정도 예측할 수 있다. 평가 지표를 어떻게 고르느냐가 이렇게 결론을 바꾸는 함정은 4.1에서 정면으로 다룬다.

1.1.12 환각은 버그가 아니라 목적함수의 부산물이다

강력함의 원천이었던 정의 — "그럴듯한 다음 토큰을 잇는다" — 는 동시에 한계의 원천이다. 환각(hallucination), 즉 모델이 사실이 아닌 것을 자신 있고 유창하게 생성하는 현상이 목적함수에서 곧장 따라 나온다는 것을 이해하는 것이 중요하다.

모델은 "참인 토큰"이 아니라 "학습 분포에서 그럴듯한(가능도 높은) 토큰"을 잇도록 훈련됐다. 목적함수 어디에도 진위를 대조하는 장치가 없다. 존재하지 않는 논문 제목, 그럴듯한 가짜 인용, 있을 법한 API 이름은 형태가 그럴듯하기만 하면 높은 확률을 받는다 — 모델에게는 "실제로 아는 것"과 "그럴듯하게 들리는 것"을 구분할 내재적 신호가 약하기 때문이다. 게다가 답을 모를 때 "모른다"고 말하는 것보다 뭐라도 유창하게 이어 가는 쪽이 다음 토큰 목표상 더 자연스러울 수 있다 — 학습 코퍼스에는 "모르겠습니다"보다 자신 있게 서술하는 문장이 훨씬 많기 때문이다. 앞 절의 노출 편향도 여기 겹친다. 한 번 사실과 어긋난 토큰을 뽑으면 그것이 조건이 되어, 모델은 그 거짓을 참인 양 일관되게 이어 간다.

여기서 미묘하지만 중요한 구분이 하나 있다. 모델이 어떤 토큰에 부여하는 확률은 "이 이어짐이 얼마나 전형적인가"를 재는 것이지 "이것이 얼마나 참인가"를 재는 것이 아니다. 그래서 모델이 높은 확률로, 즉 "자신 있게" 출력한 문장이 사실일 보장이 전혀 없다. 흔히 이 확률을 신뢰도로 오해하는데, 그 둘은 다른 축이다. 게다가 사후학습이 이 간극을 벌리기도 한다 — 사람 선호로 정렬한 모델이 "모르겠다"보다 단정적인 답을 선호하도록 학습되어 오히려 과신하게 될 수 있다는 관찰이 있다(연구 주장이며, 조건에 따라 다르다).

"이 목표에서 환각은 완전히 제거 불가능하다"는 강한 형태는 여전히 연구·논쟁의 대상이다(일부는 학습 목표상 불가피성을 논증한다 — 연구 주장). 그러나 실무적으로 확실한 것은, 환각은 켜고 끄는 스위치가 아니라 완화(mitigation) 의 대상이라는 점이다. 외부 지식으로 답에 근거를 대는 RAG(6.3·6.4), 정직성과 "모를 때 모른다고 말하기"를 유도하는 정렬(3.1·3.6), 계산·검색을 모델 바깥의 도구에 넘기고 결과를 검증하기, 불확실성 보정 — 이 모두가 뒤에서 다룰 완화 수단이다. 이 장의 요점은 그 수단들이 아니라, 왜 환각이 애초에 생기는지가 언어모델의 정의에서 직접 나온다는 것이다. 환각을 "언젠가 고쳐질 버그"로 여기는 팀과 "목적함수의 구조적 특성이니 시스템 차원에서 감싸야 할 것"으로 여기는 팀은 완전히 다른 제품을 만든다.

1.1.13 분포 밖에서 붕괴한다

정의에서 곧장 따라 나오는 두 번째 한계는 분포 밖(out-of-distribution) 취약성이다. 모델은 학습 데이터의 분포를 포착한 것이므로, 그 분포에서 멀리 벗어난 입력에는 약하다. 아주 드문 형식, 학습에 거의 없던 언어·표기, 긴 자릿수 계산, 교묘하게 비튼 문제 등에서 성능이 급격히 붕괴할 수 있다. "익숙한 것을 잘 잇는다"의 이면이 "낯선 것에 약하다"인 셈이다.

긴 자릿수 곱셈이 좋은 예다. 모델은 두세 자리 곱셈은 학습 코퍼스에 흔해 곧잘 하지만, 열 자리 곱셈은 코퍼스에 거의 없어 — 그리고 자릿수마다 올림을 정확히 추적하는 절차를 표면 통계로는 배우기 어려워 — 자주 틀린다. 사람에게는 세 자리든 열 자리든 같은 알고리즘이지만, 표면적 패턴을 잇는 모델에게는 "본 적 있는 형태"와 "본 적 없는 형태"의 차이가 크다. 관련된 실패가 지름길 학습(shortcut learning)이다 — 모델이 실제 논리 대신 학습 데이터의 표면적 상관에 기대는 것이다. 예컨대 특정 벤치마크에서 정답이 유독 긴 선택지에 몰려 있으면 모델은 "긴 선택지를 고른다"는 지름길을 배워 실제 추론을 건너뛴다. 표면적으로 익숙한 패턴에 이끌려 문제의 실제 논리를 무시하는 이 실패도 분포 밖 취약성의 한 양상이다.

이 두 한계 — 환각과 분포 밖 취약성 — 는 이 책 후반의 상당 부분이 왜 존재하는지에 대한 답이다. 정렬·평가·RAG·가드레일은 전부 "강력하지만 진실검증도 못 하고 낯선 입력에 약한 엔진"을 신뢰할 수 있는 제품으로 감싸는 장치다. 언어모델은 강력한 엔진이지만, 그것만으로 신뢰할 수 있는 제품이 되지는 않는다.

1.1.14 LLM은 조회하는 데이터베이스가 아니라 합성하는 생성기다

이제 이 장의 개념을 가장 널리 퍼진 오해와 부딪쳐 굳힐 차례다. "LLM은 인터넷을 통째로 외운 거대한 데이터베이스(또는 검색엔진)다" 는 틀렸고, 이 오해가 줄줄이 잘못된 기대를 낳는다.

오해실제왜 어긋나나
저장된 문서를 조회한다파라미터에 압축된 분포에서 토큰을 생성한다. 원문을 그대로 저장하지 않는다(파라메트릭 지식).원문을 정확히 인용하지 못하고, 없는 것을 지어낼 수 있다.
답이 어딘가에 있고 꺼내 온다답을 매 스텝 새로 합성한다. 같은 질문도 표집에 따라 답이 달라진다.결정성·재현성·인용 가능성을 기대하면 어긋난다.
최신 정보가 들어 있다학습 시점 이후는 모른다(지식 컷오프). 파라미터는 정적이다.최신·사설 지식은 RAG·도구로 바깥에서 결합해야 한다.
검색 결과처럼 출처가 있다기본적으로 출처가 없다. 근거·인용은 검색을 결합해야 생긴다.근거 없는 유창함을 사실로 오인하기 쉽다.

핵심 대비는 이렇다. 검색·DB는 저장된 것을 정확히 되돌려주고, 없으면 "없음"을 반환한다. LLM은 압축한 분포에서 매번 새로 그럴듯한 것을 만들어 내고, "없음"을 잘 말하지 못한다. 이것은 결함이 아니라 두 물건이 애초에 다른 일을 하도록 만들어졌다는 사실이다 — 그리고 바로 그래서 둘은 상보적이다. 실무 시스템이 LLM의 유창한 합성 능력과 검색·DB의 정확한 조회를 결합하는 이유가 이것이고, RAG가 정확히 그 결합이다(6.3). RAG는 이 장에서 본 오해를 실무적으로 메우는 장치 — 파라메트릭 생성기에 외부 조회를 결합해, 없는 것을 지어내는 대신 찾아온 근거 위에서 생성하게 하는 것 — 이라고 이해하면 정확하다.

반대 방향의 오해도 있다. "그냥 자동완성일 뿐"이라며 능력을 과소평가하는 것이다. 이 장 앞부분에서 봤듯, 다음 토큰 예측은 손실을 끝까지 낮추려면 문법·사실·인과·세계 모형을 요구하는, 결코 사소하지 않은 문제다. 과대평가(모든 것을 해결하는 DB)도 과소평가(단순 자동완성)도 아닌 정확한 상(像)은 하나다 — 언어모델은 방대한 텍스트를 유한한 파라미터로 압축해, 그 압축된 분포에서 매 스텝 다음 토큰을 표집하는 생성기다. 이 한 문장에 이 장의 전부가 들어 있다. 체인룰로 다음 토큰 예측 하나에 문제를 몰아넣은 것이 그 힘의 원천이고, 그 예측이 진실이 아니라 그럴듯함을 좇는다는 것이 그 약점의 원천이다. 힘과 약점이 같은 정의에서 나온다는 것을 염두에 두면, 앞으로 볼 학습·정렬·평가·서빙·응용이 전부 이 하나의 물건을 더 잘 만들고, 그 약점을 감싸고, 값싸게 운용하려는 노력으로 읽힌다.

다음 장에서는 이 장 내내 당연한 듯 써 온 "토큰"이 정확히 무엇인지를 다룬다. 텍스트를 어떤 단위로 자르느냐(BPE·서브워드)가 어휘 크기와 비용은 물론, 방금 본 퍼플렉서티 비교 가능성과 다국어 성능까지 좌우하기 때문이다.