È possibile utilizzare una rete neurale per prevedere il prossimo numero pseudo casuale?


17

È possibile alimentare una rete neurale in uscita da un generatore di numeri casuali e aspettarsi che apprenda la funzione di hashing (o generatore), in modo che possa prevedere quale sarà il prossimo numero pseudo-casuale generato ?

Esiste già qualcosa del genere? Se la ricerca è già stata fatta su questo o qualcosa correlato (alla previsione di numeri pseudo-casuali), qualcuno può indicarmi le giuste risorse?

Attualmente, sto esaminando questa libreria e i relativi collegamenti. https://github.com/Vict0rSch/deep_learning/tree/master/keras/recurrent


Risposte:


13

Se stiamo parlando di un RNG perfetto, la risposta è un chiaro no . È impossibile prevedere un numero veramente casuale, altrimenti non sarebbe davvero casuale.

Quando parliamo di pseudo RNG, le cose cambiano un po '. A seconda della qualità del PRNG, il problema varia da facile a quasi impossibile. Un PRNG molto debole come quello pubblicato da XKCD potrebbe ovviamente essere facilmente previsto da una rete neurale con scarso addestramento. Ma nel mondo reale le cose sembrano diverse.

La rete neurale potrebbe essere addestrata per trovare determinati schemi nella storia dei numeri casuali generati da un PRNG per prevedere il bit successivo. Più forte diventa il PRNG, più sono necessari i neuroni di input, supponendo che tu stia usando un neurone per ogni bit di casualità precedente generata dal PRNG. Meno è prevedibile il PRNG, più dati saranno necessari per trovare una sorta di modello. Per PRNG forti questo non è fattibile.

Sul versante positivo, è utile generare una quantità arbitraria di schemi di allenamento per la rete neurale, supponendo che si abbia il controllo sul PRNG e che sia possibile produrre tutti i numeri casuali desiderati.

Poiché i PRNG moderni sono un componente chiave per la crittografia, sono state condotte ricerche approfondite per verificare che siano "abbastanza casuali" per resistere a tali attacchi di predizione. Pertanto sono abbastanza sicuro che con le risorse di calcolo attualmente disponibili non è possibile costruire una rete neurale per attaccare con successo un PRNG considerato sicuro per la crittografia.

Vale anche la pena notare che non è necessario prevedere esattamente l'output di un PRNG per interrompere la crittografia: potrebbe essere sufficiente prevedere il bit successivo con una certezza di poco più del 50% per indebolire un'implementazione in modo significativo. Quindi, se sei in grado di costruire una rete neurale che prevede il prossimo bit di un PRNG (considerato sicuro per la crittografia) con un tasso di successo del 55%, probabilmente farai i titoli delle notizie sulla sicurezza per un po '.


2
Wow, grazie per la spiegazione dietro questo. Sto cercando di analizzare il modello e prevedere il prossimo bit e non è un RNG perfetto, ma un PRNG piuttosto solido. Ma non è neanche all'avanguardia. Penso che con un po 'di potenza computazionale e una corretta implementazione non potrei prevederlo con il 60-70% se non di più. Se possibile, puoi indicare qualsiasi risorsa dove posso leggere di più su questo. Non vengo da un background di ricerca e più da uno sviluppatore.
AshTyson,

3

Essendo un principiante assoluto nell'apprendimento automatico, ho fatto questo esperimento (usando Scikit-learn):

  • Ha generato un gran numero (N) di estrazioni pseudo-casuali, usando la funzione python random.choices per selezionare N numeri su 90.

  • Ha formato un classificatore MLP con i dati di allenamento composti come segue:

    • con esempio: X <- lotteryResults [i: i + 100], Y <- lotteryResults [i]

    In pratica, miravo a una funzione che forniva N numeri, prevedendo il prossimo.

  • Ha chiesto al classificatore addestrato di prevedere i numeri rimanenti.

