수학

MATH / 중급 19번

확률 규칙: 결합·주변·조건부, 베이즈, 그리고 자기회귀 분해

언어모델은 다음 토큰 확률 하나만 내놓는데 어떻게 문장 전체의 확률을 말할 수 있을까요. 확률의 공리에서 결합·주변·조건부와 베이즈 규칙을 세우고, 조건부의 정의를 반복해 얻는 연쇄법칙이 자기회귀 분해 그 자체임을 봅니다.

PALDYN Team18 MIN READ

언어모델이 한 번의 순전파에서 내놓는 것은 다음 토큰 하나의 확률분포입니다. 어휘 5만 개짜리 벡터 하나, 그게 전부입니다. 그런데 우리는 태연히 «이 문장의 확률»이라고 말하고, 두 답변 중 어느 쪽이 더 그럴듯한지 점수로 비교하고, 로그가능도를 손실로 씁니다.

토큰 하나짜리 분포에서 문장 하나의 확률로 어떻게 건너가는가 — 이 글이 답할 것입니다. 지난 글에서 p(x1)p(x2∣x1)⋯p(x_1)p(x_2\mid x_1)\cdots 라는 곱을 모양만 빌려 썼는데, 그 곱이 어디서 오는지가 여기 있습니다. 그리고 답은 새로운 가정이 아니라 조건부 확률의 정의를 여러 번 쓴 것뿐입니다.

시작점 — 확률이 지켜야 하는 세 가지

확률은 «일어날 수 있는 모든 결과의 집합» 위에서 정의됩니다. 이 집합을 표본공간이라 하고 Ω\Omega 로 적습니다. 다음 토큰 자리라면 어휘 전체가 Ω\Omega 입니다. 그 부분집합 하나하나가 사건이고, 확률은 사건에 수를 붙이는 함수 PP 입니다.

PP 가 확률이라고 불리려면 세 가지만 지키면 됩니다.

  1. 음수가 없다. 모든 사건 AA 에 대해 P(A)≥0P(A) \ge 0
  2. 전체는 1이다. P(Ω)=1P(\Omega) = 1
  3. 겹치지 않으면 더한다. A∩B=∅A \cap B = \varnothing 이면 P(A∪B)=P(A)+P(B)P(A \cup B) = P(A) + P(B)

이것을 확률의 공리라고 합니다. 이 글에 나오는 모든 규칙이 여기서 나오고, softmax의 출력이 확률로 취급되는 것도 그 벡터가 이 셋을 만족하기 때문입니다 — 성분이 전부 양수이고, 합이 1이며, 서로 다른 토큰은 겹치지 않는 사건이라 합이 곧 합집합의 확률입니다.

결합·주변·조건부 — 표 하나로

두 자리를 동시에 보면 세 종류의 확률이 한꺼번에 생깁니다. 작은 예로 확인합니다. 앞 토큰이 the인지 a인지, 다음 토큰이 cat·dog·car 중 무엇인지를 재는 표입니다.

cat dog car 행 합
the 0.30 0.20 0.10 0.60
a 0.12 0.08 0.20 0.40
열 합 0.42 0.28 0.30 1.00

칸 하나하나가 결합확률입니다 — 두 사건이 함께 일어날 확률이고 p(the,cat)=0.30p(\text{the}, \text{cat}) = 0.30 처럼 적습니다. 여섯 칸의 합이 1인 것이 공리 2입니다.

가장자리의 합이 주변확률입니다. 한쪽 변수를 «신경 쓰지 않고» 지워 버린 확률이고, 지우는 방법은 그 변수의 모든 값에 대해 더하는 것입니다.

p(x)=∑yp(x,y)p(x) = \sum_{y} p(x, y)

이 조작을 주변화라고 부릅니다. 이름이 «주변»인 이유가 그림 그대로입니다 — 표의 가장자리(margin)에 적히는 값이라서입니다. 표에서 p(the)=0.30+0.20+0.10=0.60p(\text{the}) = 0.30+0.20+0.10 = 0.60 이고, 이 값이 다음 토큰이 무엇이든 상관없이 앞 토큰이 the일 확률입니다.

