En el episodio de hoy de terror de programación... En la documentación de Python de la definición de random.seed(), se nos dice "Si a es un int, se utiliza directamente." [1] Pero si se inicializa con 3 o -3, se obtiene exactamente el mismo objeto de generador de números aleatorios (RNG), lo que produce los mismos flujos. (TIL). En nanochat, usaba el signo como una forma (creía) inteligente de obtener diferentes secuencias de generador de números aleatorios para las divisiones de entrenamiento/prueba. De ahí el error, ya que ahora entrenamiento=prueba. Encontré el código CPython responsable en cpython/Modules/_randommodule.c [2], donde en la línea 321 vemos en un comentario: Este algoritmo se basa en que el número no tenga signo. Por lo tanto, si el argumento es un PyLong, se usa su valor absoluto. Seguido de n = PyNumber_Absolute(arg); que llama explícitamente a abs() en su semilla para hacerla positiva, descartando el bit de signo. Pero este comentario también es erróneo o engañoso. Internamente, Python llama al algoritmo Mersenne Twister MT19937, que generalmente tiene 19937 bits de estado (distintos de cero). Python toma un int (u otros objetos) y distribuye esa información entre estos bits. En principio, el bit de signo podría haberse usado para aumentar los bits de estado. El algoritmo no requiere que el número tenga signo. Se decidió no incorporar el bit de signo (lo cual, en mi opinión, fue un error). Un ejemplo trivial podría haber sido mapear n -> 2*abs(n) + int(n misma secuencia. Pero no se garantiza que diferentes semillas produzcan secuencias diferentes. Por lo tanto, en principio, Python no promete que, por ejemplo, seed(5) y seed(6) sean flujos de generador de números aleatorios (RNG) diferentes. (Aunque esto se asume implícitamente con bastante frecuencia en muchas aplicaciones). De hecho, vemos que seed(5) y seed(-5) son flujos idénticos. Y probablemente no deberías usarlos para separar tus comportamientos de entrenamiento/prueba en aprendizaje automático. Uno de los problemas de programación más divertidos que he encontrado últimamente. Nos vemos en el próximo episodio. [1] https://t.co/srv1ZBlDsi [2]
Gracias a ericsilberstein1 en github por detectar el ergithub.com/karpathy/nanoc…CiivgN (no es un error grave y solo aparece en la evaluación de tareas sintéticas de SpellingBee, pero aún así).
