수학

MATH / 중급 27번

최대가능도: '학습'이라는 말의 가장 정확한 정의

회귀에는 MSE, 분류에는 교차엔트로피. 이 규칙은 외운 것이 아니라 유도된 것입니다. 확률과 가능도의 차이에서 시작해 로그가능도를 세우고, 정규분포를 가정하면 MSE가 범주분포를 가정하면 교차엔트로피가 떨어져 나오는 과정을 끝까지 따라갑니다.

PALDYN Team39 MIN READ

딥러닝 입문서는 손실함수를 이렇게 가르칩니다. 회귀 문제에는 평균제곱오차를, 분류 문제에는 교차엔트로피를 씁니다. PyTorch로 집값 예측 모델을 짜면 nn.MSELoss()를, 고양이·개 분류기를 짜면 nn.CrossEntropyLoss()를 한 줄 적고 넘어갑니다. 왜 그런지는 「분류에서 MSE를 쓰면 학습이 느리다」 정도로 넘어가는 일이 많습니다.

그런데 이 짝은 누가 고른 것이 아니라 유도된 것입니다. 두 손실은 한 원리에서 갈라져 나온 두 가지 결과이고, 원리는 하나입니다.

관측한 데이터가 가장 그럴듯해지도록 파라미터를 고른다.

이것이 최대가능도 추정(maximum likelihood estimation)이고, 「학습」이라는 말에 대한 가장 정확한 정의입니다. 지난 글에서 손실이 엔트로피와 같은 종류의 양이라는 데까지 왔으니, 이제 그 손실 자체가 어디서 왔는지를 캘 차례입니다.

확률과 가능도

두 방향의 읽기

식 하나로 시작합니다. 앞면이 나올 확률이 θ\theta 인 동전을 10번 던져 앞면이 kk 번 나올 확률입니다.

P(k∣θ)=(10k)θk(1−θ)10−kP(k \mid \theta) = \binom{10}{k}\theta^k (1-\theta)^{10-k}

이 식에는 문자가 둘 있습니다. θ\theta 와 kk 입니다. 어느 쪽을 고정하고 어느 쪽을 움직이느냐에 따라 이름이 달라집니다.

  • θ\theta 를 고정하고 kk 를 움직이면 확률입니다. 「이 동전으로 앞면이 몇 번 나올까」를 묻습니다. kk 에 대해 다 더하면 1입니다.
  • kk 를 고정하고 θ\theta 를 움직이면 가능도(likelihood)입니다. 「이 결과가 나왔는데 동전은 어떤 것이었을까」를 묻습니다.

확률과 가능도는 같은 식을 두 방향으로 읽은 것

여기서 가장 자주 하는 오해를 미리 못 박습니다. 가능도는 확률이 아닙니다. θ\theta 에 대해 다 더해도 1이 되지 않습니다 — 애초에 θ\theta 는 확률변수가 아니라 우리가 고르는 값이니 「θ\theta 가 0.7일 확률」 같은 것은 이 틀 안에 없습니다. 그래서 이름을 따로 붙이고 표기도 바꿔 씁니다.

L(θ)=P(관측한 데이터∣θ)L(\theta) = P(\text{관측한 데이터} \mid \theta)

숫자 자체는 오른쪽과 같습니다. 다만 θ\theta 의 함수로 읽겠다는 선언이 왼쪽 표기입니다.

가능도비

10번 중 7번 앞면이 나왔을 때 가능도를 실제로 재 보면 L(0.7)=0.2668L(0.7) = 0.2668, L(0.5)=0.1172L(0.5) = 0.1172 입니다. 여기서 0.2668이라는 수 하나만 떼어 놓으면 아무 말도 하지 않습니다. 「이 동전이 0.7짜리일 가능성이 27%」라는 뜻이 아니고, 던진 횟수를 100번으로 늘리면 어떤 θ\theta 에서든 값이 훨씬 작아집니다. 한 가지 결과가 나올 확률은 결과의 가짓수가 늘수록 줄어들기 때문입니다.

뜻이 생기는 것은 두 θ\theta 에서 잰 값을 나눌 때입니다. 이 몫을 가능도비라고 부르는데, 같은 데이터를 놓고 한 가설이 다른 가설보다 그 데이터를 몇 배 더 잘 설명하는지를 적는 수입니다. 위의 두 값이면

L(0.7)L(0.5)=0.26680.1172≈2.28\frac{L(0.7)}{L(0.5)} = \frac{0.2668}{0.1172} \approx 2.28

로, 「0.7짜리 동전」이 「공정한 동전」보다 이 결과를 2.28배 잘 설명합니다. 앞의 (107)=120\binom{10}{7} = 120 은 분자와 분모에 똑같이 들어 있어 약분되므로, 가능도비를 잴 때는 θ\theta 와 무관한 계수를 신경 쓸 필요가 없습니다. 조금 뒤에 로그가능도에서 상수를 버리는 것도 같은 근거입니다.