결합확률 표의 가장자리 합이 주변확률이 되는 그림

조건부확률은 «앞 토큰이 the라고 이미 알고 있을 때» 다음 토큰의 확률입니다.

p(y∣x)=p(x,y)p(x)(p(x)>0)p(y \mid x) = \frac{p(x, y)}{p(x)} \qquad (p(x) > 0)

분모가 하는 일이 핵심입니다. the인 행만 남기면 세 값의 합이 0.60이라 더는 확률이 아닙니다 — 공리 2가 깨집니다. 그래서 0.60으로 나누어 다시 1로 맞춥니다.

p(cat∣the)=0.300.60=0.5,p(dog∣the)=0.200.60=0.333,p(car∣the)=0.100.60=0.167p(\text{cat}\mid\text{the}) = \frac{0.30}{0.60} = 0.5,\quad p(\text{dog}\mid\text{the}) = \frac{0.20}{0.60} = 0.333,\quad p(\text{car}\mid\text{the}) = \frac{0.10}{0.60} = 0.167

조건을 건다는 것은 표본공간을 잘라 낸 뒤 남은 것을 다시 1로 정규화하는 일입니다. 언어모델이 문맥을 받아 분포를 내놓는 장면이 정확히 이것입니다 — 문맥이 표본공간을 자르고, softmax가 정규화를 맡습니다.

조건을 걸면 한 행만 남고 그 행을 다시 합 1로 정규화한다는 그림

정의의 분모를 넘기면 곱셈 규칙이 나옵니다. 이 글의 나머지가 전부 이 한 줄에서 나옵니다.

p(x,y)=p(x) p(y∣x)p(x, y) = p(x)\,p(y \mid x)

주변화에 이 곱셈 규칙을 넣으면 주변확률을 조건부만으로 적을 수 있습니다.

p(y)=∑xp(x,y)=∑xp(y∣x) p(x)p(y) = \sum_x p(x, y) = \sum_x p(y \mid x)\,p(x)

이것을 전확률 법칙이라고 합니다. «yy 가 나올 전체 확률은 각 경우에서 나올 확률을 그 경우의 확률로 가중평균한 것»이라는 뜻입니다. 표에서 p(cat)=0.5×0.60+0.3×0.40=0.30+0.12=0.42p(\text{cat}) = 0.5 \times 0.60 + 0.3 \times 0.40 = 0.30 + 0.12 = 0.42 로 열 합과 같습니다.

조건부는 대칭이 아닙니다. p(cat∣the)=0.5p(\text{cat}\mid\text{the}) = 0.5 인데 p(the∣cat)=0.30/0.42=0.714p(\text{the}\mid\text{cat}) = 0.30/0.42 = 0.714 입니다. 같은 칸 0.30을 서로 다른 것으로 나누었으니 당연한 일인데, 이 둘을 섞어 읽는 실수가 흔합니다 — «the 다음에 cat이 올 확률»과 «cat 앞에 the가 있었을 확률»은 다른 질문입니다. 두 값을 잇는 다리가 다음 절입니다.

독립 — 조건이 아무것도 바꾸지 않을 때

p(y∣x)=p(y)p(y \mid x) = p(y) 이면, 즉 xx 를 알아도 yy 의 분포가 그대로이면 두 사건이 독립이라고 합니다. 곱셈 규칙에 넣으면 익숙한 모양이 됩니다.

p(x,y)=p(x) p(y)p(x, y) = p(x)\,p(y)

독립은 양쪽에서 동시에 성립합니다. p(y∣x)=p(y)p(y\mid x) = p(y) 이면 곱셈 규칙을 거꾸로 써서 p(x∣y)=p(x)p(x\mid y) = p(x) 도 따라 나오기 때문입니다. «xx 가 yy 를 알려 주지 않는다»와 «yy 가 xx 를 알려 주지 않는다»는 같은 말입니다.

