Bir sinir ağı bir sonraki sahte rasgele sayıyı tahmin etmek için kullanılabilir mi?


17

Bir sinir ağını bir rastgele sayı üretecinden çıktı beslemek ve hash (veya jeneratör) fonksiyonunu öğrenmesini beklemek mümkün mü, böylece bir sonraki üretilen sahte rastgele sayının ne olacağını tahmin edebilir mi?

Böyle bir şey zaten var mı? Bu ya da bununla ilgili bir araştırma yapılıyorsa (sahte rasgele sayıların tahmini ile), kimse beni doğru kaynaklara yönlendirebilir mi?

Şu anda bu kütüphaneye ve ilgili bağlantılarına bakıyorum. https://github.com/Vict0rSch/deep_learning/tree/master/keras/recurrent


Yanıtlar:


13

Mükemmel bir RNG'den bahsediyorsak, cevap açık bir hayır . Gerçekten rastgele bir sayıyı tahmin etmek imkansızdır, aksi takdirde gerçekten rastgele olmaz.

Sözde RNG hakkında konuştuğumuzda, işler biraz değişir. PRNG'nin kalitesine bağlı olarak, sorun kolaydan neredeyse imkansızdır. Yayınlanan XKCD gibi çok zayıf bir PRNG elbette çok az eğitim ile bir sinir ağı tarafından kolayca tahmin edilebilir. Ama gerçek dünyada işler farklı görünüyor.

Sinir ağı, bir sonraki biti tahmin etmek için bir PRNG tarafından üretilen rastgele sayılar tarihinde belirli kalıpları bulmak üzere eğitilebilir. PRNG güçlendikçe, PRNG tarafından oluşturulan önceki rastgele her bit için bir nöron kullandığınızı varsayarsak, daha fazla giriş nöronu gerekir. PRNG ne kadar az tahmin edilebilir olursa, bir çeşit model bulmak için o kadar fazla veri gerekecektir. Güçlü PRNG'ler için bu mümkün değildir.

Olumlu bir notta, PRNG üzerinde kontrole sahip olduğunuzu ve istediğiniz kadar rasgele sayı üretebileceğini varsayarak, sinir ağı için rasgele bir miktar egzersiz paterni üretmeniz faydalı olacaktır.

Modern PRNG'ler kriptografi için önemli bir bileşen olduğundan, bu tür tahmin saldırılarına dayanacak kadar "rastgele" olduklarını doğrulamak için kapsamlı araştırmalar yapılmıştır. Bu nedenle, şu anda mevcut hesaplama kaynaklarıyla, şifreleme için güvenli olduğu düşünülen bir PRNG'ye başarılı bir şekilde saldırmak için bir sinir ağı oluşturmak mümkün olmadığından eminim.

Kriptografiyi kırmak için bir PRNG'nin çıktısını tam olarak tahmin etmenin gerekli olmadığını da belirtmek gerekir - bir sonraki biti, bir uygulamayı önemli ölçüde zayıflatmak için% 50'den biraz daha fazla bir kesinlik ile tahmin etmek yeterli olabilir. Dolayısıyla, bir PRNG'nin (kriptografi için güvenli olduğu düşünülen) bir sonraki bitini% 55 başarı oranı ile tahmin eden bir sinir ağı oluşturabiliyorsanız, muhtemelen bir süre için güvenlik haber başlıklarını yapacaksınız.


2
Vay bu arkasındaki açıklama için teşekkürler. Deseni analiz etmeye ve bir sonraki biti tahmin etmeye çalışıyorum ve mükemmel bir RNG değil, biraz sağlam PRNG. Fakat bu en son teknoloji de değildir. Biraz hesaplama gücü ve doğru uygulama ile daha fazla değilse% 60-70 ile tahmin edemem. Mümkünse, bunun hakkında daha fazla bilgi edinebileceğim kaynakları işaret edebilir misiniz? Ben bir araştırma geçmişi ve daha bir geliştirici değilim.
AshTyson

4