모델 둘을 견주는 일이 전부 이 모양입니다. 언어 모델 A와 B에 같은 검증 문장을 넣고 각각이 그 문장에 준 확률을 나누면, 어느 쪽이 그 문장을 몇 배 더 그럴듯하게 봤는지가 나옵니다. 로그를 씌우면 나눗셈이 뺄셈이 되어 「검증 손실의 차」가 됩니다. 검증 손실 0.05 차이를 두고 모델을 고를 때 우리는 사실 가능도비를 읽고 있습니다.

확률밀도

키나 온도처럼 연속인 값에서는 한 점이 나올 확률이 0이라, 가능도에 들어가는 것은 확률이 아니라 확률밀도입니다. 밀도는 구간에 대해 넓이를 재야 확률이 되는 높이이고, 그래서 값 하나가 1을 넘어도 됩니다. 평균 0, 표준편차 0.1인 정규분포는 꼭대기 높이가 1/(0.12π)≈3.991/(0.1\sqrt{2\pi}) \approx 3.99 입니다. 폭이 좁은 만큼 높아져야 넓이가 1로 맞기 때문입니다.

그러니 연속 데이터의 가능도가 1보다 크게 나와도 계산이 틀린 것이 아닙니다. 가능도비로만 읽으면 되므로 확률인지 밀도인지는 결론을 바꾸지 않습니다.

로그가능도

곱에서 합으로

데이터가 여럿이면 가능도는 곱이 됩니다. 관측 x1,…,xnx_1, \dots, x_n 이 독립이고 같은 분포에서 나왔다고 가정하면 — 이 가정을 i.i.d. 라고 하고 딥러닝에서 미니배치를 뽑을 때 늘 깔고 들어가는 전제입니다 — 결합확률이 곱으로 쪼개집니다.

L(θ)=∏i=1np(xi∣θ)L(\theta) = \prod_{i=1}^{n} p(x_i \mid \theta)

곱은 두 가지 이유로 다루기 나쁩니다. 첫째, 지수와 로그 글에서 본 대로 확률을 수천 개 곱하면 언더플로, 곧 컴퓨터가 적을 수 있는 가장 작은 양수보다 작아져 0으로 떨어지는 일이 생깁니다. 0.5를 2,000번 곱해 보면 파이썬의 float64에서 정확히 0.0이 나옵니다. float64가 적을 수 있는 가장 작은 양수가 2−1074≈5×10−3242^{-1074} \approx 5 \times 10^{-324} 이고, 0.520000.5^{2000} 은 그보다 한참 아래이기 때문입니다. 둘째, 곱의 미분은 항이 늘어날수록 지저분해집니다.

둘 다 로그 하나로 해결됩니다.

ℓ(θ)=log⁡L(θ)=∑i=1nlog⁡p(xi∣θ)\ell(\theta) = \log L(\theta) = \sum_{i=1}^{n} \log p(x_i \mid \theta)

같은 계산을 로그로 하면 2000×log⁡0.5=−1386.292000 \times \log 0.5 = -1386.29 라는 멀쩡한 수가 나옵니다. 곱이 0으로 무너진 자리에서 합은 아무 일도 없습니다.

최댓값의 자리

로그는 증가함수라 최댓값의 자리를 바꾸지 않습니다. LL 을 최대로 만드는 θ\theta 와 ℓ\ell 을 최대로 만드는 θ\theta 가 정확히 같습니다.

L과 log L의 꼭짓점이 같은 자리에 있다

바뀌지 않는 것은 자리이지 값이 아닙니다. 동전 예에서 꼭대기 높이는 LL 로 0.2668이고 ℓ\ell 로 −1.321입니다. 곡선의 모양도 다릅니다 — LL 은 꼭대기 근처가 뾰족하고 양 끝에서 0에 붙지만, ℓ\ell 은 양 끝에서 음의 무한대로 떨어집니다. 그래서 「최대가 되는 θ\theta」를 물을 때는 둘을 바꿔 써도 되지만, 「최댓값이 얼마인가」를 물을 때는 어느 쪽 값인지를 밝혀야 합니다. 앞 절의 가능도비도 로그에서는 차 −1.321−(−2.144)=0.823-1.321 - (-2.144) = 0.823 이 되고, e0.823≈2.28e^{0.823} \approx 2.28 로 같은 말을 합니다.

손으로 최대화

동전을 10번 던져 앞면이 7번 나왔습니다. θ\theta 를 얼마로 잡아야 할까요.

ℓ(θ)=log⁡(107)+7log⁡θ+3log⁡(1−θ)\ell(\theta) = \log\binom{10}{7} + 7\log\theta + 3\log(1-\theta)

첫 항은 θ\theta 와 무관한 상수라 미분하면 사라집니다.

dℓdθ=7θ−31−θ=0\frac{d\ell}{d\theta} = \frac{7}{\theta} - \frac{3}{1-\theta} = 0

7(1−θ)=3θ⟹7=10θ⟹θ^=0.77(1-\theta) = 3\theta \quad \Longrightarrow \quad 7 = 10\theta \quad \Longrightarrow \quad \hat{\theta} = 0.7

