앞 글에서 Chinchilla 논문의 세 접근법을 표로 읽었다. 남은 것 하나가 마음에 걸렸다 — Approach 3이 보고한 신뢰구간의 폭이 0.001이었다. 같은 표의 다른 두 줄은 0.014와 0.072다.
그 좁기를 문제 삼은 논문이 있다. Besiroglu 등의 「Chinchilla Scaling: A replication attempt」(arXiv 2404.10102)는 원논문 그림에서 데이터 점 240개를 복원해 같은 함수를 다시 적합했고, 세 가지 불일치를 제기한다. 이 글은 그 세 가지를 원문에서 확인하고, 검산할 수 있는 것은 직접 검산한 기록이다.
결론부터 적으면 넷이다.
- 재적합 계수는 실제로 학습시킨 Chinchilla를 맞힌다. Gopher 예산에서 B로 실제 70B와 3.2% 차이다. 원논문 Approach 3 계수로 같은 문제를 풀면 40.31B로 42.4% 빗나간다.
- 원논문 Approach 3의 점추정이 자기 신뢰구간 밖에 있다. 와 에서 계산한 인데 보고된 구간은 [0.454, 0.455]다. 구간 폭의 1.5배만큼 밖이다. 이건 재현 논문이 지적한 항목이 아니라 우리가 검산 중에 걸린 것이다.
- 그 구간을 정당하게 얻으려면 실험이 51만 번 필요하다는 재현 논문의 계산은 우리 손으로도 재현된다. 다만 논문이 인쇄한 「240 × 2116 = 600,000」은 곱셈이 안 맞는다 — 507,840이다.
- 지수 를 0.2849 대신 0.28로 반올림해 인쇄한 것만으로 Gopher 예산의 최적 모델 크기가 20.1% 옮겨진다.
스케일링 법칙 자체는 스케일링 법칙이 맡고, 계수를 넣어 최적화 문제를 푸는 코드와 그 검산은 계수로 최적 배분을 직접 풀어 본 기록에 있다. 이 글은 두 계수 벌을 대질시키는 일만 맡는다.
재현 논문이 한 일
원논문은 Approach 3에서 손실을 로 놓고 400편 넘는 학습 결과에 적합했다. 그런데 그 데이터는 공개되지 않았다. 재현 논문이 한 첫 번째 일은 원논문 Figure 4의 산점도에서 점의 좌표를 읽어 240개를 복원하는 것이었다.
그 데이터에 같은 함수를 같은 방식으로 — Huber 손실, , 같은 초기값 격자 — 적합해서 얻은 계수를 원논문 것과 나란히 놓은 것이 Table 1이다. 괄호는 4,000회 부트스트랩으로 얻은 표준오차다.
| 파라미터 | 재현 논문 추정 | 원논문 추정 |
|---|---|---|
| 482.01 (124.58) | 406.4 | |
| 2085.43 (1293.23) | 410.7 | |
| 1.8172 (0.03) | 1.6934 | |
| 0.3478 (0.02) | 0.3392 | |
| 0.3658 (0.02) | 0.2849 | |
| 0.5126 (0.02) | 0.454 | |
| 데이터 점 | 240 | 400 초과 |
여기서 원논문 열의 ·· 는 원논문 본문에 없는 값이다. 본문 부록 D.2가 인쇄한 것은 , , 로 두 자리까지다. 전자리 값은 arXiv에 올라간 TeX 원본의 주석에 남아 있었고, 재현 논문이 그것을 찾아 표에 실었다.
재현 논문이 제기하는 문제는 셋이고 §3.1~§3.3에 하나씩 있다.
- §3.1 — 원논문 계수는 복원한 데이터에 잘 맞지 않는다. 인쇄된 반올림값은 특히 나쁘고, 전자리 값을 써도 여전히 재적합보다 못하다.
- §3.2 — 원논문이 보고한 ·의 신뢰구간이 데이터 수에 비해 말이 안 되게 좁다.
- §3.3 — 원논문 Approach 3의 계수가 함의하는 배분 규칙이 자기 논문의 Approach 1·2와도, 자기가 학습시킨 Chinchilla와도 어긋난다.
§3.1의 적합도 판정(우도비 검정 , 부트스트랩 검정 )은 복원한 데이터가 있어야 다시 계산할 수 있고 그 데이터는 우리에게 없다. 그래서 이 글은 §3.2와 §3.3만 검산한다. §3.1은 논문의 주장으로 인용하고 넘어간다.
재현 논문은 원인도 적어 두었다. 초판이 나온 뒤 원논문 저자 중 한 명이 밝히기를, L-BFGS-B 최적화기에 Huber 손실을 합이 아니라 평균으로 넘긴 탓에 손실 스케일이 커져 최적화가 수렴 전에 멈췄다는 것이다. 그리고 그 조기 종료가 본 적합과 부트스트랩 양쪽에 걸렸다.
검산 1 — 구간이 얼마나 좁은가
pip install numpy scipy
python ci.py
import numpy as np
from scipy.stats import norm
Z90 = norm.ppf(0.9) # Table 2 의 구간은 10th~90th percentile 이므로 80% 구간이다
# arXiv 2203.15556 Table 2: (접근법, a 점추정, a 하한, a 상한, b 하한, b 상한)
T2 = [("1. Minimum over curves", 0.50, 0.488, 0.502, 0.501, 0.512),
("2. IsoFLOP profiles", 0.49, 0.462, 0.534, 0.483, 0.529),
("3. Parametric loss", 0.46, 0.454, 0.455, 0.542, 0.543)]
print("=== 1. 세 접근법이 보고한 a 구간의 폭 ===")
print(f"{'Approach':>22} | {'a 구간':>16} | {'폭':>7} | {'함의 표준오차':>12} | {'A3 대비':>7}")
w3 = T2[2][3] - T2[2][2]
for name, _, lo, hi, *_ in T2:
w = hi - lo
print(f"{name:>22} | [{lo:.3f}, {hi:.3f}] | {w:7.4f} | {w / (2 * Z90):12.5f} | {w / w3:6.1f}배")
print("\n=== 2. 점추정 a 는 자기 구간 안에 있는가 ===")
# alpha, beta 는 재현 논문 Table 1 이 옮긴 원논문 TeX 주석의 전자리 값과 본문 인쇄값
for tag, al, be in [("TeX 주석 전자리", 0.3392, 0.2849), ("본문 인쇄 2자리", 0.34, 0.28)]:
a, b = be / (al + be), al / (al + be)
for sym, v, lo, hi in [("a", a, 0.454, 0.455), ("b", b, 0.542, 0.543)]:
d = (v - hi if v > hi else lo - v if v < lo else 0.0)
state = "구간 안" if d == 0 else f"구간 밖 (경계에서 {d:+.5f}, 구간 폭의 {d / 0.001:.1f}배)"
print(f"{tag:>14} {sym} = {v:.5f} 보고 구간 [{lo}, {hi}] -> {state}")
print("\n=== 3. 그 구간을 얻으려면 실험이 몇 번 필요한가 ===")
SE_OURS, N_OURS = 0.018, 240 # 재현 논문 Table 2 / 본문
w_ours = 2 * Z90 * SE_OURS
print(f"재현 논문의 a 표준오차 {SE_OURS} -> 80% 구간 폭 2*{Z90:.4f}*{SE_OURS} = {w_ours:.4f}")
print(f"원논문 A3 구간 폭 {w3:.4f} 와의 비 = {w_ours / w3:.1f}배")
need = N_OURS * (w_ours / w3) ** 2
print(f"표준오차는 sqrt(n) 으로 줄므로 필요한 표본 배수 = {(w_ours / w3) ** 2:.0f}배")
print(f"필요한 실험 수 = {N_OURS} x {(w_ours / w3) ** 2:.0f} = {need:,.0f}")
print("\n재현 논문이 인쇄한 산수를 그대로 검산하면")
for mult in [2116, 2500]:
print(f" 240 x {mult:5d} = {240 * mult:,d}")
print(f" 논문 본문은 \"240 x 2116 = 600,000\" 으로 적었다 -> "
f"240x2116 은 {240 * 2116:,d}, 600,000 이 되려면 배수가 2500 이어야 한다")
print(f" 같은 문단이 앞서 말한 배수는 50^2 = {50 ** 2}, 우리 계산은 {(w_ours / w3) ** 2:.0f}")
=== 1. 세 접근법이 보고한 a 구간의 폭 ===
Approach | a 구간 | 폭 | 함의 표준오차 | A3 대비
1. Minimum over curves | [0.488, 0.502] | 0.0140 | 0.00546 | 14.0배
2. IsoFLOP profiles | [0.462, 0.534] | 0.0720 | 0.02809 | 72.0배
3. Parametric loss | [0.454, 0.455] | 0.0010 | 0.00039 | 1.0배
=== 2. 점추정 a 는 자기 구간 안에 있는가 ===
TeX 주석 전자리 a = 0.45650 보고 구간 [0.454, 0.455] -> 구간 밖 (경계에서 +0.00150, 구간 폭의 1.5배)
TeX 주석 전자리 b = 0.54350 보고 구간 [0.542, 0.543] -> 구간 밖 (경계에서 +0.00050, 구간 폭의 0.5배)
본문 인쇄 2자리 a = 0.45161 보고 구간 [0.454, 0.455] -> 구간 밖 (경계에서 +0.00239, 구간 폭의 2.4배)
본문 인쇄 2자리 b = 0.54839 보고 구간 [0.542, 0.543] -> 구간 밖 (경계에서 +0.00539, 구간 폭의 5.4배)
=== 3. 그 구간을 얻으려면 실험이 몇 번 필요한가 ===
재현 논문의 a 표준오차 0.018 -> 80% 구간 폭 2*1.2816*0.018 = 0.0461
원논문 A3 구간 폭 0.0010 와의 비 = 46.1배
표준오차는 sqrt(n) 으로 줄므로 필요한 표본 배수 = 2129배
필요한 실험 수 = 240 x 2129 = 510,844
재현 논문이 인쇄한 산수를 그대로 검산하면
240 x 2116 = 507,840
240 x 2500 = 600,000
논문 본문은 "240 x 2116 = 600,000" 으로 적었다 -> 240x2116 은 507,840, 600,000 이 되려면 배수가 2500 이어야 한다
같은 문단이 앞서 말한 배수는 50^2 = 2500, 우리 계산은 2129
72배
첫 출력이 §3.2의 주장을 숫자로 만든 것이다. 같은 논문, 같은 표, 같은 양의 데이터인데 Approach 2의 구간이 Approach 3보다 72배 넓다. Approach 1과 비교해도 14배다. 세 방법이 같은 실험 묶음에서 나왔다는 점을 생각하면 이 비대칭은 방법의 성질로 설명하기 어렵다.
구간이 10~90 백분위, 즉 80% 구간이므로 폭을 로 나누면 함의된 표준오차가 나온다. Approach 3은 0.00039다. 재현 논문이 240개 점에서 얻은 값은 0.018로 46배 크다.
점추정이 자기 구간 밖에 있다
둘째 출력은 검산하다 걸린 것이다. 는 정의상 이므로 보고된 계수에서 바로 계산된다. TeX 주석의 전자리 값을 넣으면 이다. 그런데 같은 논문이 보고한 의 구간은 [0.454, 0.455]다. 0.45650은 그 구간 위쪽 밖에 있고, 밖으로 나간 거리(0.00150)가 구간 폭 자체의 1.5배다. 도 0.54350으로 [0.542, 0.543] 밖이다. 본문에 인쇄된 두 자리 값으로 계산하면 더 멀어진다.
보통은 이런 일이 안 일어난다. 점추정은 구간 안에, 대개 한가운데에 있다. 어긋나려면 부트스트랩 표본들의 분포가 본 적합의 해와 다른 자리에 몰려 있어야 한다.
그런데 재현 논문이 전한 원인이 정확히 그것을 예측한다. 최적화가 초기값 근처에서 조기 종료됐다면, 부트스트랩 재적합들도 각자의 초기값에서 거의 움직이지 못한 채 멈춘다. 그러면 부트스트랩 분포는 데이터가 아니라 초기값 격자의 모양을 반영하고, 본 적합의 해와 겹칠 이유가 없다. 구간이 극단적으로 좁은 것과 점추정이 그 밖에 있는 것은 같은 원인의 두 얼굴이다.
이건 재현 논문이 적은 항목이 아니라 우리가 붙인 해석이므로 그렇게 읽어야 한다. 우리가 확인한 사실은 「인쇄된 세 수 , , 구간이 서로 맞지 않는다」까지다.
51만 번
셋째 출력은 §3.2의 마지막 계산을 다시 한 것이다. 표준오차는 표본 수의 제곱근에 반비례하므로, 구간을 46.1배 좁히려면 표본을 배로 늘려야 한다. 240개에 곱하면 510,844번의 학습 실행이다. 원논문이 밝힌 실험 수는 "over 400"이다. 세 자릿수가 다르다.
여기서 재현 논문 자신의 산수 하나가 걸렸다. 논문 본문은 이렇게 적는다 — "we would need to increase the number of experiments by a factor of or 2500. That means that we would need to have access to the results from nearly training runs." 은 507,840이다. 600,000이 되려면 배수가 2500이어야 하고, 2500은 같은 문단이 앞서 쓴 이다. 한 식 안에 두 배수가 섞였다.
우리 쪽 실수부터 지웠다. 2116은 이고 46은 논문이 표준오차 0.018에서 얻은 배수의 반올림이다. 우리가 같은 값에서 얻은 배수는 46.1, 제곱하면 2129다. 논문의 2116은 맞고 2500도 반올림한 값으로 맞다. 틀린 것은 둘을 등호로 이은 그 줄뿐이다. 결론은 흔들리지 않는다 — 51만이든 60만이든 "over 400"과 세 자릿수 차이라는 §3.2의 논지는 그대로다.
검산 2 — 어느 계수가 Chinchilla를 맞히는가
§3.3의 주장이 이 논문에서 가장 무겁다. 원논문 Approach 3의 계수가 함의하는 배분 규칙이, 원논문 저자들이 실제로 학습시킨 모델과 어긋난다는 것이다. 이건 데이터 없이도 검산된다. 계수를 제약 아래 최소화하고, 나온 를 Chinchilla의 실제 스펙 70B·1.4조 토큰과 비교하면 된다.
python policy.py
import numpy as np
from scipy.optimize import brentq
# L(N, D) = E + A/N^alpha + B/D^beta 의 계수 세 벌 (재현 논문 Table 1 / 원논문 본문)
FITS = {"Hoffmann (TeX)": dict(A=406.4, alpha=0.3392, B=410.7, beta=0.2849),
"Hoffmann (인쇄)": dict(A=406.4, alpha=0.34, B=410.7, beta=0.28),
"Besiroglu 재적합": dict(A=482.01, alpha=0.3478, B=2085.43, beta=0.3658)}
GOPHER, N_CH, D_CH = 5.76e23, 70e9, 1.4e12 # 실제로 학습시킨 Chinchilla
def opt(f, C): # C = 6ND 제약 아래 dL/dN = 0 의 해석해
a, b = f["alpha"], f["beta"]
N = (a * f["A"] * C ** b / (b * f["B"] * 6 ** b)) ** (1 / (a + b))
return N, C / (6 * N)
print("=== 1. 어느 계수가 '실제로 학습시킨 Chinchilla' 를 맞히는가 ===")
print(f"{'계수':>16} | {'N*':>8} | {'N* 오차':>8} | {'D*':>7} | {'D* 오차':>8} | {'D*/N*':>6}")
print(f"{'실제 Chinchilla':>16} | {N_CH / 1e9:7.2f}B | {'—':>8} | {D_CH / 1e12:6.2f}T | "
f"{'—':>8} | {D_CH / N_CH:6.1f}")
for name, f in FITS.items():
N, D = opt(f, GOPHER)
print(f"{name:>16} | {N / 1e9:7.2f}B | {N / N_CH - 1:+7.1%} | {D / 1e12:6.2f}T | "
f"{D / D_CH - 1:+7.1%} | {D / N:6.1f}")
print("\n=== 2. 재현 논문이 말한 '약 70토큰/파라미터' 는 어느 예산인가 ===")
f = FITS["Hoffmann (TeX)"]
for tgt in [20, 59.1, 70]:
C = brentq(lambda c: opt(f, np.exp(c))[1] / opt(f, np.exp(c))[0] - tgt,
np.log(1e10), np.log(1e40))
print(f" D*/N* = {tgt:5.1f} 이 되는 예산 C = {np.exp(C):9.2e} FLOPs"
f" (Gopher 예산의 {np.exp(C) / GOPHER:9.2e}배)")
print("\n=== 3. beta 를 0.2849 대신 0.28 로 반올림하면 생기는 편향 ===")
print(f"{'D (토큰)':>10} | {'(D)^0.0049 - 1':>14}")
for D in [1e9, 1e11, 1e13, 1e15]:
print(f"{D:10.0e} | {D ** (0.2849 - 0.28) - 1:13.1%}")
print(" 재현 논문 본문의 값: D = 10^11 에서 약 13%")
Nt, _ = opt(FITS["Hoffmann (TeX)"], GOPHER)
Np, _ = opt(FITS["Hoffmann (인쇄)"], GOPHER)
print(f" 같은 반올림이 Gopher 예산의 N* 를 {Nt / 1e9:.2f}B -> {Np / 1e9:.2f}B "
f"({Np / Nt - 1:+.1%}) 로 옮긴다")
print("\n=== 4. a 의 표준오차 0.018 을 예산 의존성으로 흘리면 ===")
a0, se = 0.5126, 0.018
print(" D*/N* ∝ C^(1-2a) 이므로 예산을 10^21 -> 10^27 (6자릿수) 옮길 때의 배수는")
for lab, a in [("a - 1.28se", a0 - 1.2816 * se), ("a (점추정)", a0),
("a + 1.28se", a0 + 1.2816 * se)]:
print(f" {lab:12s} a = {a:.4f} 배수 = 10^(6*(1-2a)) = {10 ** (6 * (1 - 2 * a)):8.3f}")
print(" 같은 계산을 원논문 A3 의 a = 0.4565 로 하면"
f" 배수 = {10 ** (6 * (1 - 2 * 0.4565)):.3f}")
=== 1. 어느 계수가 '실제로 학습시킨 Chinchilla' 를 맞히는가 ===
계수 | N* | N* 오차 | D* | D* 오차 | D*/N*
실제 Chinchilla | 70.00B | — | 1.40T | — | 20.0
Hoffmann (TeX) | 40.31B | -42.4% | 2.38T | +70.1% | 59.1
Hoffmann (인쇄) | 32.19B | -54.0% | 2.98T | +113.0% | 92.6
Besiroglu 재적합 | 72.25B | +3.2% | 1.33T | -5.1% | 18.4
=== 2. 재현 논문이 말한 '약 70토큰/파라미터' 는 어느 예산인가 ===
D*/N* = 20.0 이 되는 예산 C = 2.26e+18 FLOPs (Gopher 예산의 3.92e-06배)
D*/N* = 59.1 이 되는 예산 C = 5.78e+23 FLOPs (Gopher 예산의 1.00e+00배)
D*/N* = 70.0 이 되는 예산 C = 4.05e+24 FLOPs (Gopher 예산의 7.03e+00배)
=== 3. beta 를 0.2849 대신 0.28 로 반올림하면 생기는 편향 ===
D (토큰) | (D)^0.0049 - 1
1e+09 | 10.7%
1e+11 | 13.2%
1e+13 | 15.8%
1e+15 | 18.4%
재현 논문 본문의 값: D = 10^11 에서 약 13%
같은 반올림이 Gopher 예산의 N* 를 40.31B -> 32.19B (-20.1%) 로 옮긴다
=== 4. a 의 표준오차 0.018 을 예산 의존성으로 흘리면 ===
D*/N* ∝ C^(1-2a) 이므로 예산을 10^21 -> 10^27 (6자릿수) 옮길 때의 배수는
a - 1.28se a = 0.4895 배수 = 10^(6*(1-2a)) = 1.335
a (점추정) a = 0.5126 배수 = 10^(6*(1-2a)) = 0.706
a + 1.28se a = 0.5357 배수 = 10^(6*(1-2a)) = 0.373
같은 계산을 원논문 A3 의 a = 0.4565 로 하면 배수 = 3.327
3.2% 대 42.4%
첫 표가 §3.3의 주장이고, 이 글에서 가장 강한 숫자다. 복원한 데이터로 다시 적합한 계수는 Hoffmann 팀이 실제로 만든 모델을 3.2% 오차로 맞힌다. Hoffmann 팀 자신의 Approach 3 계수는 같은 예산에서 40.31B를 내놓아 42.4% 빗나간다. 본문에 인쇄된 두 자리 값으로 풀면 32.19B로 54.0% 빗나간다.
이 대비가 왜 결정적인가. Approach 3의 계수가 옳다면 Hoffmann 팀은 자기 계수를 따라 40B짜리를 학습시켰어야 했다. 그런데 그들은 70B를 골랐고, §4에 그 이유를 "the optimal model size ... is somewhere between 40 and 70 billion"이라고만 적었다. 재적합 계수는 그들이 실제로 고른 쪽을 가리킨다. 재현 논문이 §3.3에서 "our estimates are consistent with the scaling policy used for Chinchilla, their estimates ... are not"이라고 쓴 것이 이 표다.
토큰 쪽도 같은 방향이다. 재적합은 1.33조를 예측하고 실제는 1.4조다. 원논문 계수는 2.38조로 70% 더 쓰라고 한다.
'약 70토큰'은 Gopher 예산이 아니다
둘째 출력은 재현 논문의 한 문장에 붙이는 각주다. §3.3은 원논문 계수가 "approximately 70 tokens per parameter"를 권한다고 적는데, Gopher 예산에서 실제로 나오는 값은 59.1이다. 70이 되는 것은 FLOPs, 즉 Gopher 예산의 7.03배 자리다.
틀린 서술이라기보다 그 논문 Figure 5가 예산 축을 넓게 잡고 그린 그림이라 대표값을 그 구간 어딘가에서 읽은 것으로 보인다. 다만 원논문 계수에서는 이 비가 예산에 따라 움직이므로 「약 70」이라는 한 숫자로 대표하면 어느 예산인지가 지워진다. 같은 계수로 20이 나오는 예산은 , Gopher의 26만분의 1이다.
두 자리 반올림의 값
셋째 출력은 §3.1이 제시한 반올림 편향 공식을 다시 계산한 것이다. 를 0.2849에서 0.28로 줄이면 데이터 항 가 배만큼 커진다. 에서 13.2%이고, 재현 논문이 적은 값도 약 13%다. 재현된다.
여기에 우리 쪽 계산을 하나 붙였다. 같은 반올림이 Gopher 예산의 최적 모델 크기를 40.31B에서 32.19B로, 20.1% 옮긴다. 소수 넷째 자리 두 개가 모델 크기를 5분의 1 움직이는 이유는 에 있다 — 가 급이라 의 0.0049가 배로 증폭되고, 그것이 제곱으로 실린다.
재적합 계수도 상수를 보장하지 않는다
넷째 출력은 반대편을 재 본 것이다. 재적합의 은 0.5에 가까워 토큰/파라미터가 예산에 거의 안 움직인다 — 이고 지수가 다. 예산을 여섯 자릿수 옮겨도 0.706배다.
그런데 의 표준오차 0.018을 그대로 흘리면 80% 구간의 양 끝에서 이 배수가 1.335배와 0.373배로 갈린다. 구간 한쪽 끝에서는 비가 예산과 함께 커지고 반대쪽 끝에서는 작아진다. 즉 재적합 계수도 「20은 예산과 무관한 상수」를 보장하지는 않는다. 보장하는 것은 「원논문 계수가 주는 3.327배만큼 크게 움직이지는 않는다」까지다.
꺾이는 지점
재현 논문의 §3.2와 §3.3은 그대로 받아도 된다. 구간 폭 72배 비대칭, 51만 번이라는 표본 요구, 3.2% 대 42.4%라는 대질 — 셋 다 우리 손으로 재계산된다. 여기까지는 공짜다.
「그러니 재적합 계수를 쓰면 된다」부터가 손해다. 넷째 출력이 그 자리다. 재적합의 도 표준오차 0.018을 달고 있고, 그 구간 안에서는 예산 의존성의 부호가 뒤집힌다. 그리고 §3.1의 적합도 판정은 복원한 240점에 대한 것이라, 그 복원이 정확한지가 검증되지 않으면 함께 흔들린다.
실무로 옮기면 이렇다. 원논문 Approach 3의 계수 를 예산 계획에 그대로 넣지 않는 편이 낫다. 그 계수는 자기 논문이 만든 모델을 42% 빗나간다. 20 근처의 어림이 필요하면 Approach 1·2의 표(앞 글의 첫 표)를 쓰고, 자기 예산이 급에서 멀면 어느 쪽 계수를 쓰든 다시 풀어 봐야 한다.
측정 환경
| 항목 | 값 |
|---|---|
| OS | Linux 6.18.44 x86_64 (컨테이너) |
| CPU | Intel Xeon @ 2.80GHz, 4코어 |
| Python | 3.11.15 |
| numpy | 2.4.6 |
| scipy | 1.17.1 |
| 측정일 | 2026-08-25 |
두 스크립트를 각각 5회 반복 실행했다. ci.py 0.9411.235초, 0.537초이고 다섯 번의 표준출력이 바이트 단위로 전부 동일했다. 대부분이 scipy import 시간이다. 난수를 쓰지 않으므로 시드가 없다. 위 시간은 이 컨테이너 값이고 하드웨어가 다르면 바뀐다 — 결론에 쓰는 것은 비율뿐이다.policy.py 0.506
재현 논문은 arxiv.org/html/2404.10102v2(2024년 5월 15일판)에서, 원논문은 ar5iv.labs.arxiv.org/html/2203.15556에서 받았다. 표준오차와 구간은 두 논문이 인쇄한 값을 그대로 옮겼고, 옮긴 값이 맞는지는 정의식 로 되짚어 확인했다 — 재현 논문이 자기 열에 적은 은 자기 · 에서 다시 계산해도 0.5126이다.
한계
§3.1은 검산하지 못했다. 복원한 240개 점이 재현 논문의 코드 저장소에 있다고 밝혀져 있지만 이 글은 그것을 받지 않았다. 적합도에 관한 모든 수치( 등)는 논문의 주장으로만 실었고 우리가 확인한 것이 아니다.
그래서 「어느 계수가 맞는가」를 판정하지 않았다. 이 글이 보인 것은 「재적합 계수가 실제 Chinchilla를 더 잘 맞힌다」까지다. 한 점을 더 잘 맞히는 것과 240점 전체에 더 잘 맞는 것은 다른 주장이고, 뒤쪽은 데이터가 있어야 한다.
데이터 복원 자체가 검증되지 않았다. 재현 논문의 240점은 원논문 Figure 4의 산점도에서 읽어 낸 것이다. 원논문은 400편 넘게 돌렸다고 하므로 그림에 실린 것이 전부가 아닐 수 있고, 읽어 낸 좌표에도 오차가 있다. 논문 자신도 결론을 "if our data reconstruction is correct"로 조건부로 적는다.
표준오차 전파에서 계수 사이의 상관을 무시했다. 넷째 출력은 하나만 흔든 것이고, 는 와 의 함수라 나머지 계수와 상관돼 있다. 공분산 행렬이 공개돼야 제대로 흘릴 수 있다. 네 계수를 전부 독립으로 흔들면 구간이 어디까지 벌어지는지는 앞의 재계산 글에 있다.
「점추정이 구간 밖」의 원인은 확정하지 못했다. 조기 종료로 설명되지만 그건 우리 해석이고, 부트스트랩 표본 자체가 공개돼야 확인된다.
읽어주셔서 감사합니다. 😊

