오늘의 공포 프로그램 에피소드에서는... random.seed() def의 Python 문서에서 다음과 같이 언급됩니다. "a가 int이면 직접 사용됩니다."[1] 하지만 3이나 -3으로 시드를 적용하면 실제로는 정확히 동일한 RNG 객체를 얻고, 동일한 스트림을 생성합니다. (TIL). 나노챗에서 저는 (제 생각에는) 학습/테스트 분할에 대해 서로 다른 RNG 시퀀스를 얻는 영리한 방법으로 이 기호를 사용했습니다. 그래서 이제 학습=테스트가 되어서 심각한 버그가 발생합니다. 저는 cpython/Modules/_randommodule.c [2]에서 책임이 있는 CPython 코드를 찾았습니다. 그 321번째 줄에서 다음과 같은 주석을 볼 수 있습니다. "이 알고리즘은 부호 없는 숫자에 의존합니다. 따라서 인수가 PyLong이면 절대값을 사용합니다." 다음에 n = PyNumber_Absolute(인수); 이는 시드에 대해 명시적으로 abs()를 호출하여 부호 비트를 삭제하고 양수로 만듭니다. 하지만 이 댓글 역시 사실 틀렸거나 오해의 소지가 있습니다. 내부적으로 파이썬은 메르센 트위스터 MT19937 알고리즘을 호출하는데, 일반적으로 이 알고리즘은 19937개(0이 아닌) 비트의 상태를 갖습니다. 파이썬은 int(또는 다른 객체)를 받아서 해당 정보를 이 비트들에 "분산"합니다. 원칙적으로 부호 비트는 상태 비트를 늘리는 데 사용될 수 있었습니다. 이 알고리즘에는 "부호 없는 숫자에 의존하는" 부분이 없습니다. 부호 비트를 포함하지 않기로 결정했는데, 제 생각에는 실수였습니다. 간단한 예로 n을 2*abs(n) + int(n 같은 시퀀스. 하지만 다른 시드가 다른 시퀀스를 생성한다는 보장은 없습니다. 따라서 원칙적으로 Python은 seed(5)와 seed(6)가 서로 다른 rng 스트림이라고 보장하지 않습니다. (물론 많은 애플리케이션에서 암묵적으로 가정하는 경우가 많지만요.) 실제로 seed(5)와 seed(-5)는 동일한 스트림입니다. 따라서 머신 러닝에서 학습/테스트 동작을 구분하는 데 이 두 스트림을 사용해서는 안 됩니다. 제가 최근에 접한 가장 재밌는 프로그래밍 공포 장면 중 하나입니다. 다음 에피소드에서 뵙겠습니다. [1] https://t.co/srv1ZBlDsi [2]
버그를 발견해 준 github의 ericsilberstein1에게 감사드립니다. https://tgithub.com/karpathy/nanoc…아니고 SpellingBee 합성 과제 평가에서만 나타납니다).
![오늘의 공포 프로그램 에피소드에서는...
random.seed() def의 Python 문서에서 다음과 같이 언급됩니다.
"a가 int이면 직접 사용됩니다."[1]
하지만 3이나 -3으로 시드를 적용하면 실](https://pbs.twimg.com/media/G7sc167aMAAuZi5.png)