직관과 정확히 같은 답이 나왔습니다. 10번 중 7번이니 0.7. 최대가능도가 좋은 원리인 이유의 절반이 이것입니다 — 당연한 자리에서는 당연한 답을 줍니다. 나머지 절반은 당연하지 않은 자리에서도 답을 준다는 것입니다.

미니배치 평균

합으로 바뀐 것이 학습에서 갖는 뜻이 하나 더 있습니다. 로그가능도가 표본마다의 항을 더한 것이므로, 무작위로 몇 개만 뽑아 그 항들의 평균을 내면 기댓값이 전체 평균과 같습니다. 이렇게 기댓값이 재려는 값과 정확히 같은 추정을 불편 추정이라 하고, 편향은 둘의 차입니다.

조금 뒤에 쓸 자료 2,4,4,4,5,5,7,92, 4, 4, 4, 5, 5, 7, 9 로 해 보면, μ=5\mu = 5, σ=2\sigma = 2 인 정규분포에서 여덟 점의 로그밀도 평균이 −2.112입니다. 여덟 개 중 두 개씩 뽑는 28가지 묶음마다 평균을 내면 −3.175부터 −1.612까지 들쭉날쭉하지만, 그 28개를 다시 평균하면 정확히 −2.112로 돌아옵니다.

확률적 경사하강법이 서 있는 자리가 여기입니다. 데이터 수백만 개를 매 걸음 다 보지 않고 미니배치 하나만 보고도 옳은 방향을 평균적으로는 짚는 것은, 손실이 표본마다의 합이라서입니다. 가능도가 곱인 채로는 이런 일이 되지 않습니다 — 곱의 일부만 떼어 낸 것은 전체 곱에 대해 아무것도 말해 주지 않습니다.

가능도 곡면

정규분포의 두 손잡이

파라미터가 하나면 곡선이지만 둘이면 곡면입니다. 자료 2,4,4,4,5,5,7,92, 4, 4, 4, 5, 5, 7, 9 에 정규분포를 맞춰 봅시다. 손잡이는 μ\mu 와 σ\sigma 둘입니다.

한 점의 밀도가 1σ2πexp⁡ ⁣(−(xi−μ)2/2σ2)\frac{1}{\sigma\sqrt{2\pi}}\exp\!\big(-(x_i-\mu)^2/2\sigma^2\big) 이므로 로그를 씌워 더하면

ℓ(μ,σ)=−nlog⁡σ−n2log⁡(2π)−12σ2∑i=1n(xi−μ)2\ell(\mu, \sigma) = -n\log\sigma - \frac{n}{2}\log(2\pi) - \frac{1}{2\sigma^2}\sum_{i=1}^{n}(x_i - \mu)^2

입니다. 로그가 지수를 그대로 벗겨 내 마지막 항이 제곱합만 남았습니다. 이 자리를 기억해 두십시오 — 조금 뒤에 MSE가 여기서 나옵니다.

정규분포 가능도의 등고선과 꼭대기

μ\mu 로 미분하면 앞의 두 항이 상수라 사라지고

∂ℓ∂μ=1σ2∑i(xi−μ)=0⟹μ^=1n∑ixi=5\frac{\partial \ell}{\partial \mu} = \frac{1}{\sigma^2}\sum_i (x_i - \mu) = 0 \quad \Longrightarrow \quad \hat{\mu} = \frac{1}{n}\sum_i x_i = 5

가 됩니다. σ\sigma 로 미분하면

∂ℓ∂σ=−nσ+1σ3∑i(xi−μ)2=0⟹σ^2=1n∑i(xi−μ^)2=328=4\frac{\partial \ell}{\partial \sigma} = -\frac{n}{\sigma} + \frac{1}{\sigma^3}\sum_i (x_i-\mu)^2 = 0 \quad \Longrightarrow \quad \hat{\sigma}^2 = \frac{1}{n}\sum_i (x_i - \hat{\mu})^2 = \frac{32}{8} = 4

이므로 σ^=2\hat{\sigma} = 2 입니다. 평균과 퍼짐이라는 익숙한 두 값이 원리 하나에서 떨어져 나왔습니다.

μ^\hat{\mu} 에 σ\sigma 가 안 들어 있는 것은 우연이 아닙니다. μ\mu 가 나오는 항은 마지막 항 하나이고, 거기서 σ\sigma 는 제곱합 바깥에 1/2σ21/2\sigma^2 이라는 양의 배수로만 붙어 있습니다. 양의 배수는 제곱합이 가장 작아지는 자리를 옮기지 못하므로, σ\sigma 를 1로 두든 3으로 두든 μ\mu 의 답은 5입니다. 실제로 σ=2\sigma = 2 에서 μ\mu 를 4로 옮기면 로그가능도가 −16.90에서 −17.90으로 1만큼 떨어지고, 이 1이라는 차는 n(μ−xˉ)2/2σ2=8×1/8n(\mu - \bar{x})^2 / 2\sigma^2 = 8 \times 1 / 8 입니다. 그래서 두 손잡이를 따로 풀 수 있었습니다. 반대로 σ^\hat{\sigma} 에는 μ^\hat{\mu} 가 들어 있어서, 순서는 언제나 평균 먼저입니다.