Eski bir soru, ama pratik bir cevaba değdiğini düşündüm. Böyle bir sinir ağının nasıl oluşturulacağına dair bir kılavuza baktıktan sonra, python'un randımının yankısını örnek olarak gördüm . Ayrıntılı açıklama olmadan son kod, bağlantı çevrimdışı olduğunda hala oldukça basit ve kullanışlı:

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))

Ben sadece denedim ve gerçekten oldukça iyi çalışıyor! Eski yavaş netbook'umda sadece birkaç dakika sürdü. İşte kendi bağlantım, yukarıdaki bağlantıdan farklı ve eşleşmenin mükemmel olmadığını görebiliyorsunuz, bu yüzden çıkış kriterlerinin biraz fazla izin verici olduğunu düşünüyorum:

...
 - 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]

Bu rastgele diziyi tahmin etmeyi öğrenmez - yankılanmayı öğrenir. Somut olarak, eğitim örnekleri, X, 5 rastgele tamsayıdan oluşur ve y çıkışı, 5'in 4. tamsayısıdır. Örneğin, X = [15, 33, 44, 30, 3], y = 30 ise. LSTM 4. örneği tekrarlamayı öğreniyor.
thinkski

Evet, iyi bir noktaya değindiniz. Hala LSTM kullanımının çok ilginç bir pratik örneği olduğunu düşünüyorum. Mersenne Twister gibi bir şeyi sadece girdi olarak verilen tohumdan nasıl öğreneceğinizi biliyorsanız, gerçekten görmek istediğim için lütfen buraya gönderin. Yeterli örneklerle mümkün görünüyor, ama tamamen yanlış olabilirim.
isp-zax

3