위 표는 독립이 아닙니다. p(car)=0.30p(\text{car}) = 0.30 인데 p(car∣the)=0.167p(\text{car}\mid\text{the}) = 0.167 이니 조건이 값을 바꿉니다. 자연어가 독립이 아니라는 것이 언어모델이 존재하는 이유입니다 — 토큰이 서로 독립이었다면 문맥을 볼 필요가 없고, 어휘의 빈도표 하나로 끝났을 것입니다.

베이즈 규칙 — 방향을 뒤집기

곱셈 규칙은 두 방향으로 쓸 수 있습니다. p(x,y)p(x,y) 는 어느 쪽을 먼저 조건으로 두든 같은 값이므로

p(x) p(y∣x)=p(y) p(x∣y)p(x)\,p(y\mid x) = p(y)\,p(x\mid y)

이고, 양변을 p(y)p(y) 로 나누면 베이즈 규칙입니다.

p(x∣y)=p(y∣x) p(x)p(y)p(x \mid y) = \frac{p(y \mid x)\,p(x)}{p(y)}

네 자리에 각각 이름이 있습니다.

자리 이름 뜻
p(x)p(x) 사전확률 관측 전에 xx 에 대해 알던 것
p(y∣x)p(y \mid x) 가능도 xx 가 참이라면 yy 가 나올 법한 정도
p(x∣y)p(x \mid y) 사후확률 yy 를 보고 난 뒤의 xx
p(y)p(y) 증거 관측이 나올 전체 확률. 정규화 상수

표로 확인합니다. cat이 나왔다는 것만 알 때 앞 토큰이 the였을 확률은 얼마일까요.

p(the∣cat)=p(cat∣the) p(the)p(cat)=0.5×0.600.42=0.300.42=0.714p(\text{the}\mid\text{cat}) = \frac{p(\text{cat}\mid\text{the})\,p(\text{the})}{p(\text{cat})} = \frac{0.5 \times 0.60}{0.42} = \frac{0.30}{0.42} = 0.714

사전확률 0.60이 관측 하나로 0.714까지 올라갔습니다. cat은 the 쪽에서 더 잘 나오는 토큰이라 증거가 그 방향으로 밀어 준 것입니다.

분모는 사실 계산할 필요가 없을 때가 많습니다. p(cat)=0.42p(\text{cat}) = 0.42 는 분자를 모든 xx 에 대해 더한 값과 같기 때문입니다 — 0.30+0.12=0.420.30 + 0.12 = 0.42 로 실제로 그렇습니다. 그래서 사후확률을 여러 후보에 대해 비교만 할 때는 분자만 계산하고 마지막에 합으로 나누면 됩니다. 이 «비례식 + 정규화» 패턴은 확산 모델의 역과정처럼 사후분포를 다루는 자리마다 반복해서 나옵니다.

베이즈 규칙의 네 자리와 표에서 뽑은 수를 대응시킨 그림

연쇄법칙 — 곱셈 규칙을 계속 쓰기

이제 자리를 셋으로 늘립니다. 곱셈 규칙을 한 번 쓰면

p(x1,x2,x3)=p(x1,x2) p(x3∣x1,x2)p(x_1, x_2, x_3) = p(x_1, x_2)\,p(x_3 \mid x_1, x_2)

이고, 남은 p(x1,x2)p(x_1,x_2) 에 한 번 더 쓰면

p(x1,x2,x3)=p(x1) p(x2∣x1) p(x3∣x1,x2)p(x_1, x_2, x_3) = p(x_1)\,p(x_2 \mid x_1)\,p(x_3 \mid x_1, x_2)

입니다. 자리가 TT 개여도 똑같이 T−1T-1 번 반복하면 되고, 결과가 확률의 연쇄법칙입니다.

p(x1,x2,…,xT)=∏t=1Tp(xt∣x<t)p(x_1, x_2, \dots, x_T) = \prod_{t=1}^{T} p(x_t \mid x_{<t})

x<tx_{<t} 는 tt 번째보다 앞에 있는 토큰 전부를 뜻하고, t=1t=1 일 때는 조건이 비어 있어 그냥 p(x1)p(x_1) 입니다.