분산의 편향

한 가지 짚고 갈 것이 있습니다. 여기서 나온 분산은 nn 으로 나눈 값입니다. 분산과 표준오차 글에서는 n−1n-1 로 나눴는데, 최대가능도 추정량은 분산을 평균적으로 n−1n\frac{n-1}{n} 배만큼 낮잡습니다.

n=8n = 8 이면 그 배수가 78=0.875\frac{7}{8} = 0.875 입니다. 참 분산이 4인 정규분포에서 여덟 개씩 뽑아 σ^2\hat{\sigma}^2 을 구하는 일을 20만 번 되풀이하면 그 평균이 3.50으로 나옵니다. 4×0.875=3.54 \times 0.875 = 3.5 이니 식이 말한 그대로입니다. n−1n-1 로 나눈 쪽은 같은 실험에서 4.00입니다. 위의 자료 하나로 두 값을 비교하면 32/8=432/8 = 4 와 32/7≈4.5732/7 \approx 4.57 입니다.

낮잡는 까닭은 μ^\hat{\mu} 가 바로 그 자료에서 나왔다는 데 있습니다. 표본 평균은 제곱합을 가장 작게 만드는 자리라서 참 평균에서 잰 제곱합보다 늘 작거나 같습니다. nn 이 크면 배수가 1에 붙어 차이가 사라지지만, 표본이 작을수록 최대가능도가 언제나 편향 없는 답을 주지는 않는다는 것이 눈에 띕니다.

일치성과 불변성

「그럴듯한 것을 고른다」는 말은 그럴듯하게 들리지만, 그것만으로 원리가 되지는 않습니다. 최대가능도가 자리를 굳힌 데는 두 가지 성질이 있습니다.

첫째는 일치성입니다. 데이터를 계속 모으면 추정값이 참값으로 수렴합니다. 가정한 분포의 모양이 실제와 맞기만 하면, nn 을 늘리는 것이 반드시 답에 가까워지는 길이라는 보장을 줍니다. 데이터를 키우면 모델이 좋아진다는 경험칙의 이론적인 바닥이 여기입니다. 앞의 편향도 이 성질과 부딪히지 않습니다 — n−1n\frac{n-1}{n} 은 nn 이 커지면 1로 갑니다.

둘째는 불변성입니다. θ^\hat{\theta} 가 θ\theta 의 최대가능도 추정이면, 임의의 함수 gg 에 대해 g(θ^)g(\hat{\theta}) 가 g(θ)g(\theta) 의 최대가능도 추정입니다. 위에서 σ^2=4\hat{\sigma}^2 = 4 를 구한 뒤 σ^=2\hat{\sigma} = 2 라고 그냥 제곱근을 씌운 것이 이 성질을 쓴 것입니다. 분산으로 적든 표준편차로 적든 로그 분산으로 적든 같은 분포를 답으로 준다는 뜻이라, 구현에서 파라미터화를 바꿔도 되는 근거가 됩니다.

KL 발산과 덮기

한계는 가정에 통째로 기댄다는 것입니다. 데이터가 실제로 어떤 분포에서 나왔는지 틀리게 잡으면, 그 틀린 분포 안에서 가장 그럴듯한 답을 성실하게 찾아 줍니다. 그 답이 무엇인지는 한 줄로 적힙니다. 데이터를 낸 참 분포를 pdatap_{\text{data}} 라 하면, 표본이 많을 때 평균 로그가능도는 Epdata[log⁡pθ(x)]\mathbb{E}_{p_{\text{data}}}[\log p_\theta(x)] 로 가고, 이것은

Epdata[log⁡pθ(x)]=−H(pdata)−KL(pdata ∥ pθ)\mathbb{E}_{p_{\text{data}}}[\log p_\theta(x)] = -H(p_{\text{data}}) - \mathrm{KL}(p_{\text{data}} \,\|\, p_\theta)

로 갈립니다. 첫 항은 지난 글의 엔트로피이고 θ\theta 와 무관합니다. 둘째 항의 KL 발산은 참 분포 대신 모델 분포로 부호화할 때 더 드는 평균 정보량으로, 두 분포가 얼마나 다른지를 재는 양입니다. 그러니 로그가능도를 최대화하는 것은 KL 발산을 최소화하는 것과 같고, 가정이 틀렸을 때 최대가능도는 참 분포에 가장 가까운 모델을 이 잣대로 고릅니다.

이 KL은 참 분포가 앞에 오는 방향이라 정방향 KL이라고 부르고, 성질이 뚜렷합니다. 데이터가 있는 자리에서 모델 밀도가 0에 가까우면 log⁡pθ\log p_\theta 가 음의 무한대로 가서 벌점이 폭발하므로, 모델은 데이터가 나오는 곳을 하나도 비우지 않으려고 넓게 덮습니다. 봉우리가 −3과 3에 하나씩 있는 자료에 정규분포 하나를 맞추면, 두 봉우리 사이 0에 평균을 두고 표준편차를 약 3.16으로 벌려 둘 다를 덮습니다. 정작 자료가 거의 없는 0 근처에 가장 높은 밀도를 주는 셈입니다.