risultati:

  • ovviamente, il classificatore ha ottenuto un punteggio vincente paragonabile a quello delle ipotesi casuali o di altre tecniche non basate su reti neurali (ho confrontato i risultati con diversi classificatori disponibili nelle librerie di scikit-learn)

  • tuttavia, se generi estrazioni pseudo-casuali della lotteria con una funzione di distribuzione specifica, i numeri previsti dalla rete neurale vengono generati approssimativamente con la stessa curva di distribuzione (se tracciate le occorrenze dei numeri casuali e delle previsioni della rete neurale, puoi vedere che i due hanno la stessa tendenza, anche se nella curva delle previsioni ci sono molti picchi, quindi forse la rete neurale è in grado di conoscere le distribuzioni di numeri pseudo-casuali?

  • Se riduco le dimensioni del set di addestramento sotto un certo limite, vedo che il classificatore inizia a prevedere sempre gli stessi pochi numeri, che sono tra i più frequenti nella generazione pseudo-casuale. Stranamente (o forse no) questo comportamento sembra aumentare leggermente il punteggio vincente.


3

Vecchia domanda, ma ho pensato che valesse una risposta pratica. Mi è capitato di imbatterci subito dopo aver visto una guida su come costruire una tale rete neurale, dimostrando come esempio l' eco del randint di Python . Ecco il codice finale senza spiegazioni dettagliate, ancora abbastanza semplice e utile nel caso in cui il link non sia in linea:

from random import randint
from numpy import array
from numpy import argmax
from pandas import concat
from pandas import DataFrame
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense

# generate a sequence of random numbers in [0, 99]
def generate_sequence(length=25):
    return [randint(0, 99) for _ in range(length)]

# one hot encode sequence
def one_hot_encode(sequence, n_unique=100):
    encoding = list()
    for value in sequence:
        vector = [0 for _ in range(n_unique)]
        vector[value] = 1
        encoding.append(vector)
    return array(encoding)

# decode a one hot encoded string
def one_hot_decode(encoded_seq):
    return [argmax(vector) for vector in encoded_seq]

# generate data for the lstm
def generate_data():
    # generate sequence
    sequence = generate_sequence()
    # one hot encode
    encoded = one_hot_encode(sequence)
    # create lag inputs
    df = DataFrame(encoded)
    df = concat([df.shift(4), df.shift(3), df.shift(2), df.shift(1), df], axis=1)
    # remove non-viable rows
    values = df.values
    values = values[5:,:]
    # convert to 3d for input
    X = values.reshape(len(values), 5, 100)
    # drop last value from y
    y = encoded[4:-1,:]
    return X, y

# define model
model = Sequential()
model.add(LSTM(50, batch_input_shape=(5, 5, 100), stateful=True))
model.add(Dense(100, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
# fit model
for i in range(2000):
    X, y = generate_data()
    model.fit(X, y, epochs=1, batch_size=5, verbose=2, shuffle=False)
    model.reset_states()
# evaluate model on new data
X, y = generate_data()
yhat = model.predict(X, batch_size=5)
print('Expected:  %s' % one_hot_decode(y))
print('Predicted: %s' % one_hot_decode(yhat))

Ho appena provato e funziona davvero abbastanza bene! Ho impiegato solo un paio di minuti sul mio vecchio netbook lento. Ecco il mio output personale, diverso dal link sopra e puoi vedere che la corrispondenza non è perfetta, quindi suppongo che i criteri di uscita siano un po 'troppo permissivi:

...
 - 0s - loss: 0.2545 - acc: 1.0000
Epoch 1/1
 - 0s - loss: 0.1845 - acc: 1.0000
Epoch 1/1
 - 0s - loss: 0.3113 - acc: 0.9500
Expected:  [14, 37, 0, 65, 30, 7, 11, 6, 16, 19, 68, 4, 25, 2, 79, 45, 95, 92, 32, 33]
Predicted: [14, 37, 0, 65, 30, 7, 11, 6, 16, 19, 68, 4, 25, 2, 95, 45, 95, 92, 32, 33]

Questo non sta imparando a prevedere la sequenza casuale, sta imparando a fare eco. Concretamente, i campioni di addestramento, X, sono composti da 5 numeri interi casuali e l'output, y, è il 4o numero intero di 5. Ad esempio, se X = [15, 33, 44, 30, 3], y = 30. LSTM sta imparando a fare eco al quarto campione.
thinkski

Sì, buon punto. Trovo ancora che sia un esempio pratico molto interessante dell'uso di LSTM. Se sai come imparare qualcosa come Mersenne Twister dal seme dato solo come input, per favore pubblicalo qui come sarei davvero interessato a vedere. Sembra possibile con abbastanza campioni, ma potrei sbagliarmi completamente.
isp-zax

2

Se un generatore di numeri casuali psuedo sta lanciando numeri, allora nell'analisi di questi numeri sarai in grado di determinare l'algoritmo che li ha prodotti perché i numeri non sono casuali, sono determinati da quell'algoritmo e non sono casuali. Se il mondo è fatto di leggi fisiche che possono essere comprese e replicate rispetto all'apparente casualità che osserviamo negli eventi, dipende da quelle leggi fisiche. e il generatore di psuedo non è più, ed è casualità effettiva che dalla sua definizione è indeterminabile e presenta un paradosso. Come possono le regole creare casualità per definizione sicuramente la nostra percezione apparente della casualità degli eventi che osserviamo è un'allusione ed è in realtà una certezza che non siamo in grado di prevedere.


1
Vero. Abbastanza filosofico però. Si aspettava un po 'una risposta tecnica. Grazie comunque :)
AshTyson,

2

In aggiunta a quanto detto da Demento, l'entità della casualità nell'algoritmo di generazione di numeri casuali è la questione chiave. Di seguito sono riportati alcuni progetti che possono indebolire l'RNG:
Sequenze nascoste
Supponiamo che queste siano le precedenti sequenze di caratteri generati: (Viene utilizzato solo un esempio, per l'uso pratico di portata maggiore)

lwjVJA
Ls3Ajg
xpKr+A
XleXYg
9hyCzA
jeFuNg
JaZZoA

Inizialmente, non è possibile osservare alcun modello nelle generazioni ma cambiandoli in codifica Base64 e quindi in esadecimale, otteniamo quanto segue:

9708D524
2ECDC08E
C692ABF8
5E579762
F61C82CC
8DE16E36
25A659A0

Ora se sottraggiamo ogni numero dal precedente, otteniamo questo:

FF97C4EB6A
97C4EB6A
FF97C4EB6A
97C4EB6A
FF97C4EB6A
FF97C4EB6A

Ciò indica che l'algoritmo aggiunge solo 0x97C4EB6A al valore precedente, tronca il risultato a un numero a 32 bit e Base64 codifica i dati.
Quanto sopra è un esempio di base. Gli algoritmi e i sistemi ML odierni sono in grado di apprendere e prevedere schemi più complessi.

Dipendenza dal tempo
Alcuni algoritmi RNG usano il tempo come input principale per la generazione di numeri casuali, in particolare quelli creati dagli sviluppatori stessi per essere utilizzati all'interno della loro applicazione.

Ogni volta che vengono implementati algoritmi RNG deboli che sembrano stocastici, possono essere estrapolati in avanti o indietro con una precisione perfetta nel caso in cui sia disponibile un set di dati sufficiente.


Mi hai appena dimostrato una concezione nella mia mente tra quantità e comunicazione essendo un metodo per determinare uno schema che sapevo di non essere lontano dal mio intuito :)
Bob

Ma si pone ancora una questione inscindibile di casualità essendo un "prodotto" scartato dalla razionalità quando tentiamo di descriverlo da una funzione del linguaggio che usiamo che deriva da un'umiltà nel mantenere il processo evolutivo e dal metodo percepito per mantenere il buonsenso umano lol.
Bobs,

La casualità o la sua percezione sono una disgiunzione tra realtà e percezione umana e, a causa della sua disgiunzione, solo un residuo della percezione senziente decide ogni immagine di ognuno che tutti osserviamo e si aggiunge alla casualità trasmissibile a causa della disunione intellettuale nel fattore concentrico umano nella distribuzione concettuale.
Bobs,

Come puoi mai analizzare qualcosa senza una base per iniziare la tua analisi se stai cercando di analizzare la casualità, allora sicuramente è da una base di certezza ego enteric lol
Bobs

La pseudo casualità è una proprietà delle persone di plastica che si mascherano come qualità reali e terrene per le quali hanno un superfluo disprezzo e una preda malvagia o umana. La determinazione conduce alla fede, alla certezza dell'occupazione e alla sana comunicazione del prodotto di una buona vita, nonostante i problemi di un equilibrio di difficoltà.
Bob
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.