논문에 적힌 학습 목표는 거의 언제나 이 모양입니다.
그런데 코드에서 같은 자리를 찾아가면 loss.mean() 한 줄입니다. 드롭아웃도 마찬가지입니다 — 구현은 마스크를 곱하고 로 나누는 두 줄인데, 왜 하필 그 수로 나누는지는 코드에 안 적혀 있습니다.
라는 기호와 .mean() 사이에 무엇이 있는가 — 이 글이 그 사이를 채웁니다. 지난 글에서 사건에 확률을 붙이는 데까지 왔으니, 이제 결과에 수를 붙이고 그 수의 평균을 낼 차례입니다.
확률변수 — 결과에 수를 붙이는 함수
표본공간의 결과는 꼭 수가 아닙니다. 토큰 cat, 뉴런이 «살아남음», 동전의 앞면은 전부 수가 아닙니다. 평균을 내려면 먼저 수여야 합니다.
정의. 확률변수는 표본공간의 각 결과에 실수 하나를 붙이는 함수 이다.
이름이 «변수»지만 실제로는 함수입니다. 확률변수 자체에는 무작위성이 없고, 무작위한 것은 어떤 결과가 뽑히느냐입니다. 뽑힌 결과에 붙는 수는 그때 결정됩니다.
같은 표기는 « 가 1이라는 값을 갖는 결과들의 집합», 즉 사건을 가리키는 줄임말입니다. 그래서 이 말이 됩니다 — 지난 글에서 사건에 확률을 붙였고, 여기서는 그 사건을 로 지목했을 뿐입니다.
pmf, cdf, 그리고 밀도가 1을 넘는 이야기
값이 셀 수 있게 떨어져 있으면 이산확률변수이고, 값마다 확률을 적은 함수를 확률질량함수(pmf)라고 합니다.
값이 연속이면 사정이 달라집니다. 실수 하나가 정확히 나올 확률은 0이므로 — 후보가 무한히 많아 각각에 양수를 주면 합이 발산합니다 — 점이 아니라 구간에 확률을 줍니다. 그 역할을 하는 것이 확률밀도함수(pdf)입니다.
여기서 자주 걸리는 자리가 하나 있습니다. 밀도는 1을 넘어도 됩니다. 확률인 것은 높이가 아니라 넓이이기 때문입니다. 위에 고르게 퍼진 분포라면 밀도가 여야 넓이 이 됩니다.
| pmf | ||
|---|---|---|
| 값의 성질 | 떨어져 있음 | 이어져 있음 |
| 또는 | 그 값이 나올 확률 | 확률이 아니다. 넓이의 밀도 |
| 1을 넘을 수 있나 | 아니오 | 예 |
| 전체를 1로 만드는 것 | 합 | 적분 |
둘을 한 언어로 묶는 것이 누적분포함수(cdf)입니다.
이산이든 연속이든 정의가 같고, 0에서 1까지 결코 내려가지 않으며 올라갑니다. 이산이면 계단 모양이고 연속이면 매끄러운 곡선이지만, 「이 값 이하가 나올 확률」이라는 뜻은 하나입니다. 「중급 25번 · 범주분포에서 뽑기」의 역변환 표집이 이 함수의 역함수를 쓰는 방법입니다.
연속에서 한 가지가 따라옵니다. 이므로 부등호에 등호가 붙든 말든 값이 같습니다 — 입니다. 이산에서는 그 자리에 막대 하나만큼의 차이가 생기므로 같지 않습니다.
세 분포와 그 자리
이 글에서 필요한 이산분포는 셋뿐이고, 셋 다 AI 코드에 이름 없이 들어 있습니다.
베르누이 분포. 값이 0 또는 1 하나입니다. , .
드롭아웃 마스크가 정확히 이것입니다. 뉴런마다 베르누이 확률변수를 하나씩 뽑아 1이면 살리고 0이면 죽입니다.
범주형 분포. 값이 개 중 하나이고 각각에 확률 가 붙습니다. 합이 1이어야 합니다.
softmax의 출력이 이 분포의 파라미터이고, 토큰을 뽑는다는 것은 어휘 크기 짜리 범주형 분포에서 한 번 뽑는 것입니다. 이면 베르누이가 됩니다.
이항 분포. 같은 베르누이를 서로 독립으로 번 반복해 1이 나온 횟수를 센 것입니다.
는 자리 중 1이 놓일 자리를 고르는 경우의 수이고, 뒤의 곱은 그중 한 배치가 나올 확률입니다 — 독립이라 곱셈 규칙을 번 쓸 수 있습니다.
벤치마크 문제 10개를 정답률 0.3인 모델에 냈을 때 맞힌 개수가 이 분포를 따릅니다. 값을 몇 개 계산해 보면
입니다. 3개를 맞히는 것이 가장 흔하지만 그 확률조차 0.267뿐이고, 같은 모델로 같은 문제를 다시 풀려도 2개나 5개가 나오는 일이 흔합니다. 평가 점수가 실행마다 흔들리는 이유의 절반이 여기에 있습니다.
셋의 관계도 정리해 둘 만합니다. 베르누이는 인 범주형이고, 이항은 베르누이를 독립으로 번 반복해 센 것입니다. 뿌리는 하나입니다.
기댓값 — 값을 확률로 가중한 평균
정의. 이산확률변수의 기댓값은 이고, 연속이면 합이 적분이 된다:
«값 × 그 값이 나올 확률»을 전부 더한 것입니다. 앞의 이항분포에서 계산해 봅니다.
일반적으로 이항분포의 기댓값은 이고 여기서는 입니다. 기댓값은 실제로 나올 수 있는 값일 필요가 없습니다 — 문제 10개 중 3.5개를 맞힐 수는 없지만 이면 기댓값은 3.5입니다.
물리적으로 보면 기댓값은 무게중심입니다. pmf의 막대를 무게로 보고 막대그래프를 자로 떠받칠 때 균형이 잡히는 자리입니다.
선형성 — 이 글에서 가장 많이 쓰이는 성질
두 번째 식에 독립 조건이 없다는 점이 중요합니다. 와 가 아무리 얽혀 있어도 기댓값은 그냥 더해집니다. 증명은 정의를 펴는 것이 전부입니다 — 결합분포 위에서 를 두 덩어리로 갈라 각각 주변화하면 가 됩니다. 주변화가 지난 글의 도구였습니다.
이제 드롭아웃의 를 설명할 수 있습니다. 뉴런의 출력이 이고 마스크 이 확률 로 1이라면, 그냥 곱한 출력의 기댓값은
라서 학습 때만 신호가 배로 줄어듭니다. 추론에서는 마스크를 안 쓰니 스케일이 어긋나죠. 그래서 학습 때 로 나눠 둡니다.
기댓값을 보존하려고 나누는 것이고, 이것이 인버티드 드롭아웃이라는 이름의 뜻입니다. 첫 등호에서 쓴 것이 선형성입니다.
층 전체로 넓혀도 같습니다. 뉴런 1000개짜리 층에서 살아남는 뉴런의 개수는 베르누이 1000개의 합이므로 이항분포이고, 면 기댓값이 900입니다. 여기서 선형성의 «독립이 필요 없다»가 한 번 더 쓰입니다 — 마스크끼리 상관이 있어도 살아남는 개수의 기댓값은 여전히 입니다. 독립이 필요해지는 것은 개수가 900에서 얼마나 벗어나는지를 물을 때이고, 그 질문이 다음 글의 것입니다.
LOTUS — 변환된 값의 기댓값
의 기댓값이 아니라 의 기댓값이 필요할 때가 훨씬 많습니다. 손실이 그렇습니다 — 뽑는 것은 데이터이고 평균 내는 것은 그 데이터의 손실값입니다.
의 분포를 새로 구한 뒤 정의를 쓰는 것이 정공법인데, 그럴 필요가 없습니다.
의 분포를 그대로 두고 값만 로 바꿔 넣으면 됩니다. 이 결과를 LOTUS(law of the unconscious statistician)라고 부릅니다 — «무의식적 통계학자의 법칙»이라는 이름은 이 계산이 너무 자연스러워서 정당화 없이 쓰게 된다는 뜻입니다.
작은 예로 확인합니다. 가 1, 2, 3을 각각 0.5, 0.3, 0.2로 가질 때
의 분포를 따로 만들지 않았습니다. 그리고 입니다 — 선형성은 가 일차식일 때만 성립합니다. 이 두 값의 차이가 다음 글의 주제인 분산입니다.
손실은 기댓값이다
이제 처음의 식을 읽을 수 있습니다.
두 번째 등호가 LOTUS입니다. 뽑는 것은 데이터 분포 에서의 이고, 평균 내는 값은 그 의 손실 입니다.
문제는 를 모른다는 것입니다. 우리에게 있는 것은 그 분포에서 뽑힌 표본 개뿐이고, 그래서 합을 표본평균으로 대신합니다.
이것이 loss.mean()입니다. 미니배치 손실은 진짜 손실이 아니라 진짜 손실의 추정값이고, 배치를 다시 뽑으면 다른 값이 나옵니다.
그런데도 이 추정값을 써도 되는 근거가 선형성입니다. 표본 를 각각 에서 뽑았다면 하나하나의 기댓값이 전부 이므로
입니다. 평균적으로는 맞는 값을 내놓는다는 뜻이고, 이런 추정량을 불편추정량이라고 합니다. 여기서도 끼리의 독립은 쓰지 않았습니다 — 선형성만으로 충분합니다.
같은 계산이 그래디언트에도 그대로 적용됩니다. 미분은 선형 연산이므로 배치 그래디언트의 기댓값이 진짜 그래디언트이고, 확률적 경사하강법이 «틀린 방향으로 가는데도 도착하는» 이유가 이 한 줄입니다.
import numpy as np
rng = np.random.default_rng(0)
# 진짜 손실이 1.8인 분포에서 배치 32개를 세 번 뽑아 본다
true_mean = 1.8
for _ in range(3):
batch = rng.exponential(true_mean, size=32)
print(round(float(batch.mean()), 3))
# 2.079
# 1.633
# 2.626
세 값이 모두 다르고 셋 다 1.8이 아닙니다. 그런데도 학습이 굴러가는 이유, 그리고 배치를 키우면 이 흔들림이 얼마나 줄어드는지가 다음 글입니다.
정리
- 확률변수는 결과에 수를 붙이는 함수다. 은 « 가 1이 되는 결과들»이라는 사건의 확률이다.
- pmf는 확률이고 pdf는 밀도다. 밀도는 1을 넘어도 된다 — 확률인 것은 높이가 아니라 넓이다.
- 베르누이·범주형·이항이 각각 드롭아웃 마스크, 토큰 샘플링, 벤치마크 정답 개수에 대응한다. 이항의 기댓값은 다.
- 기댓값은 값을 확률로 가중한 평균이고 pmf의 무게중심이다. 실제로 나올 수 있는 값일 필요가 없다.
- 선형성에는 독립이 필요 없다. 인버티드 드롭아웃이 로 나누는 이유가 이 성질로 기댓값을 보존하는 것이다.
- LOTUS는 의 분포를 구하지 말라는 허가증이다. 「손실은 데이터 분포 위의 기댓값」이라는 문장이 이 법칙 덕분에 합 하나로 계산된다.
loss.mean()은 그 기댓값의 추정값이다. 등호가 아니라 근사다.
논문의 와 코드의 .mean()이 이어졌습니다. 하나는 분포 위의 참값이고 다른 하나는 표본으로 만든 추정값이라는 것까지 알았으니, 남은 질문은 하나입니다 — 그 추정값은 얼마나 믿을 만한가. 다음 글이 분산과 표준오차로 답합니다.
읽어주셔서 감사합니다. 😊