정방향 KL을 줄이는 정규분포 하나가 두 봉우리를 넓게 덮는다

생성 모델이 흐릿한 평균 같은 표본을 내는 현상을 이야기할 때 자주 불려 나오는 성질입니다.

가정에서 나오는 손실

정규분포와 MSE

이제 회귀로 갑니다. 모델 fθ(x)f_\theta(x) 가 입력에서 값을 예측하는데, 예측과 정답 사이의 오차가 정규분포를 따른다고 가정합니다.

yi=fθ(xi)+εi,εi∼N(0,σ2)y_i = f_\theta(x_i) + \varepsilon_i, \qquad \varepsilon_i \sim \mathcal{N}(0, \sigma^2)

같은 말을 분포로 적으면 yi∼N(fθ(xi), σ2)y_i \sim \mathcal{N}(f_\theta(x_i),\, \sigma^2) 입니다. 로그가능도를 세웁니다.

ℓ(θ)=∑i=1n[−log⁡(σ2π)−(yi−fθ(xi))22σ2]\ell(\theta) = \sum_{i=1}^{n}\left[-\log(\sigma\sqrt{2\pi}) - \frac{(y_i - f_\theta(x_i))^2}{2\sigma^2}\right]

θ\theta 로 최대화하는 것이 목표이니 θ\theta 가 안 들어 있는 것은 전부 버려도 됩니다. 첫 항은 상수이고, 1/2σ21/2\sigma^2 은 양의 상수배라 최댓값의 자리를 바꾸지 않습니다 — 가능도 곡면에서 μ^\hat{\mu} 가 σ\sigma 에 안 걸렸던 것과 같은 이유입니다. 남는 것은

arg⁡max⁡θ ℓ(θ)=arg⁡min⁡θ ∑i=1n(yi−fθ(xi))2\arg\max_\theta \ \ell(\theta) = \arg\min_\theta \ \sum_{i=1}^{n}\big(y_i - f_\theta(x_i)\big)^2

평균제곱오차입니다. 부호를 뒤집었으니 최대화가 최소화가 되었고, nn 으로 나누는 것 역시 양의 상수배라 자리를 안 바꿉니다. 그러니 MSE를 쓴다는 것은 곧 오차가 정규분포라고 가정한다는 말입니다.

범주분포와 교차엔트로피

분류입니다. 모델이 CC 개 클래스에 확률 qθ(c∣x)q_\theta(c \mid x) 를 매기고, 정답이 그 범주분포에서 뽑혔다고 가정합니다.

yi∼Categorical(qθ(⋅∣xi))y_i \sim \mathrm{Categorical}\big(q_\theta(\cdot \mid x_i)\big)

한 표본의 가능도는 모델이 정답 클래스에 준 확률 하나이므로 p(yi∣xi,θ)=qθ(yi∣xi)p(y_i \mid x_i, \theta) = q_\theta(y_i \mid x_i) 입니다. 로그를 씌워 더하고 부호를 뒤집으면 끝입니다.

arg⁡max⁡θ∑i=1nlog⁡qθ(yi∣xi)=arg⁡min⁡θ(−∑i=1nlog⁡qθ(yi∣xi))\arg\max_\theta \sum_{i=1}^{n} \log q_\theta(y_i \mid x_i) = \arg\min_\theta \left(-\sum_{i=1}^{n} \log q_\theta(y_i \mid x_i)\right)

오른쪽이 음의 로그가능도이고, 이것이 곧 지난 글에서 본 사전학습 손실 한 줄입니다.

loss=1N∑t=1N(−log⁡q(xt∣x<t))\text{loss} = \frac{1}{N}\sum_{t=1}^{N}\big(-\log q(x_t \mid x_{<t})\big)

두 식이 글자 그대로 같습니다. 다음 토큰 예측은 어휘 5만 개짜리 분류 문제이고, 그 손실은 범주분포를 가정한 최대가능도였습니다. 이것이 왜 「교차엔트로피」라고도 불리는지 — 정답을 원-핫 분포로 보고 두 분포 사이의 교차엔트로피를 계산하면 정확히 이 식이 된다는 것 — 은 중급 28번 · 교차엔트로피 = 음의 로그가능도가 맡습니다.

가정에서 손실함수가 유도되는 두 갈래

가정별 손실

두 유도에서 한 일이 똑같습니다. 분포를 가정하고, 로그가능도를 적고, θ\theta 와 무관한 항을 버리고, 부호를 뒤집었습니다. 손실함수가 달라 보였던 것은 가정한 분포가 달랐을 뿐입니다. 같은 네 걸음을 다른 분포에 대면 다른 손실이 나옵니다.

