Актуальні теми
#
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() def. нам кажуть
"Якщо a — це інтелект, його використовують безпосередньо." [1]
Але якщо ви сідуєте з 3 або -3, ви отримуєте той самий об'єкт випадковості, що створює ті самі потоки. (Сьогодні дізнався). У Nanochat я використовував цей знак як (як мені здавалося) розумний спосіб отримати різні послідовності RNG для тренування/тестового спліту. Ось чому це жахлива помилка, бо тепер train=test.
Я знайшов код CPython, відповідальний у cpython/Modules/_randommodule.c [2], де на рядку 321 ми бачимо в коментарі:
"Цей алгоритм базується на тому, що номер не підписаний. Отже: якщо arg — це PyLong, використовуйте його абсолютне значення.» після чого слідує
n = PyNumber_Absolute(arg);
який явно викликає abs() на вашому сіді, щоб зробити його позитивним, відкидаючи біт знаку.
Але цей коментар насправді неправильний і вводить в оману. Під капотом Python викликає алгоритм Mersenne Twister MT19937, який у загальному випадку має стан бітів 19937 (ненульова). Python бере ваш int (або інші об'єкти) і «розподіляє» цю інформацію по цих бітах. У принципі, біт знаку міг би використовуватися для доповнення бітів стану. В алгоритмі немає нічого, що «покладається на непідписане число». Було прийнято рішення не включати знак (що, на мою думку, було помилкою). Одним із тривіальних прикладів могло б бути відображення n -> 2*abs(n) + int(n < 0).
Нарешті, це приводить нас до контракту випадкового Python, який також не повністю викладений у документації. Договір, який згадується, такий:
те саме насіння => та сама послідовність.
Але немає гарантії, що різні насінини дають різні послідовності. Отже, в принципі, Python не дає жодних гарантій, що, наприклад, seed(5) і seed(6) — це різні потоки випадковості. (Хоча це досить часто неявно припускається у багатьох застосуваннях.) Справді, ми бачимо, що seed(5) і seed(-5) — це ідентичні потоки. І, ймовірно, не варто використовувати їх для розділення поведінки тренувань/тестування в машинному навчанні. Один із найкумедніших програмуючих хорорів, з якими я нещодавно стикався. Побачимось у наступному епізоді.
[1]
[2]

Найкращі
Рейтинг
Вибране

