같은 실험을 다시 돌렸을 때 같은 결과가 나오지 않는다면, 그 결과는 발견인가 우연인가. 이 강에서는 무작위성을 통제하는 도구인 시드와, 시드 하나로 보고한 숫자가 왜 위험한지를 다룬다.
컴퓨터는 진짜 난수를 만들지 못한다. 대신 의사난수 생성기(pseudo-random number generator, PRNG)가 하나의 시작값에서 출발해 결정적인 규칙으로 난수처럼 보이는 수열을 뽑아낸다. 이 시작값이 시드(seed)다.
핵심 성질은 하나다. 같은 시드에서 출발하면 같은 수열이 나온다. 시드를 42로 고정하고 돌린 실험은, 코드와 환경이 같다면 내일 다시 돌려도 같은 난수를 쓰고 같은 결과를 낸다. 시드를 고정하지 않으면 보통 현재 시각 등에서 시드를 얻으므로 실행할 때마다 결과가 달라진다.
시드는 무작위성을 없애는 장치가 아니라 무작위성을 기록 가능하게 만드는 장치다. 실험은 여전히 무작위 선택을 하지만, 어떤 무작위 선택을 했는지가 시드 하나로 재생 가능해진다.
"내 실험엔 난수가 없다"고 생각하기 쉽지만, 전형적인 ML/LLM 실험에는 무작위성이 여러 층으로 스며 있다.
| 층위 | 무작위성의 원천 | 예시 |
|---|---|---|
| 데이터 | train/val/test 분할, 셔플, 서브샘플링 | 분할이 달라지면 test 난이도 자체가 달라진다 (분할 절차는 6강) |
| 모델 학습 | 가중치 초기화, 드롭아웃, 미니배치 순서 | 같은 데이터라도 초기화에 따라 다른 지점에 수렴한다 |
| 생성/추론 | 샘플링 디코딩(temperature > 0) | 같은 프롬프트에 다른 답이 나온다 |
| 평가 설계 | 보기 순서 섞기, few-shot 예시 선택 | 4지선다에서 정답 위치를 섞는 것도 난수다 |
| 하드웨어 | GPU 병렬 연산의 비결정적 커널 | 시드를 고정해도 부동소수점 합산 순서가 달라질 수 있다 |
LLM을 API로 평가하는 실험이라면 한 층이 더 있다. temperature를 0으로 두어도 서버 측 구현 때문에 출력이 완전히 결정적이지 않을 수 있고, 모델 자체가 예고 없이 업데이트되기도 한다. 그래서 모델 이름뿐 아니라 모델 버전(스냅샷)과 평가 일시를 기록하는 것이 시드 고정과 같은 역할을 한다.
같은 코드, 같은 데이터, 같은 하이퍼파라미터로 시드만 바꿔 5번 돌리면 성능이 몇 %p씩 다르게 나오는 일은 흔하다. 이때 시드 1개로 얻은 숫자는 그 분포에서 뽑은 표본 하나일 뿐이다. 8강에서 다뤘듯 요약값은 분산을 함께 봐야 의미가 있는데, 단일 시드 보고는 분산 정보를 아예 만들지 않는다.
문제는 이 흔들림이 종종 비교하려는 효과보다 크다는 데 있다. 제안 기법이 baseline보다 1.5%p 좋다는 주장을 하고 싶은데 시드 간 표준편차가 2%p라면, 그 1.5%p는 기법의 효과가 아니라 시드 운일 수 있다.
더 위험한 것은 선택 편향이다. 시드 하나로 돌렸는데 결과가 나쁘면 "뭔가 잘못됐나" 하고 다시 돌리고, 좋으면 멈추고 보고한다. 이렇게 되면 보고된 숫자는 무작위 표본이 아니라 좋은 쪽으로 걸러진 표본이다. 여러 시드를 돌려 놓고 가장 좋은 것만 보고하는 노골적인 경우가 아니어도, "잘 나올 때까지 재시도"만으로 같은 왜곡이 생긴다. 이는 15강에서 다루는 사후 선택 문제의 한 형태다.
이런 관행에는 "시드 복권(seed lottery)"이라는 이름까지 붙어 있다. 복권에 당첨된 시드로 낸 결과는 다른 연구자가 자기 시드로 돌리는 순간 재현되지 않는다.
심층 강화학습 분야에서는 이 문제가 정면으로 지적된 적이 있다. 널리 인용되는 한 재현성 연구는 당시 표준이던 강화학습 알고리즘들을 동일한 조건에서 시드만 바꿔 반복 실행했는데, 완전히 같은 알고리즘·같은 하이퍼파라미터에서도 시드에 따라 학습 곡선이 전혀 다른 모양이 나왔다. 심지어 같은 알고리즘의 실행들을 시드 기준으로 두 묶음으로 나누어 평균을 그리면, 마치 서로 다른 두 알고리즘을 비교한 것처럼 벌어진 그래프가 만들어졌다. 소수의 시드로 "우리 알고리즘이 더 낫다"고 결론 내리는 당시 논문 관행이 통계적으로 근거가 없다는 것을 보여준 것이다. 이 연구 이후 강화학습 논문에서 다중 시드 보고와 분산 표기가 사실상 필수 관례가 되었다.
ML 바깥에서도 교훈은 같다. 심리학 분야의 대규모 재현성 프로젝트는 저명 학술지에 실린 연구 약 100편을 원저자 협조하에 다시 실험했는데, 절반에 못 미치는 연구만이 원래 결과를 재현했다. 무작위성과 선택 편향을 통제하지 않은 단일 실행 보고가 분야 전체의 신뢰를 흔들 수 있음을 보여준 사건이다.
정답 숫자는 없지만 관례적 하한은 있다. 학습이 포함된 실험이라면 최소 3개, 가능하면 5개 이상의 시드로 전체 파이프라인을 반복한다. 시드 간 분산이 크거나 주장하려는 효과가 작을수록 더 많은 시드가 필요하다. 이 판단은 12강의 검정력 논리와 정확히 같다. 반복 횟수는 곧 표본 크기다.
주의: 반복의 단위는 "학습만 다시"가 아니라 무작위성이 개입하는 구간 전체다. 데이터 셔플부터 시드의 영향을 받는다면 셔플부터 반복해야 한다.
시드 값 자체는 아무래도 좋다. 좋은 시드를 "찾는" 순간 그 자체가 체리피킹이다. 중요한 것은 결과를 보기 전에 시드 목록을 고정하는 것이다. 예를 들어 "0, 1, 2, 3, 4의 5개 시드를 쓴다"를 실험 전에 설정 파일에 적어 두면, 나중에 특정 시드를 빼거나 추가할 유혹이 구조적으로 차단된다. 이렇게 결과를 보기 전에 결정을 고정하는 원칙은 14강 사전 등록의 핵심이기도 하다.
수식으로 쓰면, 시드 에서 얻은 성능 에 대해 와 표준편차를 함께 보고하고, "제안 기법 − baseline" 차이도 시드별 차이의 분포로 판단한다.
연구실 하네스가 단일 시드 결과의 집계를 에러로 거부하도록 만들어 두는 것도 좋은 방법이다. 규칙을 문서에 적는 것보다 코드가 강제하는 쪽이 확실하다. 파이프라인 수준에서 시드를 고정·기록하는 방법은 20강에서 다룬다.
시드를 고정해도 결과가 미세하게 달라지는 경우가 있다. 대표적 원인이 GPU다. 병렬 연산에서 부동소수점 덧셈 순서가 실행마다 달라질 수 있고, 인 부동소수점 특성 때문에 미세한 오차가 생겨 학습이 진행되며 증폭된다. 일부 GPU 커널은 아예 비결정적으로 구현되어 있다.
그래서 재현성에는 두 단계가 있다.
torch.use_deterministic_algorithms(True)로 비결정적 커널 사용 시 경고가 아니라 예외를 던지게 강제할 수 있다. 속도가 다소 느려질 수 있어, 탐색 단계에서는 끄고 논문에 들어갈 최종 실행에서는 켜는 식으로 운용한다.둘은 대체 관계가 아니다. 결정론은 "내 숫자를 내가 다시 만들 수 있는가"에 답하고, 다중 시드는 "내 결론이 시드 운이 아닌가"에 답한다. 결정론적으로 돌린 단일 시드 실험은 완벽히 재현되는 우연일 수 있다.
용어를 구분하면: 같은 팀이 같은 환경에서 다시 돌려 같은 결과를 얻는 것이 반복성(repeatability), 다른 연구자가 공개된 코드·데이터로 같은 결과를 얻는 것이 재현성(reproducibility), 다른 연구자가 독립적인 구현·데이터로 같은 결론에 도달하는 것이 재검증성(replicability)이다. 시드 고정과 결정론은 앞의 두 단계를, 다중 시드와 정직한 분산 보고는 마지막 단계를 떠받친다.
시드는 무작위성 축을 고정하지만, 실험 결과를 결정하는 축은 그 밖에도 있다. 같은 시드로 돌려도 다음이 달라지면 결과가 달라진다.
정리하면 하나의 실험 결과는 (코드 버전, 데이터 버전, 설정, 시드, 환경)의 조합이 만든 것이고, 이 다섯을 모두 기록해야 "같은 실험"을 다시 정의할 수 있다. 이 조합을 사람 손이 아니라 파이프라인이 자동으로 묶어 기록하게 만드는 방법은 20강에서 다룬다.
한 가지 상호작용에 주의한다. 하이퍼파라미터 탐색과 시드 반복을 섞으면 안 된다. 탐색 단계에서 여러 설정을 시드 1개씩으로 훑는 것은 괜찮지만, 최종 비교는 확정된 설정에 대해 다중 시드로 돌린다. 설정마다 최고 시드를 골라 비교하면 이중으로 체리피킹이 된다. 또한 이 모든 반복에서 test는 여전히 마지막에 한 번만 연다. 시드를 늘린다고 test를 여러 번 볼 권리가 생기는 것이 아니다 (6강).
한국어 초성 줄임말을 LLM이 이해하는지 4지선다로 평가하는 실험을 예로 들면, 무작위성이 개입하는 지점과 통제 방법은 다음과 같다.
| 무작위성 지점 | 통제 방법 |
|---|---|
| 문항별 보기(정답 위치) 배치 | 시드로 셔플을 고정하고, 시드별로 배치를 바꿔 반복 (위치 편향 자체는 19강) |
| few-shot 예시 선택 | 예시 풀에서 시드 기반 추출, 시드 목록 사전 고정 |
| 디코딩 | 가능하면 greedy(temperature 0), 샘플링이 필요하면 디코딩 시드를 조건 간 동일하게 |
| 모델 측 변동 | 모델 스냅샷 버전·호출 일시 기록, 기간을 두고 재호출해 응답 안정성 확인 |
이 실험에서 "GPT 계열이 오픈 모델보다 5%p 높다"고 주장하려면, 보기 배치 시드를 바꾼 반복에서도 그 차이가 유지되는지 보여야 한다. 배치 시드 하나에서만 성립하는 차이는 모델 실력 차이가 아니라 특정 배치와 모델 편향의 상호작용일 수 있다.
실험을 설계할 때 다음 순서로 점검한다.
이 중 3번과 4번은 통계 이전에 정직성의 문제다. 시드는 기술적 장치이지만, 시드를 다루는 절차는 15강의 사후 선택 문제와 14강의 사전 등록으로 이어지는 연구 윤리의 일부다.