가정한 분포 한 표본의 음의 로그가능도 (상수 뺌) 이름
정규 N(μ,σ2)\mathcal{N}(\mu, \sigma^2) (y−μ)2/2σ2(y-\mu)^2 / 2\sigma^2 MSE
라플라스 Laplace(μ,b)\mathrm{Laplace}(\mu, b) ∣y−μ∣/b\lvert y-\mu \rvert / b L1 손실
베르누이 Bern(p)\mathrm{Bern}(p) −ylog⁡p−(1−y)log⁡(1−p)-y\log p - (1-y)\log(1-p) 이진 교차엔트로피
범주 Cat(q)\mathrm{Cat}(q) −log⁡qy-\log q_y 교차엔트로피
포아송 Pois(λ)\mathrm{Pois}(\lambda) λ−klog⁡λ\lambda - k\log\lambda 포아송 손실

라플라스 분포는 평균 자리에서 뾰족하고 양쪽으로 지수적으로 떨어지는 분포로, 정규분포보다 꼬리가 두껍습니다. 정규분포는 꼬리가 얇아 큰 오차를 거의 있을 수 없는 일로 보고 제곱으로 벌주지만, 라플라스는 절댓값으로만 벌줍니다. 포아송은 하루 방문자 수처럼 0 이상의 정수를 세는 데 쓰고, k=3k = 3 을 관측했을 때 λ−3log⁡λ\lambda - 3\log\lambda 를 미분하면 1−3/λ=01 - 3/\lambda = 0 에서 λ^=3\hat{\lambda} = 3 이 나옵니다. 관측값 그대로이니 여기서도 당연한 자리에서 당연한 답입니다.

정규와 라플라스의 차이는 이상치 하나로 드러납니다. 앞의 자료 2,4,4,4,5,5,7,92, 4, 4, 4, 5, 5, 7, 9 에 둘을 각각 맞추면, 정규의 답은 평균 5이고 라플라스의 답은 중앙값입니다. 짝수 개라 4와 5 사이 어디든 절댓값 합이 12로 같아서 답이 한 점이 아니라 구간으로 나옵니다. 여기에 입력 실수로 45가 하나 끼어들면 아홉 개의 평균은 85/9≈9.4485/9 \approx 9.44 로 두 배 가까이 끌려가고, 중앙값은 5에 머뭅니다.

같은 자료에 정규와 라플라스를 맞췄을 때 이상치 하나가 답을 끄는 정도

중앙값이 안 움직이는 것은 절댓값 손실의 기울기가 오차의 크기와 무관하게 ±1이기 때문입니다. 45는 40만큼 떨어져 있어도 한 표 몫의 힘만 씁니다. 제곱 손실에서는 기울기가 오차에 비례하므로 같은 점이 다른 점들보다 수십 배 세게 당깁니다. 이상치가 많은 데이터에서 MSE가 흔들린다는 경험칙은 가정이 틀린 자리를 알려 주는 신호이고, 고치는 길은 손실을 바꾸는 것이 아니라 분포를 바꾸는 것입니다.

이분산 정규

MSE를 유도할 때 σ\sigma 는 모든 표본에 같은 상수로 두고 버렸습니다. 입력마다 잡음의 크기가 다른 상황을 이분산이라 하는데, 이때는 모델이 평균 μθ(x)\mu_\theta(x) 와 함께 σθ(x)\sigma_\theta(x) 까지 예측하게 둘 수 있습니다. 그러면 σ\sigma 가 더는 상수가 아니라 버릴 수 없고, 한 표본의 음의 로그가능도가

log⁡σθ(x)+(y−μθ(x))22σθ(x)2\log \sigma_\theta(x) + \frac{\big(y - \mu_\theta(x)\big)^2}{2\sigma_\theta(x)^2}

로 남습니다. 두 항이 서로 반대로 당깁니다. 오차 3이 난 표본에서 σ=1\sigma = 1 이면 손실이 0+4.5=4.50 + 4.5 = 4.5 이고, σ=3\sigma = 3 으로 넓히면 log⁡3+0.5=1.60\log 3 + 0.5 = 1.60 으로 줄어듭니다. 오차가 0.5밖에 안 나는 표본은 반대로 σ=1\sigma = 1 일 때 0.125, σ=0.5\sigma = 0.5 로 좁히면 −0.19로 더 작아집니다. 미분하면 최적의 σ\sigma 는 오차의 크기 그대로입니다.

모델은 자신 없는 입력에서 σ\sigma 를 스스로 넓히고, 그 대가로 log⁡σ\log\sigma 만큼 벌을 받습니다. 이 항이 없다면 모든 σ\sigma 를 무한대로 보내 둘째 항을 0으로 만드는 것이 정답이 되어 버립니다. PyTorch의 nn.GaussianNLLLoss가 바로 이 식이고, 예측과 함께 불확실성을 내는 회귀 모델이 이렇게 학습합니다.

사전분포와 정규화 항

MAP 추정

최대가능도는 데이터만 봅니다. 그런데 우리는 데이터를 보기 전에도 파라미터에 대해 아는 것이 있을 때가 많습니다 — 신경망 가중치가 수천이 될 리는 없다는 식입니다. 이 믿음을 분포로 적은 것이 사전분포 p(θ)p(\theta) 이고, 베이즈 정리에 따라 데이터를 본 뒤의 믿음은 가능도와 사전분포의 곱에 비례합니다.