Makine öğreniminde tam bir acemi olarak, bu deneyi yaptım (Scikit-learn'u kullanarak):

  • 90'dan N sayısını seçmek için python random.choices işlevini kullanarak çok sayıda (N) sahte rasgele ekstraksiyon üretti.

  • Aşağıdaki gibi eğitim verilerinin yer aldığı bir MLP sınıflandırıcısı eğitildi:

    • ith örnek: X <- piyango Sonuçları [i: i + 100], Y <- piyango Sonuçları [i]

    Uygulamada, N sayısı veren bir işlevi amaçladım, coud bir sonrakini öngördü.

  • Eğitimli sınıflayıcıdan kalan sayıları tahmin etmesini isteyin.

Sonuçlar:

  • Tabii ki, sınıflandırıcı rastgele tahmin veya sinir ağlarına dayalı olmayan diğer tekniklerle karşılaştırılabilir bir kazanma puanı elde etti (sonuçları scikit-öğren kütüphanelerinde bulunan birkaç sınıflandırıcı ile karşılaştırdım)

  • ancak, belirli bir dağıtım işleviyle sözde rasgele piyango çıkarmaları oluşturursam, sinir ağı tarafından tahmin edilen sayılar kabaca aynı dağıtım eğrisiyle oluşturulur (rastgele sayıların ve sinir ağı tahminlerinin oluşumlarını çizerseniz, tahmin eğrisinde birçok ani artış olsa bile, ikisinin de aynı eğilime sahip olduğunu görebilirsiniz .. Belki sinir ağı sahte rasgele sayı dağılımları hakkında bilgi sahibi olabilir?

  • Belli bir sınırın altında ayarlanan eğitimin boyutunu küçültürsem, sınıflandırıcının her zaman aynı rastgele sayıları tahmin etmeye başladığını görüyorum. Garip bir şekilde bu davranış, kazanan puanı biraz artırıyor gibi görünüyor.


3

Bir sözde sayı üreteci sayıları atıyorsa, bu sayıların analizinde, sayıları rastgele olmadığı için bunları üreten algoritmayı belirleyebileceksiniz; tesadüfen değil, bu algoritma tarafından belirlenir.

Eğer dünya anlaşılabilecek ve çoğaltılabilecek fiziksel yasalardan oluşuyorsa, olaylarda gözlemlediğimiz görünür rastgelelik bu fiziksel yasalara bağlıdır.

Sahte jeneratör artık rastgele değildir, tanımından anlaşılamaz ve bir paradoks sunar.

Kurallar nasıl rasgelelik yaratabilir?

Tanım olarak, elbette, gözlemlediğimiz olayların rastgelelik algısı bizim bir yanılsamadır ve aslında tahmin edemediğimiz bir kesindir.

Doğanın mutlak temel yasaları varsa ve bu yasalar gözlemlenen kaostan düzen yaratırsa, o zaman rastgelelik ve referansı yanlıştır ve herhangi bir doğru doğru anlamı yoktur.


1
Doğru. Yine de oldukça felsefi. Biraz teknik bir cevap bekleniyor. Neyse teşekkürler :)
AshTyson

2

Demento'nun söylediklerine ek olarak, Rastgele Sayı Üretimi Algoritması'ndaki rasgeleliğin kapsamı kilit konudur. RNG'yi zayıflatabilecek bazı tasarımlar aşağıdadır:
Gizli Diziler
Bunun, önceki birkaç karakter dizisi olduğunu varsayalım: (Sadece bir örnek, daha geniş aralıkların pratik kullanımı için kullanılır)

lwjVJA
Ls3Ajg
xpKr+A
XleXYg
9hyCzA
jeFuNg
JaZZoA

Başlangıçta, nesillerdeki herhangi bir deseni gözlemleyemezsiniz, ancak bunları Base64 kodlamasına ve daha sonra da onaltılı olarak değiştirirseniz, aşağıdakileri elde ederiz:

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

Şimdi her sayıyı bir öncekinden çıkarırsak, şunu elde ederiz:

FF97C4EB6A
97C4EB6A
FF97C4EB6A
97C4EB6A
FF97C4EB6A
FF97C4EB6A

Bu, algoritmanın sadece önceki değere 0x97C4EB6A eklediğini, sonucu 32 bit bir sayıya kırptığını ve Base64'in verileri kodladığını gösterir.
Yukarıdaki temel bir örnektir. Günümüzün ML algoritmaları ve sistemleri, daha karmaşık kalıpları öğrenebilecek ve tahmin edebilecek kapasiteye sahiptir.

Zamana Bağlılık
Bazı RNG algoritmaları, zamanı özellikle rasgele sayılar üretmek için ana girdi olarak kullanır , özellikle geliştiricilerin kendi uygulamalarında kullanmak üzere oluşturduklarını.

Stokastik gibi görünen zayıf RNG algoritmaları uygulandığında, yeterli veri kümesinin mevcut olması durumunda mükemmel doğrulukla ileri veya geri tahmin edilebilirler.


Bana sadece kendi aklımda nicelik ve onun iletişimi arasında, sezgimden uzak olmadığımı bildiğim bir deseni belirleme yöntemi olarak bir anlayış gösterdiniz :)
Bobs

Ancak, hala, evrimsel süreci korumakta alçakgönüllülükten elde edilen alçakgönüllülükten türetilmiş kullandığımız dilin bir işlevinden tanımlamaya çalıştığımızda, rastgele bir ayrılmazlık sorunu, rasyonellikten kopuk bir "ürün" olmak için yalvarır ve insan sağlığını korumanın algılanan yöntemi lol.
Bobs

Rasgelelik veya algısı gerçeklik ile insan algısı arasında bir kopukluk mu ve kopukluğundan dolayı sadece duygusal algıların bir kalıntısı hepimizin gözlemlediği ve kavramsal dağılımdaki insanların eşmerkezli faktörünün insanlarda zihinsel kopukluğundan dolayı iletişim kurabildiğimiz rasgele farklılıklara karar verir.
Bobs

Eğer rasgele analiz etmeye çalışıyorsanız, analize başlamak için bir temel olmadan bir şey nasıl analiz edebilirsiniz o zaman kesinlikle kesin bir ego enterik lol bir temeli
Bobs

Yalancı rasgelelik, yeryüzüne saygısızlık duydukları ve kutsal olmayan ya da insani bir ön meşguliyete sahip oldukları, gerçek dünyaya kadar maskeleyen plastik insanların bir özelliğidir. Kararlılık, inanç ve mesleğin kesinliğine ve iyi bir yaşamın ürününün zorluk dengesinin sorunlarına dayanmayan sağlıklı iletişimine yol açar.
Bobs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.