여기에는 가정이 하나도 들어가지 않았습니다. 독립도 마르코프 성질도 쓰지 않았고, 조건부의 정의를 반복했을 뿐입니다. 그래서 이 등식은 어떤 결합분포에서도 참이고, 자리를 어떤 순서로 늘어놓아도 참입니다 — 뒤에서 앞으로 분해해도 등식은 성립합니다.

가정이 들어가는 것은 그다음 단계입니다. 조건 x<tx_{<t} 를 최근 n−1n-1 개로 잘라

p(xt∣x<t)≈p(xt∣xt−n+1,…,xt−1)p(x_t \mid x_{<t}) \approx p(x_t \mid x_{t-n+1}, \dots, x_{t-1})

로 두면 nn-그램 모델이 되고, 이 자르기를 마르코프 가정이라고 합니다. 여기서 등호가 근사로 바뀝니다 — 연쇄법칙은 등식이고, 근사는 조건을 자를 때 들어옵니다. 트랜스포머가 하는 일은 이 자르기를 되돌려 조건을 문맥 전체로 되돌려놓는 것입니다.

자기회귀 모델이 하는 일이 이 분해다

이제 처음 질문에 답할 수 있습니다. 언어모델은 연쇄법칙의 오른쪽 항 하나를 근사하는 함수입니다.

pθ(xt∣x<t)=softmax(모델(x<t))p_\theta(x_t \mid x_{<t}) = \text{softmax}(\text{모델}(x_{<t}))

그리고 문장 전체의 확률은 그 항들을 곱한 것 — 연쇄법칙이 그렇게 하라고 말해 주었습니다. 지난 글의 결론을 여기에 붙이면 곱은 합이 됩니다.

log⁡pθ(x1,…,xT)=∑t=1Tlog⁡pθ(xt∣x<t)\log p_\theta(x_1,\dots,x_T) = \sum_{t=1}^{T} \log p_\theta(x_t \mid x_{<t})

이 합이 로그가능도이고, 부호를 뒤집어 토큰 수로 나눈 것이 언어모델의 학습 손실입니다. 모델이 토큰 하나짜리 분포만 내놓아도 문장 확률을 말할 수 있는 근거가 전부 여기에 있습니다.

세 토큰으로 한 번 세어 봅시다. 모델이 순전파 세 번에서 이런 값을 내놓았다고 하면

p(the)=0.60,p(cat∣the)=0.5,p(sat∣the,cat)=0.4p(\text{the}) = 0.60,\quad p(\text{cat}\mid\text{the}) = 0.5,\quad p(\text{sat}\mid\text{the},\text{cat}) = 0.4

문장의 확률은 0.60×0.5×0.4=0.120.60 \times 0.5 \times 0.4 = 0.12 입니다. 세 번의 순전파에서 각각 한 항씩 받아 곱한 것이고, 그 이상은 아무것도 하지 않았습니다.

여기서 한 가지가 눈에 띕니다. 항이 전부 1 이하라 문장이 길어질수록 확률은 반드시 작아집니다. 긴 문장이 짧은 문장보다 «덜 그럴듯한» 것이 아니라, 자리가 많으면 그만큼 곱이 늘어나기 때문입니다. 그래서 길이가 다른 후보를 비교할 때는 로그가능도를 토큰 수로 나눈 «토큰당 평균»을 씁니다. 빔서치의 길이 정규화가 그것이고, 이 평균값을 다루는 지표는 「중급 26번 · 엔트로피와 퍼플렉서티」가 맡습니다.

문장이 토큰별 조건부 확률의 곱으로 분해되는 사슬 그림

두 가지가 따라옵니다.

하나, 인과 마스크는 선택이 아니라 필수입니다. tt 번째 항은 x<tx_{<t} 만 조건으로 받아야 합니다. 어텐션이 뒤쪽 토큰을 보게 두면 p(xt∣x<t)p(x_t \mid x_{<t}) 가 아니라 다른 값을 계산하는 것이고, 곱해 봐야 문장의 확률이 되지 않습니다. 트랜스포머 디코더의 삼각 마스크는 연쇄법칙의 조건 부분을 코드로 옮긴 것입니다.