p(θ∣데이터)∝p(데이터∣θ) p(θ)p(\theta \mid \text{데이터}) \propto p(\text{데이터} \mid \theta)\, p(\theta)

이 곱을 최대로 만드는 θ\theta 를 고르는 것이 MAP 추정(maximum a posteriori)입니다. 로그를 씌우면 곱이 합이 되어

θ^MAP=arg⁡max⁡θ[ℓ(θ)+log⁡p(θ)]\hat{\theta}_{\text{MAP}} = \arg\max_\theta \Big[\ell(\theta) + \log p(\theta)\Big]

로, 로그가능도 옆에 항이 하나 더 붙은 모양이 됩니다. 사전분포가 평평하면 그 항이 상수라 버려지고 최대가능도로 돌아갑니다.

L2와 L1 정규화

가중치 ww 에 평균 0, 분산 τ2\tau^2 인 정규 사전분포를 두면 로그 사전분포는

log⁡p(w)=−∥w∥22τ2+상수\log p(w) = -\frac{\lVert w \rVert^2}{2\tau^2} + \text{상수}

입니다. 부호를 뒤집어 손실로 쓰면 MSE 옆에 ∥w∥2/2τ2\lVert w \rVert^2 / 2\tau^2 이 붙습니다. 가중치의 제곱합에 벌을 주는 이것이 L2 정규화, 흔히 가중치 감쇠라 부르는 그 항입니다. 오차 분산 σ2\sigma^2 까지 챙겨 제곱합 꼴로 맞추면 정규화 세기가 λ=σ2/τ2\lambda = \sigma^2 / \tau^2 로 나옵니다. 사전분포를 라플라스로 바꾸면 같은 계산에서 ∥w∥1/b\lVert w \rVert_1 / b 가 떨어져 나와 L1 정규화가 됩니다. 라플라스가 0에서 뾰족하므로 L1은 작은 가중치를 정확히 0으로 밀어붙이는 경향이 있습니다.

그래서 「정규화를 얼마나 줄까」라는 튜닝 질문은 「가중치가 0 근처에 얼마나 좁게 모여 있다고 믿을까」라는 질문으로 바뀝니다. τ\tau 가 작을수록 믿음이 강하고 λ\lambda 가 커집니다. 앞의 자료로 수를 넣어 봅시다. 오차 표준편차를 σ=2\sigma = 2 로 알고 평균 μ\mu 에 N(0,1)\mathcal{N}(0, 1) 사전분포를 두면

μ^MAP=∑ixin+σ2/τ2=408+4≈3.33\hat{\mu}_{\text{MAP}} = \frac{\sum_i x_i}{n + \sigma^2/\tau^2} = \frac{40}{8 + 4} \approx 3.33

입니다. 최대가능도의 5가 사전분포의 중심 0 쪽으로 당겨졌습니다. 분모의 4가 사전분포가 가상의 표본 네 개 몫의 발언권을 가진다는 뜻으로 읽힙니다.

표본 수와 사전의 몫

같은 자료를 열 번 되풀이한 80개로 다시 계산하면 400/84≈4.76400/84 \approx 4.76, 백 번 되풀이한 800개면 4000/804≈4.984000/804 \approx 4.98 입니다. 분모의 4는 그대로인데 nn 이 커지니 사전분포의 몫이 상대적으로 작아지고, MAP이 최대가능도의 5로 다가갑니다.

표본 수가 늘면 MAP 추정이 최대가능도로 다가간다

로그가능도는 표본마다의 합이라 nn 에 비례해 커지지만, 사전분포 항은 표본 수와 무관하게 하나뿐이기 때문입니다. 데이터가 적을 때는 믿음이 답을 붙잡아 과적합을 막고, 데이터가 많아지면 데이터가 말하게 둡니다. 대형 언어 모델에서도 가중치 감쇠를 쓰지만 수조 토큰 앞에서 그 몫은 작고, 표본이 수백 개인 문제에서 정규화가 결과를 크게 가르는 까닭이 이 비율에 있습니다.

코드로 확인하기

가능도와 손실

import numpy as np

# ① 베르누이 — 10번에 7번 앞면
k, n = 7, 10
theta = np.linspace(0.001, 0.999, 999)
loglik = k * np.log(theta) + (n - k) * np.log(1 - theta)
print(theta[loglik.argmax()].round(3))          # 0.7   손계산과 같다
print(0.5 ** 2000, 2000 * np.log(0.5))          # 0.0 -1386.29...

# ② 정규분포 — 격자로 훑어도 같은 자리
x = np.array([2, 4, 4, 4, 5, 5, 7, 9], dtype=float)
mu = np.linspace(3, 7, 401)[:, None]
sig = np.linspace(0.5, 4, 351)[None, :]
ll = -len(x) * np.log(sig) - len(x) / 2 * np.log(2 * np.pi) \
     - ((x[:, None, None] - mu) ** 2).sum(0) / (2 * sig ** 2)
