배치를 4배로 키웠는데 그래디언트 잡음은 절반만 줄어듭니다. 분산·표준편차·공분산을 세우고 독립 합의 가법성에서 표본평균의 분산 σ²/n을 유도해, 배치 크기와 평가 점수의 흔들림이 모두 √n 하나에 달려 있음을 봅니다.
PALDYN Team//30 MIN READ
21MATH
중급
분산 · 표준오차
배치 크기를 32에서 128로 올렸다고 합시다. 표본을 네 배로 늘렸으니 그래디언트의 잡음도 네 배쯤 줄어들 것 같은데, 실제로 재 보면 절반밖에 안 줄어듭니다. GPU 메모리와 시간은 정직하게 네 배를 썼는데 말입니다.
평가 쪽에도 같은 수가 나옵니다. 벤치마크 문제를 200개에서 800개로 늘리면 점수의 흔들림이 4분의 1이 아니라 2분의 1이 됩니다.
왜 네 배가 두 배가 되는가 — 이 글은 그 «2»가 어디서 오는지를 끝까지 따라갑니다. 답은 n 하나이고, 그 뿌리는 분산이 어떻게 더해지는가에 있습니다.
지난 글에서 미니배치 평균이 진짜 손실의 추정값이라는 데까지 왔습니다. 남은 질문은 그 추정값이 얼마나 흔들리는가였습니다.
분산과 공분산
분산과 표준편차
기댓값은 중심을 하나의 수로 말해 줍니다. 하지만 중심이 같아도 퍼진 정도는 완전히 다를 수 있습니다.
정의. 확률변수 X 의 분산은 Var(X)=E[(X−μ)2] 이다. 여기서 μ=E[X] 이다.
편차 X−μ 를 그냥 평균 내면 정확히 0이 되므로 — 선형성으로 E[X−μ]=μ−μ=0 입니다 — 부호를 없애야 합니다. 제곱이 그 일을 합니다. 절댓값을 씌워도 부호는 없어지지만 제곱을 고른 데는 이유가 있습니다. 절댓값은 0에서 꺾여 미분이 안 되고, 무엇보다 아래에서 볼 가법성이 제곱에서만 깔끔하게 나옵니다.
실제 계산에는 정의보다 다음 꼴이 편합니다.
Var(X)=E[X2]−(E[X])2
유도는 제곱을 펴고 선형성을 쓰는 것뿐입니다. E[(X−μ)2]=E[X2−2μX+μ2]=E[X2]−2μE[X]+μ2=E[X2]−μ2 입니다.
지난 글의 예가 이미 이 값을 갖고 있었습니다. X 가 1, 2, 3을 각각 0.5, 0.3, 0.2로 가질 때 E[X]=1.7, E[X2]=3.5 였으므로
Var(X)=3.5−1.72=3.5−2.89=0.61
입니다. LOTUS로 구한 두 값의 차이가 곧 분산이었습니다.
분산은 제곱된 단위를 갖습니다. 손실이 «점»이면 분산은 «점²»이라 손실과 나란히 놓을 수 없습니다. 그래서 제곱근을 씌운 표준편차σ=Var(X) 를 함께 씁니다 — 위 예에서는 0.61=0.781 이고, 이 값은 «점» 단위라 평균 1.7 옆에 그대로 적을 수 있습니다.
정의에서 곧바로 읽히는 것이 둘 있습니다. 제곱의 평균이므로 분산은 절대 음수가 될 수 없고, 분산이 정확히 0이라는 것은 모든 편차가 0이라는 뜻이라 그 확률변수가 사실은 상수라는 말입니다. «흔들리지 않는다»와 «값이 하나뿐이다»가 같은 말이 되는 자리입니다.
공분산
변수가 둘이면 각자의 퍼짐 말고 함께 움직이는 정도가 생깁니다.
Cov(X,Y)=E[(X−μX)(Y−μY)]=E[XY]−E[X]E[Y]
이것이 공분산입니다. X 가 평균보다 클 때 Y 도 평균보다 크는 일이 잦으면 곱이 자주 양수라 공분산이 양수입니다. 반대로 움직이면 음수, 아무 관계가 없으면 0 근처입니다. Cov(X,X) 는 정의를 그대로 읽으면 Var(X) 입니다 — 분산은 자기 자신과의 공분산입니다.
독립이면 E[XY]=E[X]E[Y] 이므로 공분산이 0입니다. 거꾸로는 성립하지 않습니다 — 공분산이 0인데 독립이 아닌 예가 있습니다. 가장 쉬운 예가 X 를 −1,0,1 에서 고르고 Y=X2 으로 두는 것입니다. Y 는 X 로 완전히 정해지므로 독립일 리가 없는데, 대칭 때문에 E[XY]=E[X3]=0 이고 E[X]=0 이라 공분산이 0입니다. 공분산이 잡아내는 것은 «함께 늘고 주는» 직선 방향의 관계뿐이라, 곡선 모양의 의존은 못 봅니다.
한 가지를 미리 봐 둡니다. 공분산은 눈금을 바꾸면 값이 따라 바뀝니다 — 정의를 펴 보면 Cov(aX,bY)=abCov(X,Y) 입니다. 관계의 세기는 그대로인데 재는 단위를 바꿨다는 이유만으로 수가 커지거나 작아진다는 뜻이고, 다음 소절이 이 흠을 고칩니다.
상관계수
공분산에는 쓰기 불편한 점이 하나 있습니다. 단위가 두 변수의 단위를 곱한 것이라 값의 크기만 보고는 관계가 센지 약한지를 읽을 수 없습니다. 키와 몸무게의 공분산이 30이라고 할 때, 키를 센티미터로 쟀는지 미터로 쟀는지에 따라 그 수가 100배씩 달라집니다.
그래서 각자의 표준편차로 나눠 단위를 없앱니다.
ρ(X,Y)=σXσYCov(X,Y)
이것이 상관계수입니다. 이 값은 언제나 −1 과 1 사이에 있는데, 그 근거가 코시-슈바르츠 부등식입니다. 공분산이 내적 노릇을 하고 표준편차가 노름 노릇을 하므로 ∣Cov∣≤σXσY 가 그대로 성립하고, ρ 는 그 두 «벡터» 사이의 코사인에 해당합니다.
ρ=1 은 Y 가 X 의 증가하는 일차식으로 완전히 정해진다는 뜻이고 ρ=−1 은 감소하는 일차식입니다. 코사인 유사도가 방향만 보고 크기를 버리는 것처럼, 상관계수도 함께 움직이는 방향만 보고 폭은 버립니다.
한 가지 주의는 그대로 물려받습니다. 상관계수가 0이라고 두 변수가 독립인 것은 아닙니다 — ρ 는 공분산을 나눠 놓은 값일 뿐이라 위의 Y=X2 같은 예에서 여전히 0입니다. «상관이 없다»는 말은 «직선 관계가 없다»는 말이지 «아무 관계가 없다»는 말이 아닙니다.
분산의 가법성
상수는 제곱되어 나온다
Var(aX)=a2Var(X)
기댓값에서는 E[aX]=aE[X] 로 상수가 그대로 나왔는데, 분산의 정의에 제곱이 들어 있으니 상수도 제곱되어 나옵니다. 그리고 상수를 더하는 것은 분산을 전혀 바꾸지 않습니다 — Var(X+c)=Var(X) 입니다. 통째로 옮겨 놓아도 퍼진 정도는 그대로이기 때문입니다.
표준편차로 옮기면 제곱이 풀려 sd(aX)=∣a∣σX 입니다. 값을 두 배로 키우면 표준편차도 두 배입니다.
독립이면 더해진다
Var(X+Y)=Var(X)+Var(Y)+2Cov(X,Y)
유도는 (X−μX)+(Y−μY) 를 제곱해 기댓값을 취하는 것뿐입니다. 가운데 교차항이 두 번 나와 2Cov 가 됩니다.
X 와 Y 가 독립이면 공분산 항이 사라집니다.
Var(X+Y)=Var(X)+Var(Y)(독립일때)
이것을 분산의 가법성이라고 합니다. 지난 글의 기댓값 선형성과 비교하면 차이가 분명합니다 — 기댓값은 언제나 더해지지만 분산은 독립일 때만 더해집니다.
빼는 쪽도 눈여겨볼 만합니다. Var(X−Y)=Var(X)+Var(Y) 로 독립일 때는 뺄셈에서도 분산이 더해집니다. −Y 의 상수 −1 이 제곱되어 +1 이 되기 때문입니다. 두 측정값의 차를 보면 잡음이 줄어들 것 같지만 실제로는 늘어난다는 뜻이고, 두 모델의 점수 차를 비교할 때 오차막대가 각각보다 넓어지는 것이 이 때문입니다.
독립이 아니면
교차항을 살려 두면 무슨 일이 생기는지가 실무에서 더 중요합니다. 표본 X1,…,Xn 이 서로 조금씩 상관되어 있다고 하고, 편의를 위해 모든 쌍의 상관계수가 같은 ρ 라고 둡니다. 그러면 Cov(Xi,Xj)=ρσ2 이고 쌍의 개수가 n(n−1)/2 이므로
Var(Xˉ)=n21[nσ2+2⋅2n(n−1)ρσ2]=σ2[n1+ρnn−1]
가 됩니다. 첫 항은 익숙한 σ2/n 이고 둘째 항이 새로 붙은 것입니다. n 을 아무리 키워도 둘째 항은 ρσ2 로 남습니다. σ2=4, ρ=0.1 로 계산해 봅니다.
n
독립일 때
ρ=0.1 일 때
32
0.125
0.513
128
0.031
0.428
512
0.008
0.407
한없이 크게
0
0.400
상관이 0.1밖에 안 되는데도 바닥이 생깁니다. 표본을 512개로 늘려도 분산이 0.4 아래로 안 내려가고, 독립이었다면 얻었을 0.008과는 쉰 배 차이입니다. 표본을 더 뽑는 데 쓴 돈이 거의 전부 낭비된 셈입니다.
미니배치가 이렇게 되는 경로는 여럿입니다. 정렬된 데이터에서 앞에서부터 잘라 담으면 한 배치가 비슷한 것들로만 차고, 한 문서를 여러 조각으로 나눠 같은 배치에 넣어도 그렇습니다. 데이터를 섞는 일이 예의가 아니라 분산 계산의 전제를 지키는 일인 것이 여기서 나옵니다.
표준오차와 대수의 법칙
표본평균의 분산
이제 미니배치입니다. 같은 분포에서 서로 독립으로 뽑은 X1,…,Xn 의 평균
Xˉ=n1∑i=1nXi
의 분산을 구합니다. 위의 두 줄을 순서대로 쓰면 됩니다.
Var(Xˉ)=Var(n1∑Xi)=n21Var(∑Xi)=n21⋅nσ2=nσ2
두 번째 등호가 «상수는 제곱되어 나온다», 세 번째가 «독립이면 더해진다»입니다. 1/n 이 제곱되어 1/n2 이 되는데 더해지는 항이 n 개뿐이라, 둘이 상쇄되고 1/n 하나만 남습니다.
표준오차
표준편차로 바꾸면
sd(Xˉ)=nσ
이 값을 표준오차라고 부릅니다 — 데이터 자체의 퍼짐 σ 와 구별하려고 다른 이름을 붙인 것입니다. 표준편차는 «한 표본이 평균에서 얼마나 벗어나는가»이고, 표준오차는 «표본평균이 참값에서 얼마나 벗어나는가»입니다. 앞엣것은 n 을 키워도 안 줄어들고 뒤엣것만 줄어듭니다.
분모의 제곱근이 처음 질문의 답입니다. n 을 네 배로 늘리면 n 은 두 배가 되므로 흔들림은 절반이 됩니다. 네 배의 계산을 사서 두 배의 정밀도를 얻는 거래이고, 이 거래의 환율은 바꿀 수 없습니다.
숫자로 확인합니다. σ=2.0 일 때
n
32
128
512
2048
표준오차
0.354
0.177
0.088
0.044
배치를 64배로 키워야 잡음이 8분의 1이 됩니다.
import numpy as nprng = np.random.default_rng(1)for n in [4, 32, 256]: means = [rng.normal(1.8, 2.0, n).mean() for _ in range(20000)] print(n, round(float(np.std(means)), 4), round(2.0 / np.sqrt(n), 4))# 4 0.9893 1.0# 32 0.3561 0.3536# 256 0.1253 0.125
왼쪽이 실제로 재 본 표본평균의 표준편차, 오른쪽이 공식이 말한 σ/n 입니다. 두 열이 소수 둘째 자리까지 맞고, 남은 차이는 20000번이라는 이 실험 자체의 표본오차입니다 — 재는 행위에도 같은 n 이 걸려 있습니다.
대수의 법칙
Var(Xˉ)=σ2/n 은 n→∞ 일 때 0으로 갑니다. 즉 표본평균이 참평균 주위로 점점 오그라듭니다. 이것을 대수의 법칙이라고 하고, 미니배치 학습이 굴러가는 이유가 이 한 줄입니다.
조금 더 정확히 적을 수도 있습니다. 체비쇼프 부등식 — 어떤 분포에서든 «평균에서 ε 이상 벗어날 확률은 분산을 ε2 으로 나눈 값 이하»라는 결과 — 을 Xˉ 에 쓰면
P(∣Xˉ−μ∣≥ε)≤nε2σ2
이고, 오른쪽이 n 에 반비례해 0으로 갑니다. 어떤 분포든 상관없습니다 — 정규분포일 필요도, 대칭일 필요도 없습니다.
다만 «간다»와 «얼마나 빨리 가는가»는 다른 이야기이고, 위 부등식은 아주 헐거운 상한입니다. σ=2, n=100, ε=0.4 를 넣으면 오른쪽이 4/(100×0.16)=0.25 인데, 실제 정규분포에서 그 확률은 0.05 아래입니다. 다섯 배 넘게 헐겁습니다. 그 자리를 정확히 채우는 것이 다음 글의 중심극한정리입니다.
표본분산의 n − 1
편차 제곱합이 작아지는 까닭
σ2 도 보통은 모릅니다. 데이터에서 추정해야 하는데, 여기서 익숙한 이물질이 하나 나옵니다.
s2=n−11∑i=1n(xi−xˉ)2
분모가 n 이 아니라 n−1 입니다. 이유는 xˉ 가 데이터에서 만들어진 값이라는 데 있습니다. 제곱합 ∑(xi−c)2 을 c 에 대해 미분해 0으로 두면 c=xˉ 가 나오므로, xˉ 는 이 제곱합을 가장 작게 만드는 점입니다. 참평균 μ 를 넣었을 때보다 반드시 더 작거나 같은 값이 나옵니다.
얼마나 작아지는지도 정확히 계산됩니다. ∑(xi−xˉ)2 의 기댓값이 nσ2 이 아니라 (n−1)σ2 입니다. 그러니 n 으로 나누면 평균적으로 (n−1)/n 배만큼 낮잡고, n−1 로 나누면 딱 σ2 이 됩니다.
n−1 이라는 수 자체에도 읽는 법이 있습니다. 데이터 n 개에서 xˉ 를 하나 만들어 썼으므로, 편차 xi−xˉ 들은 합이 반드시 0이라는 제약을 하나 지고 있습니다. n−1 개를 알면 나머지 하나가 저절로 정해진다는 뜻이고, 그래서 자유롭게 움직일 수 있는 편차가 n−1 개입니다. 이 개수를 자유도라고 부릅니다.
불편추정량
이렇게 평균적으로 참값을 맞히는 추정량을 지난 글에서 불편추정량이라 불렀습니다. s2 이 그것입니다.
n=5 에서 n 으로 나눈 쪽은 평균 3.19로 참값 4.0을 20% 낮잡습니다. 정확히 (n−1)/n=0.8 배입니다. numpy의 var가 기본값 ddof=0이고 pandas의 std가 기본값 ddof=1이라 같은 데이터에서 다른 수가 나오는 것도 이 차이입니다.
한 가지 단서가 있습니다. s2 은 σ2 의 불편추정량이지만 s 는 σ 의 불편추정량이 아닙니다. 제곱근이 직선 함수가 아니라서 기댓값이 제곱근 안으로 들어가지 못하기 때문입니다. s 는 σ 를 조금 낮잡는데, n 이 웬만큼 크면 그 차이가 작아 실무에서는 대개 그냥 씁니다.
배치 크기와 오차막대
학습
미니배치 그래디언트는 진짜 그래디언트의 불편추정량이고, 그 잡음의 크기는 성분마다 σ/B 입니다. 배치를 키우면 잡음이 줄지만 B 로만 줍니다. 그래서 배치를 두 배로 키웠을 때 학습률을 어떻게 조정할지가 자명하지 않고, 그 자리는 「중급 49번 · 그래디언트 잡음이 정하는 것: 배치 크기, 선형 스케일링, 워밍업, 코사인 감쇠」가 맡습니다.
여기에 한 겹이 더 있습니다. 같은 데이터를 한 바퀴 도는 동안 배치를 네 배로 키우면 스텝 수는 4분의 1로 줄어듭니다. 스텝마다 잡음은 절반으로 줄었는데 밟는 횟수가 4분의 1이 된 것이라, «배치를 키우면 학습이 좋아진다»는 말이 어느 쪽 계산인지를 밝히지 않으면 성립하지 않습니다. 한 스텝당 정밀도로 보면 이득이고 한 에폭당 진도로 보면 손해입니다. 이 둘을 맞바꾸는 환율이 곧 학습률이고, 그래서 배치를 바꾸면 학습률도 같이 손봐야 합니다.
평가
정답률은 비율이라 이항분포에서 나옵니다. 문제 n 개, 참 정답률 p 일 때 측정된 정답률의 표준오차는
np(1−p)
입니다. 한 문제를 맞히면 1, 틀리면 0인 변수의 분산이 p(1−p) 이고 그것을 n 으로 나눈 것이라, 위에서 유도한 σ2/n 이 그대로 적용된 꼴입니다.
p=0.7, n=200 이면 0.21/200=0.0324 — 3.2%p입니다. 두 모델의 점수가 5%p 차이 난다고 이겼다고 말할 수 없다는 뜻입니다. 게다가 두 모델의 차를 보는 것이라 위의 뺄셈 규칙이 걸려 차의 표준오차는 각각보다 더 넓습니다. n 을 1000으로 늘리면 1.45%p로 줄지만 여전히 5 배만 좋아졌습니다. 오차막대를 실제로 그리는 법은 「중급 74번 · 추정량과 표준오차: eval 점수에 오차막대 붙이기」의 몫입니다.
어텐션
「중급 40번 · √d_k는 어디서 나왔나: 내적의 분산 계산」에서도 같은 도구가 쓰입니다. 독립인 성분들의 곱을 dk 개 더하면 분산이 dk 배가 되고, 표준편차는 dk 배가 됩니다 — 그래서 그 수로 나눕니다. 이 글의 «독립이면 분산이 더해진다»가 그대로 재활용됩니다.
연습 문제
연습 1 — 손으로 재는 분산과 공분산
여덟 개의 값 2,4,4,4,5,5,7,9 의 평균과 분산과 표준편차를 구하세요. 분산은 n 으로 나누는 쪽으로 계산합니다.
n=4 인 표본의 편차 제곱합이 12일 때 n 으로 나눈 값과 n−1 로 나눈 값을 각각 구하고, 앞엣것이 뒤엣것의 몇 배인지 답하세요.
12/4=3 이고 12/3=4 입니다. 앞엣것이 뒤엣것의 3/4=0.75 배이고, 이 값이 정확히 (n−1)/n 입니다.
정리
분산은 편차 제곱의 기댓값이고 계산은 E[X2]−(E[X])2 이 편하다. 단위를 맞추려면 제곱근을 씌워 표준편차로 본다.
공분산은 함께 움직이는 정도이고 Cov(X,X)=Var(X) 다. 독립이면 0이지만 0이라고 독립은 아니다.
공분산은 단위가 붙어 크기를 못 읽으므로 표준편차로 나눈 상관계수ρ=Cov/(σXσY) 를 쓴다. 코시-슈바르츠에 의해 [−1,1] 에 갇히고, 두 «벡터» 사이의 코사인에 해당한다.
상수는 제곱되어 나오고(Var(aX)=a2Var(X)), 독립이면 분산이 더해진다. 기댓값과 달리 여기에는 독립이 필요하다. 뺄셈에서도 더해진다는 점이 중요하다.
독립이 아니면 2Cov 항이 남는다. 모든 쌍의 상관이 ρ 면 Var(Xˉ)=σ2[1/n+ρ(n−1)/n] 이라 n 을 키워도 ρσ2 이라는 바닥이 남는다.
표본평균의 분산은 σ2/n, 표준오차는 σ/n 이다. 네 배의 표본이 두 배의 정밀도를 산다.
대수의 법칙은 그 분산이 0으로 간다는 말이고, 체비쇼프 부등식으로 분포 가정 없이 나온다. 다만 그 상한은 아주 헐겁다.
표본분산의 n−1 은 xˉ 가 데이터에서 만들어진 값이기 때문이다. n 으로 나누면 (n−1)/n 배만큼 낮잡고, n−1 은 자유롭게 움직일 수 있는 편차의 개수 — 자유도다.
배치 크기, 평가 오차막대, 어텐션의 dk 가 전부 한 식에서 나왔습니다. 그런데 아직 «흔들림의 크기»만 말했지 «어떤 모양으로 흔들리는가»는 말하지 않았습니다. 다음 글은 그 모양이 표본이 커지면 언제나 같은 종 모양으로 수렴한다는 것 — 중심극한정리를 다룹니다.
실수를 2^b개 격자에 사상할 때 오차의 분산이 왜 Δ²/12인지 유도하고, 그것이 비트당 6.02dB라는 SNR로 번역되는 과정을 실측과 대조했습니다. 이상치 하나가 나머지 값의 유효 비트를 어떻게 먹는지, 그리고 int4에서 성능이 무너지는 지점을 오차 예산으로 미리 계산하는 법까지.
최댓값 빼기, 로그 공간, log1p·expm1, 분산의 두 공식, 정규화의 ε, fp32 누산, 역행렬 대신 solve — 프레임워크가 몰래 해 주는 일곱 가지를 하나씩 꺼내 각각 어떤 고장을 막는지 직접 재 봤습니다. 수식을 그대로 옮긴 코드가 왜 라이브러리보다 나쁜지에 대한 목록입니다.
0.1 + 0.2가 0.3이 아닌 이유부터 시작해 머신 엡실론을 유도하고, 같은 16비트인데 fp16과 bf16이 서로 다른 지점에서 터지는 이유, 비슷한 수를 뺄 때 유효자리가 사라지는 파괴적 상쇄, 그리고 1,000만 개를 순서만 바꿔 더했을 때 오차가 백만 배 갈리는 실험까지 직접 재 봤습니다.