둘, 생성은 이 분해를 왼쪽부터 채우는 일입니다. x1x_1 을 뽑고, 그것을 조건에 넣어 x2x_2 를 뽑고, 반복합니다. 매 단계에서 뽑는 대상이 정확히 연쇄법칙의 한 항입니다. 학습과 생성이 같은 식의 양쪽 방향인 셈입니다.

import numpy as np

# 문장 하나의 로그가능도 — 연쇄법칙의 항을 그대로 더한다
logprobs = np.array([-0.11, -2.31, -0.02, -1.20, -3.50])
print(logprobs.sum())            # -7.14
print(np.exp(logprobs.sum()))    # 0.000793

정리

  • 확률의 공리는 셋뿐이다 — 음수 없음, 전체가 1, 배반이면 덧셈. 나머지는 전부 여기서 나온다.
  • 조건을 건다는 것은 표본공간을 자른 뒤 다시 1로 정규화하는 일이다. 분모 p(x)p(x) 가 그 정규화를 맡는다.
  • 주변화는 신경 쓰지 않는 변수를 더해서 지우는 것이다. 표의 가장자리 합이 그 값이다.
  • 베이즈 규칙은 곱셈 규칙을 두 방향으로 쓴 것이다. 사전·가능도·증거·사후가 각각의 자리를 차지하고, 증거는 분자를 전부 더한 값이라 비교만 할 때는 미뤄 둘 수 있다.
  • 연쇄법칙에는 가정이 없다. 조건부의 정의를 T−1T-1 번 반복한 항등식이라 어떤 분포에서도 성립한다.
  • 자기회귀 분해가 그 연쇄법칙 자체다. 모델은 항 하나를 근사하고, 인과 마스크가 조건 부분을 지키고, 로그를 씌우면 합이 되어 손실이 된다.

문장 하나짜리 분포에서 시작해 문장 전체의 확률까지 왔습니다. 그런데 아직 «확률이 붙은 결과»만 다루었을 뿐, 그 결과에 수를 붙여 평균을 내는 일은 하지 않았습니다. 다음 글은 확률변수와 기댓값을 세워 «손실은 데이터 분포 위의 기댓값»이라는 문장을 실제로 계산할 수 있게 만듭니다.


읽어주셔서 감사합니다. 😊

LATEST

수학의 최신 글

수학2026.09.07

양자화 오차: 격자 사상, 오차 분산, 이상치 채널

실수를 2^b개 격자에 사상할 때 오차의 분산이 왜 Δ²/12인지 유도하고, 그것이 비트당 6.02dB라는 SNR로 번역되는 과정을 실측과 대조했습니다. 이상치 하나가 나머지 값의 유효 비트를 어떻게 먹는지, 그리고 int4에서 성능이 무너지는 지점을 오차 예산으로 미리 계산하는 법까지.

중급18 MIN
수학2026.09.07

수치적으로 안정한 계산 패턴 모음

최댓값 빼기, 로그 공간, log1p·expm1, 분산의 두 공식, 정규화의 ε, fp32 누산, 역행렬 대신 solve — 프레임워크가 몰래 해 주는 일곱 가지를 하나씩 꺼내 각각 어떤 고장을 막는지 직접 재 봤습니다. 수식을 그대로 옮긴 코드가 왜 라이브러리보다 나쁜지에 대한 목록입니다.

중급22 MIN
수학2026.09.07

부동소수점은 어디서 새는가: 반올림, 상쇄, 더하는 순서

0.1 + 0.2가 0.3이 아닌 이유부터 시작해 머신 엡실론을 유도하고, 같은 16비트인데 fp16과 bf16이 서로 다른 지점에서 터지는 이유, 비슷한 수를 뺄 때 유효자리가 사라지는 파괴적 상쇄, 그리고 1,000만 개를 순서만 바꿔 더했을 때 오차가 백만 배 갈리는 실험까지 직접 재 봤습니다.

중급23 MIN