i, j = np.unravel_index(ll.argmax(), ll.shape)
print(mu[i, 0].round(3), sig[0, j].round(3))    # 5.0 2.0
print(x.mean(), x.std())                        # 5.0 2.0   닫힌 꼴과 일치

# ③ 음의 로그가능도가 곧 교차엔트로피
q = np.array([[0.7, 0.2, 0.1],
              [0.1, 0.8, 0.1],
              [0.3, 0.3, 0.4]])
y = np.array([0, 1, 2])
nll = -np.log(q[np.arange(3), y]).mean()
print(nll.round(4))                             # 0.4987
print((-(np.eye(3)[y] * np.log(q)).sum(1)).mean().round(4))   # 0.4987

세 번째가 이 글의 결론을 코드로 적은 것입니다. 「정답 자리의 확률에 −log⁡-\log 를 씌워 평균」한 값과 「원-핫 정답과 모델 분포의 교차엔트로피」가 같은 수입니다. 첫 번째 블록에 한 줄 더한 것은 언더플로 확인입니다 — 곱은 0.0으로 무너지고 로그의 합은 멀쩡합니다.

중앙값과 MAP

g = np.linspace(0, 12, 12001)                   # μ 후보 격자
xo = np.append(x, 45)                           # 이상치 하나를 더한 아홉 개
sq = ((xo[:, None] - g) ** 2).sum(0)            # 정규 → 제곱합
ab = np.abs(xo[:, None] - g).sum(0)             # 라플라스 → 절댓값 합
print(g[sq.argmin()].round(2), g[ab.argmin()])  # 9.44 5.0

# σ=2 정규 가능도 + N(0, 1) 사전분포 = MSE + L2
obj = ((x[:, None] - g) ** 2).sum(0) / (2 * 4) + g ** 2 / 2
print(g[obj.argmin()], x.sum() / (8 + 4))       # 3.333 3.3333333333333335

격자를 훑어 얻은 답이 앞에서 손으로 구한 값과 같습니다. 제곱합의 꼭짓점은 이상치에 끌려간 평균 9.44이고, 절댓값 합의 꼭짓점은 중앙값 5입니다. 아래 두 줄은 가능도에 L2 벌점을 더한 목적함수의 최솟값이 MAP의 닫힌 꼴 40/1240/12 와 같은 자리에 선다는 것을 보여 줍니다. 정규화를 넣은 최대화와 사전분포를 둔 MAP이 이름만 다른 한 계산입니다.

정리

요점

  • 확률과 가능도는 같은 식을 다른 방향으로 읽은 것이다. 가능도는 확률이 아니고, 절대값보다 두 θ\theta 사이의 비가 뜻을 가진다.
  • i.i.d. 가정이 곱을 만들고 로그가 그것을 합으로 바꾼다. 언더플로가 사라지고, 미니배치 평균이 전체의 불편 추정이 된다.
  • 로그는 최댓값의 자리를 바꾸지 않는다. 바뀌는 것은 값이다.
  • 정규분포의 μ^\hat{\mu} 는 σ\sigma 와 무관하고, σ^2\hat{\sigma}^2 은 참값을 n−1n\frac{n-1}{n} 배만큼 낮잡는다.
  • 가정이 틀리면 최대가능도는 정방향 KL로 가장 가까운 모델을 고르고, 그래서 데이터를 넓게 덮는다.
  • 정규는 MSE, 라플라스는 L1, 베르누이는 이진 교차엔트로피, 범주는 교차엔트로피, 포아송은 포아송 손실이 된다.
  • 사전분포를 곱하면 MAP이 되고, 정규 사전분포는 L2, 라플라스 사전분포는 L1 정규화다. 표본이 많아지면 MAP은 최대가능도로 간다.

손실 고르기

nn.MSELoss()와 nn.CrossEntropyLoss()로 돌아가 봅시다. 이 짝은 규칙이 아니라 가정의 그림자였습니다. 같은 라이브러리에 nn.L1Loss·nn.BCELoss·nn.PoissonNLLLoss·nn.GaussianNLLLoss가 나란히 있는 것도 이제 목록이 아니라 표 한 장으로 읽힙니다 — 각각이 라플라스·베르누이·포아송·이분산 정규를 가정한 음의 로그가능도입니다. 옵티마이저의 weight_decay 인자는 그 옆에 정규 사전분포를 하나 곱한 것입니다. 손실함수를 고르는 일은 사실 「데이터가 어떤 분포에서 나왔다고 볼 것인가」를 고르는 일이고, 그렇게 보면 새 손실을 설계하는 일도 규칙을 외우는 문제가 아니라 분포를 고르는 문제가 됩니다.

다음 글은 이 유도의 마지막 한 칸을 채웁니다. 여기서 나온 음의 로그가능도가 왜 「교차엔트로피」라는 이름으로도 불리는지, 원-핫 정답에서 어떻게 항 하나로 줄어드는지, 그리고 라벨 스무딩이 그 식의 어느 자리를 건드리는 조작인지까지입니다.


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

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