논문 재현
먼저 읽을 장 23.2 논문 읽는 법22.2 재현성
새 연구는 대개 기존 결과 위에 선다. 기존 방법을 baseline으로 쓰거나, 그 방법을 고쳐 더 나은 방법을 제안하거나, 그 방법을 내 분야의 데이터에 적용한다. 어느 경우든 출발점의 숫자가 내 손에서 다시 나오지 않으면 그 위에 쌓은 비교는 의미가 없다. "논문에서는 0.85였는데 내가 돌리면 0.79가 나온다"는 상황에서 원인을 모른 채 제안 방법과 비교하면, 차이가 내 방법 때문인지 재현 조건의 차이 때문인지 알 수 없다.
이 장은 논문 결과를 재현하고, 재현 결과와 원 논문의 차이를 체계적으로 분석해 재현 보고서로 남기는 방법을 다룬다. 재현성 자체의 수준과 무작위성의 통제(결정적 실행, 환경 고정)는 22.2장에서 다룬다. 이 장은 남의 논문을 대상으로, 23.2장에서 재구성하기 단계까지 읽은 논문을 실제로 돌려 보는 과정이다. 재현은 연구의 준비 운동이 아니다. 23.4장에서 보듯이 재현과 그 실패의 분석은 좋은 연구 질문이 나오는 가장 흔한 출처다.
학습 목표
- 논문 결과를 재현하고 차이를 체계적으로 분석한다
- 재현 보고서를 작성한다
재현의 종류
왜 종류를 구분하는가. "재현했다"는 말은 여러 뜻으로 쓰인다. 저자가 공개한 코드를 저자의 환경 그대로 다시 돌린 것도, 논문만 보고 처음부터 다시 짠 것도 재현이라 부른다. 두 결과가 확인해 주는 것은 다르다. 앞의 것은 "보고된 숫자가 이 코드에서 나온다"를 확인하고, 뒤의 것은 "논문에 적힌 방법이 그 숫자를 만든다"를 확인한다. 재현성(reproducibility)과 반복 가능성(replicability) 같은 용어의 정의는 분야마다 다르게 쓰이므로, 보고서에는 용어 대신 무엇을 그대로 두고 무엇을 바꿨는지를 쓴다.
| 종류 | 그대로 두는 것 | 새로 만드는 것 | 확인되는 것 | 성공해도 확인되지 않는 것 |
|---|---|---|---|---|
| 공식 코드 실행 | 코드, 데이터, 설정 | 실행 환경(다른 머신·라이브러리 버전) | 보고된 숫자가 공개 코드에서 나온다 | 논문의 서술과 코드가 같은 방법인지 |
| 독립 재구현 | 논문의 서술, 데이터 | 코드 전체 | 논문에 적힌 방법이 그 숫자를 만든다 | 다른 데이터·조건에서의 일반화 |
| 새 조건 재현 | 방법 | 데이터, 분할, 조건 | 결론이 원 논문의 조건 밖에서도 성립한다 | — |
순서는 대개 위에서 아래다. 공식 코드로 숫자를 먼저 맞춰 두면, 독립 재구현에서 차이가 날 때 비교할 기준이 생긴다. 공식 코드가 없으면 독립 재구현부터 시작하되, 저자에게 코드나 세부 설정을 요청해 본다. 요청은 구체적일수록 답을 받기 쉽다. "코드를 공유해 주실 수 있나요"보다 "표 1의 분할에 쓴 seed와 분할 파일, 식 (2)의 가 샘플 평균 손실 기준인지"처럼 아래 불일치 표의 빈칸을 그대로 묻는다.
ML 학회들도 재현을 돕는 장치를 도입해 왔다. NeurIPS 2019는 코드 제출 정책, 커뮤니티 재현 챌린지, 투고 시의 재현성 체크리스트를 도입하고 그 경험을 보고했다(Pineau et al., 2021). 이런 체크리스트는 논문에 무엇이 적혀 있어야 재현할 수 있는지에 대한 좋은 목록이기도 하다.
조건 맞추기
왜 조건부터 맞추는가. 재현 결과가 다를 때 원인 후보는 데이터·전처리·분할·metric·하이퍼파라미터·학습 예산·환경·무작위성으로 많다. 실행 전에 이 조건들을 원 논문과 하나씩 대조해 두면, 나중에 원인을 찾는 범위가 줄어든다. 23.2장의 추출 항목(문제 정의·가정·비교 대상·평가 조건)이 여기서 체크리스트가 된다.
맞춰야 할 조건.
- 데이터: 같은 데이터셋의 같은 판(version). 공개 데이터셋도 오류 수정이나 항목 추가로 판이 바뀐다. 내려받은 파일의 체크섬을 기록한다(15.5장).
- 분할: 분할 방식(무작위·그룹·시간)과 단위, 비율, 분할에 쓴 seed, 공개된 분할 파일이 있으면 그 파일. 분할은 결과를 가장 크게 바꾸는 조건 중 하나다(12.5장, 15.4장).
- 전처리: 정규화 통계를 어느 데이터에서 계산했는지, 결측·이상치 처리, 특징 변환.
- metric: 같은 이름의 metric도 구현이 다르다. 평균을 샘플 단위로 내는지 그룹 단위로 내는지, 로그 변환한 값에서 계산했는지, 분류 임계값은 무엇인지.
- 학습 예산: epoch 수, 학습 단계 수, early stopping 기준, 하이퍼파라미터 탐색에 쓴 시도 횟수. 원 논문이 탐색에 쓴 예산을 모르면, 같은 하이퍼파라미터를 써도 같은 결과를 기대할 수 없다.
- 환경: 라이브러리 버전, 하드웨어, 결정적 실행 설정(22.2장).
조건을 맞출 수 없는 항목도 있다. 비공개 데이터, 감당할 수 없는 계산 예산 같은 것이다. 이런 항목은 맞추지 못했다는 사실 자체를 기록하고, 그 차이가 결과에 미칠 영향의 방향을 추측해 둔다.
seed 분산을 먼저 잰다. 원 논문이 seed 하나의 결과만 보고했다면, 그 숫자는 seed 분포에서 뽑은 표본 하나다. 내 재현도 seed 하나로 돌리면 두 표본을 비교하는 셈이어서, 차이가 나도 같아도 아무것도 말할 수 없다. 같은 조건에서 seed를 여러 개 돌려 기준 잡음(seed 간 표준편차)을 먼저 잰다. 강화학습에서는 seed와 구현의 차이만으로 결과가 크게 달라질 수 있다는 것이 체계적으로 보고되었다(Henderson et al., 2018).
단일 실행값을 판정하는 구간. 내가 seed 개로 얻은 값 의 평균을 , 표본 표준편차를 라 하자. 원 논문의 단일 실행값이 같은 분포에서 나왔다면, 그 값은 다음 예측구간(prediction interval)에 약 95%의 확률로 들어간다.
의 1은 새 단일 실행 자체의 흔들림, 은 내 평균 의 불확실성이다. 평균의 신뢰구간 과 혼동하면 안 된다. 그 구간은 평균이 얼마나 정확한지를 말할 뿐이고, 단일 실행값과 비교하면 제대로 재현된 결과도 "구간 밖"으로 판정한다. 두 구간의 폭은 배 차이가 난다.
가상의 재현 사례. 이 장의 계산은 하나의 가상 논문을 따라간다. 배터리 셀 40개에서 셀마다 25번 측정한 데이터로 어떤 성능 지표를 예측하는 문제다. 논문은 측정 특징만 쓰는 능선 회귀를 baseline으로, 셀 단위 설명 변수(제조 조건 등 12개)를 더한 모델을 제안 방법으로 놓고, "제안 방법이 RMSE를 0.69에서 0.51로 줄인다"고 보고한다(표 1, 단일 실행). 본문에는 "셀 단위로 분할했고, 특징을 표준화했으며, 손실은 샘플 평균에 의 L2 정규화를 더했다"고 쓰여 있다. 공개 코드는 함수 ridge_rmse이고, 세 조건을 인자로 받는다. 데이터에서 성능 지표는 측정 특징의 선형 함수에 셀마다 다른 효과와 측정 잡음을 더해 만들었다.
import numpy as np
rng = np.random.default_rng(0)
G, M = 40, 25 # 셀 40개, 셀마다 측정 25개
group = np.repeat(np.arange(G), M) # 각 측정의 셀 번호, (N,)
desc = rng.normal(size=(G, 12))[group] # 셀 단위 설명 변수, 셀 안에서 일정, (N, 12)
meas = rng.normal(size=(G * M, 6)) * [1, 1, 1, 1, 100, 100] # 측정 특징, 두 열은 단위가 큼, (N, 6)
y = meas @ [0.5, -0.3, 0.2, 0.1, 0.004, -0.003] + rng.normal(0, 0.6, G)[group] + rng.normal(0, 0.3, G * M)
X_base, X_prop = meas, np.c_[meas, desc] # baseline: 측정만, 제안: 측정 + 셀 설명, (N, 6), (N, 18)
def ridge_rmse(X, seed, group_split, standardize, lam_mean):
r = np.random.default_rng(seed)
if group_split: # 시험 셀 10개를 통째로 뗀다
te = np.isin(group, r.permutation(G)[:10])
else: # 측정 단위로 25%를 무작위로 뗀다
te = r.permutation(G * M) < G * M // 4
Xtr, Xte, ytr, yte = X[~te], X[te], y[~te], y[te]
if standardize:
mu, sd = Xtr.mean(0), Xtr.std(0)
Xtr, Xte = (Xtr - mu) / sd, (Xte - mu) / sd
A, B = np.c_[Xtr, np.ones(len(Xtr))], np.c_[Xte, np.ones(len(Xte))]
lam = len(Xtr) if lam_mean else 1.0 # 평균 손실의 lam=1은 합 손실의 lam=N
w = np.linalg.solve(A.T @ A + lam * np.eye(A.shape[1]), A.T @ ytr)
return np.sqrt(np.mean((B @ w - yte) ** 2))
print("측정", len(y), "개, 셀", G, "개, 특징: baseline", X_base.shape[1], "/ 제안", X_prop.shape[1])측정 1000 개, 셀 40 개, 특징: baseline 6 / 제안 18
먼저 공개 코드가 실제로 쓰는 설정(무작위 분할, 표준화 없음, 합 손실에 )으로 seed 10개를 돌린다. 두 방법을 같은 seed, 즉 같은 분할에서 비교해 짝지은 차이도 구한다(12.5장).
from scipy import stats
code = dict(group_split=False, standardize=False, lam_mean=False) # 공개 코드의 실제 설정
runs = {"baseline": np.array([ridge_rmse(X_base, s, **code) for s in range(10)]),
"제안": np.array([ridge_rmse(X_prop, s, **code) for s in range(10)])}
runs["차이"] = runs["제안"] - runs["baseline"] # 같은 seed끼리 짝지은 차이, (10,)
reported = {"baseline": 0.69, "제안": 0.51, "차이": -0.18} # 논문 표 1 (가상, 단일 실행)
t = stats.t.ppf(0.975, df=9)
for name, r in runs.items():
half = t * r.std(ddof=1) * np.sqrt(1 + 1 / len(r)) # 새 단일 실행의 95% 예측구간 반폭
lo, hi = r.mean() - half, r.mean() + half
inside = "안" if lo <= reported[name] <= hi else "밖"
print(f"{name:<8} 재현 {r.mean():.3f} ± {r.std(ddof=1):.3f} "
f"단일 실행 구간 [{lo:.3f}, {hi:.3f}] 보고 {reported[name]:.3f} → 구간 {inside}")baseline 재현 0.685 ± 0.028 단일 실행 구간 [0.619, 0.751] 보고 0.690 → 구간 안 제안 재현 0.526 ± 0.028 단일 실행 구간 [0.459, 0.594] 보고 0.510 → 구간 안 차이 재현 -0.159 ± 0.013 단일 실행 구간 [-0.190, -0.127] 보고 -0.180 → 구간 안
세 보고값 모두 단일 실행의 예측구간 안에 있다. 공개 코드로는 재현되었다. 짝지은 차이의 표준편차(0.013)는 각 방법의 표준편차(0.028)의 절반도 안 된다. 같은 분할에서 두 방법이 함께 흔들리기 때문이다. 그런데 이 결론에는 중요한 단서가 붙는다. 재현된 것은 공개 코드의 조건이고, 논문 본문이 주장한 조건이 아니다. 다음 두 절이 이 차이를 다룬다.
차이의 기록
왜 기록부터 하는가. 재현하다 보면 논문·공개 코드·내 설정 사이의 작은 차이를 계속 발견한다. 발견할 때마다 고치면, 나중에 어떤 차이가 결과를 바꿨는지 알 수 없다. 발견한 차이는 먼저 불일치 표에 기록하고, 어느 쪽을 따를지는 따로 결정한다.
| # | 항목 | 논문 본문 (위치) | 공개 코드 (파일:줄) | 내 재현 설정 | 영향 추정 |
|---|---|---|---|---|---|
| 1 | 분할 | "셀 단위 분할" (3.1절) | 측정 단위 무작위 분할 (ridge_rmse) |
둘 다 실행 | 큼: 학습 셀의 측정이 시험에 들어감 |
| 2 | 표준화 | "특징을 표준화" (3.2절) | 표준화 없음 | 둘 다 실행 | 정규화가 강하면 큼 |
| 3 | 정규화 스케일 | 샘플 평균 손실, (식 2) | 합 손실, lam = 1.0 |
둘 다 실행 | 실효 가 배 차이 (23.2장) |
| 4 | seed | 언급 없음 | 고정값 하나 | 0–9 | 기준 잡음 측정용 |
| 5 | 데이터 판 | "공개 데이터" | 내려받기 스크립트 | 체크섬 기록 | 확인됨 |
이 표는 그대로 재현 보고서의 일부가 된다. "영향 추정"은 실험 전에 적어 둔다. 실험 결과가 추정과 다르면 그 자체가 배울 거리다.
불일치의 원인 분리
왜 하나씩 바꾸면 부족한가. 불일치가 여럿이면 가장 자연스러운 방법은 공개 코드 설정에서 출발해 하나씩 논문대로 바꿔 보는 것이다. 이 방법은 불일치들이 서로 독립적으로 작용할 때만 맞다. 한 불일치의 효과가 다른 불일치의 상태에 따라 달라지면(교호작용, interaction), 하나씩 바꾸기는 효과의 크기는 물론 방향까지 틀리게 추정할 수 있다.
원인 후보의 다섯 갈래. 불일치는 대개 다음 중 하나에 속한다. 표의 각 행을 이 갈래로 분류해 두면 확인 순서를 정하기 쉽다.
- 데이터: 판, 전처리, 분할, 누수(15.4장)
- 구현: 수식과 코드의 차이, 버그, 라이브러리 함수의 기본값 차이
- 하이퍼파라미터: 명시되지 않은 값, 탐색 예산, 스케일이 다른 같은 이름의 값
- 환경: 라이브러리 버전, 하드웨어, 비결정적 연산(22.2장)
- 무작위성: seed, 그리고 seed 하나로 보고된 결과
요인 설계로 분리하기. 불일치 개를 각각 켜고 끈 개 조합을 모두 실행하면, 각 불일치의 주효과(다른 불일치들을 평균했을 때 그 불일치가 결과를 바꾸는 정도)와 교호작용을 함께 추정할 수 있다. 요인 설계의 일반적인 설명은 23.5장에서 다룬다. 앞의 불일치 표 1–3번을 켜고 끈 8개 조합을 각각 seed 10개로 실행하고, 제안 방법과 baseline의 차이를 본다. 주효과는 그 요인이 켜진 4개 조합의 평균에서 꺼진 4개 조합의 평균을 뺀 값이다.
import itertools
names = ["group_split", "standardize", "lam_mean"]
cfgs = list(itertools.product([0, 1], repeat=3)) # 8개 조합, (8, 3)
D = []
print("셀분할 표준화 평균손실 | baseline 제안 차이(제안-baseline)")
for cfg in cfgs:
kw = dict(zip(names, map(bool, cfg)))
b = np.array([ridge_rmse(X_base, s, **kw) for s in range(10)])
p = np.array([ridge_rmse(X_prop, s, **kw) for s in range(10)])
D.append((p - b).mean())
o = ["-O"[c] for c in cfg]
print(f" {o[0]} {o[1]} {o[2]} | {b.mean():.3f} {p.mean():.3f} "
f"{(p - b).mean():+.3f} ± {(p - b).std(ddof=1):.3f}")
S, D = 2 * np.array(cfgs) - 1, np.array(D) # -1/+1 부호 (8, 3), 조합별 평균 차이 (8,)
for j, k in enumerate(names):
print(f"{k:<12} 주효과 {D @ S[:, j] / 4:+.3f}")
print(f"group_split × lam_mean 교호작용 {D @ (S[:, 0] * S[:, 2]) / 4:+.3f}")셀분할 표준화 평균손실 | baseline 제안 차이(제안-baseline) - - - | 0.685 0.526 -0.159 ± 0.013 - - O | 0.756 0.662 -0.094 ± 0.009 - O - | 0.685 0.526 -0.159 ± 0.013 - O O | 0.782 0.692 -0.090 ± 0.011 O - - | 0.643 0.712 +0.069 ± 0.118 O - O | 0.701 0.673 -0.028 ± 0.034 O O - | 0.643 0.712 +0.069 ± 0.118 O O O | 0.730 0.701 -0.029 ± 0.043 group_split 주효과 +0.146 standardize 주효과 +0.001 lam_mean 주효과 -0.015 group_split × lam_mean 교호작용 -0.082
표를 읽는다.
- 분할 방식이 결론을 뒤집는다. 무작위 분할(첫 네 줄)에서는 제안 방법이 RMSE를 0.09–0.16 줄인다. 셀 단위 분할(아래 네 줄)에서는 개선이 사라지거나() 오히려 나빠진다(). 제안 방법이 더한 셀 단위 설명 변수 12개는 무작위 분할에서 "이미 본 셀"을 알아보는 데 쓰였다. 학습에 쓴 셀의 다른 측정이 시험에 들어 있었기 때문이다. 새 셀에 대해서는 셀 40개 중 30개로 12개 계수를 맞춘 과적합이 된다.
- 정규화 스케일의 효과는 분할에 따라 방향이 다르다. 주효과만 보면 로 작아 보이지만, 무작위 분할에서는 평균 손실(강한 정규화)이 개선을 줄이고, 셀 분할에서는 과적합을 눌러 결과를 좋게 만든다. 교호작용 가 이것이다. 하나씩 바꾸기로 공개 코드 설정에서 정규화만 바꿨다면 "정규화 스케일은 개선을 줄인다"는 반쪽짜리 결론을 얻었을 것이다.
- 표준화는 이 데이터에서 거의 영향이 없다. 주효과 로, 표의 "영향 추정"보다 작았다. 이런 결과도 보고서에 그대로 적는다.
- 셀 분할에서는 seed 변동이 훨씬 크다. 시험 셀 10개가 어느 것이냐에 따라 결과가 크게 바뀐다(). seed 10개로도 가 0과 다른지 확신하기 어렵다. 셀 수를 늘리거나 셀 단위 교차검증을 써야 한다(12.5장).
결론은 이렇다. 표 1의 숫자는 공개 코드에서 그대로 재현되지만, 논문이 말하는 조건(셀 단위 분할, 즉 새 셀에 대한 일반화)에서 "제안 방법이 RMSE를 0.18 줄인다"는 주장은 재현되지 않는다. 이 결론은 저자를 탓하는 문장이 아니라, 어떤 조건에서 무엇이 재현되었는지에 대한 문장이다.
재현 보고서
왜 보고서를 쓰는가. 재현은 몇 주가 걸리는 일이고, 그 과정에서 얻은 지식(어떤 조건이 결과를 바꾸는가)은 논문 어디에도 없다. 보고서로 남기지 않으면 몇 달 뒤 나 자신도, 같은 논문을 재현하려는 동료도 같은 시간을 다시 쓴다. 재현에 실패한 결과는 특히 중요하다. 실패한 재현은 학술지에 실리기 어렵지만, 그 분야의 다른 연구자에게는 가장 쓸모 있는 정보 중 하나다.
양식. 한 논문에 한 문서. 실험 추적 기록(22.1장)과 연구 노트(23.7장)에서 링크한다.
# 재현 보고서: <논문 제목> (<BibTeX 키>)
## 1. 대상
- 재현한 주장: 표 1 "제안 방법이 RMSE를 0.69 → 0.51로 줄인다" (셀 단위 분할 조건)
- 재현의 종류: 공식 코드 실행 + 불일치 조건 실험
## 2. 원 논문 조건
- 데이터·판, 분할, 전처리, metric, 하이퍼파라미터, 학습 예산, seed (논문 위치와 함께)
## 3. 실제 조건
- 내가 쓴 값과 환경 (코드 커밋, 라이브러리 버전, 하드웨어, 데이터 체크섬)
## 4. 차이
- 불일치 표 (논문 / 공개 코드 / 내 설정 / 영향 추정)
## 5. 결과
- seed 수, 평균 ± 표준편차, 보고값과의 비교 방법(단일 실행 예측구간 등), 판정
- 불일치 조합 실험의 표, 주효과와 교호작용
## 6. 결론
- 무엇이 어떤 조건에서 재현되었고, 무엇이 재현되지 않았는가
## 7. 한계
- 맞추지 못한 조건, 확인하지 못한 것, 계산 예산의 차이
## 8. 저자와의 소통
- 문의 날짜, 받은 답, 반영 여부
결론 절은 판정 하나로 끝내지 않는다. "재현됨/재현 안 됨" 대신 "공개 코드의 조건(무작위 분할)에서는 보고값이 seed 변동 범위 안에서 재현된다. 논문이 서술한 조건(셀 단위 분할)에서는 개선이 재현되지 않으며(, seed 10개), 그 차이는 분할 방식으로 대부분 설명된다"처럼 조건과 근거를 함께 쓴다.
실습
23.2장 실습에서 요약한 논문의 핵심 결과 하나를 재현하고, 본문의 양식으로 재현 보고서를 쓴다. 계산 예산이 크면 결과 표의 가장 작은 설정 하나를 고른다.
- 조건 대조. 실행 전에 데이터·분할·전처리·metric·하이퍼파라미터·학습 예산·환경을 논문과 공개 코드에서 찾아 불일치 표를 만든다. 각 행의 영향을 미리 추정해 적는다.
- 기준 잡음. 공개 코드(없으면 내 구현)를 같은 조건에서 seed 5개 이상으로 돌려 평균과 표준편차를 구한다. 보고값이 단일 실행이면 예측구간으로 비교한다. 여러 실행의 평균이면 보고값에도 불확실성이 있으므로, 표의 평균·퍼짐·실행 횟수로 두 평균의 차이 구간(23.2장의 Welch 구간)을 계산해 0을 포함하는지 본다.
- 원인 분리. 영향이 클 것으로 추정한 불일치 2–3개를 골라 켜고 끈 조합을 실행하고, 주효과와 교호작용을 계산한다.
- 보고서. 결론 절에 무엇이 어떤 조건에서 재현되었는지 쓰고, 재현되지 않은 것이 있으면 저자에게 확인을 요청한다.
보고된 단일 실행값을 재현 결과와 비교하는 구간을 직접 구현한다.
실패 사례
- 숫자가 비슷하게 나온 것을 동일 조건 재현으로 착각하는 것. 이 장의 예에서 공개 코드는 보고값을 그대로 재현했지만, 논문이 서술한 셀 단위 분할에서는 개선이 사라졌다. 숫자가 맞으면 조건이 맞는지부터 확인한다.
- 재현 실패를 곧바로 저자 탓으로 돌리는 것. seed 변동, 내가 놓친 조건, 내 구현의 버그를 먼저 배제한다. 원인을 분리한 뒤에도 저자에게 확인한다.
- seed 하나로 재현을 판정하는 것. 단일 실행끼리의 비교는 같아도 달라도 아무것도 말하지 않는다. 기준 잡음을 재고, 단일 실행값은 예측구간으로 판정한다.
- 불일치를 발견할 때마다 바로 고치는 것. 무엇이 결과를 바꿨는지 알 수 없게 된다. 먼저 기록하고, 조합 실험으로 분리한다.
- 보고값에 맞을 때까지 설정을 조정하는 것. 조정은 보고값에 대한 과적합이다. 조정했다면 시도한 횟수와 과정을 보고서에 적는다.
- 실패한 재현을 기록하지 않는 것. 몇 주의 작업과 그 과정에서 얻은 지식이 사라진다. 부정적 결과도 같은 양식으로 남긴다.
통과 기준
- 논문 하나의 핵심 결과에 대해 본문 양식의 재현 보고서를 작성한다. 보고서에는 불일치 표, seed 5개 이상의 결과와 판정 방법, 결론 절의 조건부 문장이 들어 있다.
- 재현 결과와 원 논문의 차이가 있으면, 불일치 2개 이상을 조합 실험으로 분리해 원인을 근거와 함께 보고한다. 차이가 없으면 그 판정이 seed 변동 대비 어떤 구간에서 이루어졌는지 쓴다.
- 연습문제
single-run-interval의 테스트를 통과한다.
참고 문헌
- Henderson, Islam, Bachman, Pineau, Precup, Meger (2018). Deep reinforcement learning that matters. Proceedings of the AAAI Conference on Artificial Intelligence, 32(1), 3207–3214. — seed·구현·하이퍼파라미터에 따른 결과 변동과 보고 방식
- Pineau, Vincent-Lamarre, Sinha, Larivière, Beygelzimer, d'Alché-Buc, Fox, Larochelle (2021). Improving reproducibility in machine learning research (A report from the NeurIPS 2019 reproducibility program). Journal of Machine Learning Research, 22(164), 1–20. — 코드 제출 정책·재현 챌린지·재현성 체크리스트의 도입 경험