Popularne tematy
#
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.
W dzisiejszym odcinku programistycznego horroru...
W dokumentacji Pythona dotyczącej random.seed() mówimy:
"Jeśli a jest liczbą całkowitą, jest używane bezpośrednio." [1]
Ale jeśli użyjesz nasion 3 lub -3, otrzymasz dokładnie ten sam obiekt rng, produkujący te same strumienie. (TIL). W nanochat używałem znaku jako (jak myślałem) sprytnego sposobu na uzyskanie różnych sekwencji rng dla podziałów treningowych/testowych. Stąd paskudny błąd, ponieważ teraz train=test.
Znalazłem kod CPython odpowiedzialny za to w cpython/Modules/_randommodule.c [2], gdzie w linii 321 widzimy w komentarzu:
"Ten algorytm opiera się na tym, że liczba jest bez znaku. Więc: jeśli argument jest PyLong, użyj jego wartości bezwzględnej." a następnie
n = PyNumber_Absolute(arg);
co wyraźnie wywołuje abs() na twoim nasieniu, aby uczynić je dodatnim, odrzucając bit znaku.
Ale ten komentarz jest również błędny/mylny. Pod maską Python wywołuje algorytm Mersenne Twister MT19937, który w ogólnym przypadku ma 19937 (niezerowych) bitów stanu. Python bierze twoją liczbę całkowitą (lub inne obiekty) i "rozprzestrzenia" te informacje po tych bitach. Zasadniczo bit znaku mógł być użyty do zwiększenia bitów stanu. Nie ma nic w algorytmie, co "opiera się na tym, że liczba jest bez znaku". Podjęto decyzję, aby nie uwzględniać bitu znaku (co moim zdaniem było błędem). Jednym z trywialnych przykładów mogłoby być mapowanie n -> 2*abs(n) + int(n < 0).
Na koniec prowadzi nas to do kontraktu Pythona dotyczącego random, który również nie jest w pełni opisany w dokumentacji. Wspomniany kontrakt to:
to samo nasienie => ta sama sekwencja.
Ale nie ma gwarancji, że różne nasiona produkują różne sekwencje. Więc w zasadzie Python nie obiecuje, że np. seed(5) i seed(6) to różne strumienie rng. (Chociaż to dość powszechnie zakłada się w wielu aplikacjach.) Rzeczywiście, widzimy, że seed(5) i seed(-5) to identyczne strumienie. I prawdopodobnie nie powinieneś ich używać do oddzielania swoich zachowań treningowych/testowych w uczeniu maszynowym. Jeden z bardziej zabawnych programistycznych horrorów, które ostatnio napotkałem. Do zobaczenia w następnym odcinku.
[1]
[2]

Najlepsze
Ranking
Ulubione
