Актуальные темы
#
Bonk Eco continues to show strength amid $USELESS rally
#
Pump.fun to raise $1B token sale, traders speculating on airdrop
#
Boop.Fun leading the way with a new launchpad on Solana.
В сегодняшнем эпизоде программного ужаса...
В документации Python по random.seed() мы читаем:
"Если a - это int, он используется напрямую." [1]
Но если вы используете 3 или -3 в качестве начального значения, вы на самом деле получаете один и тот же объект rng, производящий одинаковые потоки. (TIL). В nanochat я использовал знак как (как я думал) умный способ получить разные последовательности rng для разделения на обучающую/тестовую выборки. В результате возникла странная ошибка, потому что теперь train=test.
Я нашел код CPython, ответственный за это, в cpython/Modules/_randommodule.c [2], где в комментарии на строке 321 мы видим:
"Этот алгоритм зависит от того, что число является беззнаковым. Итак: если аргумент - это PyLong, используйте его абсолютное значение." за которым следует
n = PyNumber_Absolute(arg);
что явно вызывает abs() на вашем начальном значении, чтобы сделать его положительным, отбрасывая знак.
Но этот комментарий на самом деле тоже неверен/вводит в заблуждение. На самом деле, Python вызывает алгоритм Mersenne Twister MT19937, который в общем случае имеет 19937 (не нулевых) бит состояния. Python берет ваш int (или другие объекты) и "распределяет" эту информацию по этим битам. В принципе, бит знака мог бы быть использован для увеличения бит состояния. Ничто в алгоритме не "зависит от того, что число является беззнаковым". Было принято решение не включать бит знака (что, на мой взгляд, было ошибкой). Один тривиальный пример мог бы заключаться в том, чтобы сопоставить n -> 2*abs(n) + int(n < 0).
В конце концов, это приводит нас к контракту Python's random, который также не полностью изложен в документации. Упоминается контракт, который гласит:
одинаковое начальное значение => одинаковая последовательность.
Но нет гарантии, что разные начальные значения производят разные последовательности. Таким образом, в принципе, Python не дает никаких обещаний, что, например, seed(5) и seed(6) - это разные потоки rng. (Хотя это довольно часто подразумевается во многих приложениях.) Действительно, мы видим, что seed(5) и seed(-5) - это идентичные потоки. И вам, вероятно, не следует использовать их для разделения ваших обучающих/тестовых поведений в машинном обучении. Это один из более забавных программных ужасов, с которыми я столкнулся в последнее время. Увидимся в следующем эпизоде.
[1]
[2]

Топ
Рейтинг
Избранное
