Czy możliwe jest zasilanie sieci neuronowej wyjściem z generatora liczb losowych i oczekiwanie, że nauczy się funkcji mieszania (lub generatora), aby mógł przewidzieć, jaka będzie kolejna generowana liczba pseudolosowa ?
Czy coś takiego już istnieje? Jeśli badania zostały już przeprowadzone w tej sprawie lub w związku z czymś (z przewidywaniem liczb pseudolosowych), czy ktoś może wskazać mi odpowiednie zasoby?
Obecnie patrzę na tę bibliotekę i powiązane linki. https://github.com/Vict0rSch/deep_learning/tree/master/keras/recurrent
Odpowiedzi:
Jeśli mówimy o idealnym RNG, odpowiedź brzmi „ nie” . Nie można przewidzieć prawdziwie losowej liczby, w przeciwnym razie nie byłby to prawdziwy los.
Kiedy mówimy o pseudo RNG, rzeczy się nieco zmieniają. W zależności od jakości PRNG problem waha się od łatwego do prawie niemożliwego. Bardzo słaby PRNG, taki jak opublikowany XKCD, można oczywiście łatwo przewidzieć za pomocą sieci neuronowej o niewielkim stopniu szkolenia. Ale w prawdziwym świecie rzeczy wyglądają inaczej.
Sieć neuronowa może zostać przeszkolona do znajdowania pewnych wzorców w historii liczb losowych generowanych przez PRNG w celu przewidywania następnego bitu. Im silniejszy staje się PRNG, tym więcej neuronów wejściowych jest wymaganych, zakładając, że używasz jednego neuronu na każdy bit wcześniejszej losowości wygenerowanej przez PRNG. Im mniej przewidywalny jest PRNG, tym więcej danych będzie potrzebnych do znalezienia jakiegoś wzorca. W przypadku silnych PRNG nie jest to możliwe.
Pozytywnie, pomocne jest wygenerowanie dowolnej liczby wzorców treningowych dla sieci neuronowej, przy założeniu, że masz kontrolę nad PRNG i możesz wygenerować dowolną liczbę losową.
Ponieważ współczesne PRNG są kluczowym składnikiem kryptografii, przeprowadzono szeroko zakrojone badania w celu sprawdzenia, czy są one „wystarczająco losowe”, aby wytrzymać takie ataki predykcyjne. Dlatego jestem pewien, że przy obecnie dostępnych zasobach obliczeniowych nie jest możliwe zbudowanie sieci neuronowej w celu skutecznego ataku na PRNG, który jest uważany za bezpieczny dla kryptografii.
Warto również zauważyć, że nie jest konieczne dokładne przewidywanie wyniku PRNG, aby złamać kryptografię - może być wystarczające, aby przewidzieć następny bit z pewnością nieco ponad 50%, aby znacznie osłabić implementację. Więc jeśli jesteś w stanie zbudować sieć neuronową, która przewiduje następny kawałek PRNG (uważany za bezpieczny dla kryptografii) z 55% wskaźnikiem sukcesu, prawdopodobnie trafisz na nagłówki wiadomości o bezpieczeństwie przez dłuższy czas.
źródło
Będąc kompletnym nowicjuszem w uczeniu maszynowym, przeprowadziłem ten eksperyment (używając Scikit-learn):
Wygenerowano dużą liczbę (N) ekstrakcji pseudolosowych, używając funkcji random.choices w Pythonie do wybrania N liczb spośród 90.
Przeszkoliłem klasyfikatora MLP z danymi treningowymi złożonymi w następujący sposób:
W praktyce dążyłem do funkcji, która dała N liczb, mogłem przewidzieć następną.
Poprosił przeszkolonego klasyfikatora, aby przewidział pozostałe liczby.
Wyniki:
oczywiście klasyfikator uzyskał zwycięski wynik porównywalny z losowym zgadywaniem lub innymi technikami nieopartymi na sieciach neuronowych (porównałem wyniki z kilkoma klasyfikatorami dostępnymi w bibliotekach scikit-learn)
jeśli jednak wygeneruję pseudolosowe ekstrakcje loterii z określoną funkcją rozkładu, wówczas liczby przewidywane przez sieć neuronową są generowane z grubsza z tą samą krzywą rozkładu (jeśli wykreślisz występowanie liczb losowych i prognoz sieci neuronowej, widać, że oba mają ten sam trend, nawet jeśli na krzywej predykcji jest wiele pików. Może więc sieć neuronowa jest w stanie dowiedzieć się o rozkładach liczb pseudolosowych?
Jeśli zmniejszę rozmiar zestawu treningowego poniżej pewnego limitu, widzę, że klasyfikator zaczyna przewidywać zawsze te same liczby, które należą do najczęstszych w generowaniu pseudolosowym. O dziwo (a może nie) to zachowanie wydaje się nieznacznie zwiększać wygrany wynik.
źródło
Stare pytanie, ale pomyślałem, że warto jedną praktyczną odpowiedź. Zdarzyło mi się, że natknąłem się na nią zaraz po przejrzeniu przewodnika, jak zbudować taką sieć neuronową, demonstrując echo randintonu pytona jako przykład . Oto końcowy kod bez szczegółowego wyjaśnienia, wciąż dość prosty i przydatny w przypadku, gdy link przejdzie w tryb offline:
Właśnie próbowałem i to naprawdę działa całkiem dobrze! Zajęło mi to tylko kilka minut na moim starym wolnym netbooku. Oto moje własne wyniki, inne niż powyższy link, i widać, że dopasowanie nie jest idealne, więc przypuszczam, że kryteria wyjścia są nieco zbyt liberalne:
źródło
Jeśli generator liczb losowych w psuedo wyrzuca liczby, wówczas w analizie tych liczb będziesz mógł określić algorytm, który je wytworzył, ponieważ liczby nie są losowe, są one określane przez ten algorytm i nie są przypadkowe. Jeśli świat składa się z praw fizycznych, które można zrozumieć i powielić, to pozorna przypadkowość, którą obserwujemy w wydarzeniach, zależy od tych praw fizycznych. a generator psuedo nie jest już i jest faktyczną przypadkowością, która z jego definicji jest nieokreślona i stanowi paradoks. W jaki sposób reguły mogą tworzyć losowość z definicji, z pewnością nasze pozorne postrzeganie losowości obserwowanych zdarzeń jest aluzją i jest w rzeczywistości pewnością, której nie jesteśmy w stanie przewidzieć.
źródło
Oprócz tego, co powiedział Demento, kluczową kwestią jest zakres losowości w algorytmie generowania liczb losowych. Poniżej znajdują się niektóre projekty, które mogą osłabić RNG:
Sekwencje ukryte
Załóżmy, że jest to kilka poprzednich wygenerowanych sekwencji znaków: (Dla przykładu użyto większego zakresu)
Początkowo nie można zaobserwować żadnego wzorca w pokoleniach, ale zmieniając go na kodowanie Base64, a następnie na hex, otrzymujemy:
Teraz, jeśli odejmiemy każdą liczbę od poprzedniej, otrzymamy:
Wskazuje to, że algorytm po prostu dodaje 0x97C4EB6A do poprzedniej wartości, obcina wynik do liczby 32-bitowej i koduje Base64 dane.
Powyżej jest podstawowym przykładem. Dzisiejsze algorytmy i systemy ML są w stanie uczyć się i przewidywać bardziej złożone wzorce.
Zależność czasowa
Niektóre algorytmy RNG wykorzystują czas jako główny wkład do generowania liczb losowych, zwłaszcza te stworzone przez samych programistów do wykorzystania w ich aplikacji.
Ilekroć wdrażane są słabe algorytmy RNG, które wydają się stochastyczne, można je ekstrapolować do przodu lub do tyłu z idealną dokładnością, jeśli dostępny jest wystarczający zestaw danych.
źródło