Một mạng lưới thần kinh có thể được sử dụng để dự đoán số ngẫu nhiên giả tiếp theo?


17

Có thể cung cấp cho một mạng thần kinh đầu ra từ một trình tạo số ngẫu nhiên và mong đợi nó tìm hiểu hàm băm (hoặc trình tạo), để nó có thể dự đoán đâu sẽ là số giả ngẫu nhiên được tạo tiếp theo ?

Có một cái gì đó như thế này đã tồn tại? Nếu nghiên cứu đã được thực hiện về điều này hoặc một cái gì đó liên quan (để dự đoán các số giả ngẫu nhiên), bất cứ ai có thể chỉ cho tôi các tài nguyên phù hợp?

Hiện tại, tôi đang xem thư viện này và các liên kết liên quan của nó. https://github.com/Vict0rSch/deep_learning/tree/master/keras/rec hiện


Câu trả lời:


13

Nếu chúng ta đang nói về một RNG hoàn hảo, câu trả lời là không . Không thể dự đoán một con số thực sự ngẫu nhiên, nếu không nó sẽ không thực sự ngẫu nhiên.

Khi chúng ta nói về RNG giả, mọi thứ thay đổi một chút. Tùy thuộc vào chất lượng của PRNG, vấn đề nằm trong khoảng từ dễ đến gần như không thể. Một PRNG rất yếu như một XKCD được công bố tất nhiên có thể dễ dàng dự đoán bởi một mạng lưới thần kinh với ít sự huấn luyện. Nhưng trong thế giới thực, mọi thứ trông khác.

Mạng lưới thần kinh có thể được đào tạo để tìm ra các mẫu nhất định trong lịch sử các số ngẫu nhiên được tạo bởi PRNG để dự đoán bit tiếp theo. PRNG càng mạnh thì càng cần nhiều nơ-ron đầu vào, giả sử bạn đang sử dụng một nơ-ron cho mỗi bit ngẫu nhiên trước đó do PRNG tạo ra. PRNG càng ít dự đoán được, càng cần nhiều dữ liệu để tìm ra một số kiểu mẫu. Đối với PRNG mạnh thì điều này là không khả thi.

Nói một cách tích cực, thật hữu ích khi bạn có thể tạo ra một số lượng mẫu đào tạo tùy ý cho mạng thần kinh, giả sử rằng bạn có quyền kiểm soát PRNG và có thể tạo ra nhiều số ngẫu nhiên như bạn muốn.

Bởi vì các PRNG hiện đại là một thành phần quan trọng cho mật mã, nghiên cứu sâu rộng đã được tiến hành để xác minh rằng chúng "đủ ngẫu nhiên" để chống lại các cuộc tấn công dự đoán như vậy. Do đó, tôi khá chắc chắn rằng không thể có tài nguyên tính toán hiện có để xây dựng một mạng lưới thần kinh để tấn công thành công một PRNG được coi là an toàn cho mật mã.

Cũng cần lưu ý rằng không cần thiết phải dự đoán chính xác đầu ra của PRNG để phá vỡ mật mã - có thể đủ để dự đoán bit tiếp theo với độ chắc chắn hơn 50% để làm suy yếu đáng kể việc triển khai. Vì vậy, nếu bạn có thể xây dựng một mạng lưới thần kinh dự đoán bit tiếp theo của PRNG (được coi là an toàn cho mật mã) với tỷ lệ thành công 55%, có thể bạn sẽ tạo tiêu đề tin tức bảo mật trong một thời gian dài.


2
Wow cảm ơn vì lời giải thích đằng sau này. Tôi đang cố gắng phân tích mô hình và dự đoán bit tiếp theo và nó không phải là một RNG hoàn hảo, nhưng PRNG hơi chắc chắn. Nhưng nó cũng không phải là nghệ thuật. Tôi nghĩ với một chút sức mạnh tính toán và thực hiện đúng, tôi không thể dự đoán nó với 60-70% nếu không muốn nói là nhiều hơn. Nếu có thể, bạn có thể chỉ ra bất kỳ tài nguyên nào mà tôi có thể đọc thêm về điều này. Tôi không đến từ một nền tảng nghiên cứu và nhiều hơn nữa của một nhà phát triển.
AshTyson

3

Là một người mới hoàn toàn trong học máy, tôi đã thực hiện thí nghiệm này (sử dụng Scikit-learn):

  • Tạo ra một số lượng lớn (N) trích xuất giả ngẫu nhiên, sử dụng hàm python Random.choices để chọn N số trong số 90.

  • Đã đào tạo trình phân loại MLP với dữ liệu đào tạo được soạn thảo như sau:

    • mẫu thứ i: X <- xổ sốResults [i: i + 100], Y <- xổ sốResults [i]

    Trong thực tế, tôi đã nhắm đến một hàm cho N số, hãy dự đoán số tiếp theo.

  • Yêu cầu phân loại được đào tạo để dự đoán các số còn lại.

Các kết quả:

  • tất nhiên, bộ phân loại đạt được số điểm chiến thắng tương đương với một trong những phỏng đoán ngẫu nhiên hoặc các kỹ thuật khác không dựa trên mạng thần kinh (tôi đã so sánh kết quả với một số phân loại có sẵn trong các thư viện scikit-learn)

  • tuy nhiên, nếu tôi tạo ra các trích xuất xổ số giả ngẫu nhiên với một hàm phân phối cụ thể, thì các số được dự đoán bởi mạng thần kinh sẽ được tạo ra với cùng một đường cong phân phối (nếu bạn vẽ các lần xuất hiện của các số ngẫu nhiên và dự đoán của mạng thần kinh, bạn có thể thấy rằng cả hai có cùng xu hướng, ngay cả khi trong đường cong dự đoán có nhiều đột biến. Vì vậy, có lẽ mạng lưới thần kinh có thể tìm hiểu về phân phối số giả ngẫu nhiên?

  • Nếu tôi giảm kích thước của tập huấn luyện theo một giới hạn nhất định, tôi thấy rằng trình phân loại bắt đầu dự đoán luôn luôn cùng một vài số, đây là một trong những số thường gặp nhất trong thế hệ giả ngẫu nhiên. Thật kỳ lạ (hoặc có thể không) hành vi này dường như tăng nhẹ điểm chiến thắng.


3

Câu hỏi cũ, nhưng tôi nghĩ rằng nó đáng giá một câu trả lời thực tế. Tôi tình cờ vấp phải nó ngay sau khi xem hướng dẫn về cách xây dựng mạng lưới thần kinh như vậy, chứng minh tiếng vang của sự trỗi dậy của trăn là một ví dụ . Đây là mã cuối cùng mà không cần giải thích chi tiết, vẫn khá đơn giản và hữu ích trong trường hợp liên kết ngoại tuyến:

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

Tôi vừa mới thử và nó thực sự hoạt động khá tốt! Chỉ mất vài phút trên chiếc netbook chậm chạp cũ của tôi. Đây là đầu ra rất riêng của tôi, khác với liên kết ở trên và bạn có thể thấy kết quả khớp không hoàn hảo, vì vậy tôi cho rằng tiêu chí thoát là hơi quá cho phép:

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

Đây không phải là học để dự đoán chuỗi ngẫu nhiên - nó đang học để lặp lại nó. Cụ thể, các mẫu đào tạo, X, bao gồm 5 số nguyên ngẫu nhiên và đầu ra, y, là số nguyên thứ 4 của 5. Ví dụ: nếu X = [15, 33, 44, 30, 3], y = 30. LSTM đang học cách lặp lại mẫu thứ 4.
thinkski

Vâng, điểm tốt. Tôi vẫn thấy nó là một ví dụ thực tế rất thú vị về việc sử dụng LSTM. Nếu bạn biết cách học một cái gì đó như Mersenne Twister từ hạt giống chỉ được đưa ra làm đầu vào, xin vui lòng gửi nó ở đây vì tôi thực sự quan tâm để xem. Có vẻ như có thể với đủ mẫu, nhưng tôi có thể sai hoàn toàn.
isp-zax 17/03/19 lúc

2

Nếu một trình tạo số ngẫu nhiên psuedo đưa ra các số thì trong phân tích các số này, bạn sẽ có thể xác định thuật toán tạo ra chúng vì các số không ngẫu nhiên chúng được xác định bởi thuật toán đó và không có cơ hội. Nếu thế giới được tạo thành từ các quy luật vật lý có thể được hiểu và nhân rộng hơn so với sự ngẫu nhiên rõ ràng mà chúng ta quan sát thấy trong các sự kiện là theo các quy luật vật lý đó. và trình tạo psuedo không còn nữa, và là sự ngẫu nhiên thực tế mà từ định nghĩa của nó là không thể xác định được, và đưa ra một nghịch lý. Làm thế nào các quy tắc có thể tạo ra tính ngẫu nhiên theo định nghĩa chắc chắn nhận thức rõ ràng của chúng ta về tính ngẫu nhiên của các sự kiện chúng ta quan sát là một ám chỉ và thực sự là một điều chắc chắn mà chúng ta không thể dự đoán được.


1
Thật. Mặc dù khá triết học. Dự kiến ​​phần nào của một câu trả lời kỹ thuật. Dù sao cũng cảm ơn :)
AshTyson

2

Thêm vào những gì Demento đã nói, mức độ ngẫu nhiên trong Thuật toán tạo số ngẫu nhiên là vấn đề chính. Sau đây là một số thiết kế có thể làm cho RNG yếu đi:
Các chuỗi bị che giấu
Giả sử đây là một vài chuỗi ký tự được tạo trước đó: (Chỉ là một ví dụ, cho phạm vi sử dụng thực tế lớn hơn, được sử dụng)

lwjVJA
Ls3Ajg
xpKr+A
XleXYg
9hyCzA
jeFuNg
JaZZoA

Ban đầu, bạn không thể quan sát bất kỳ mẫu nào trong các thế hệ nhưng thay đổi chúng thành mã hóa Base64 và sau đó thành hex, chúng tôi nhận được như sau:

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

Bây giờ nếu chúng ta trừ đi mỗi số từ mẫu trước đó, chúng ta sẽ nhận được điều này:

FF97C4EB6A
97C4EB6A
FF97C4EB6A
97C4EB6A
FF97C4EB6A
FF97C4EB6A

Điều này chỉ ra rằng thuật toán chỉ cần thêm 0x97C4EB6A vào giá trị trước đó, cắt kết quả thành số 32 bit và Base64 - mã hóa dữ liệu.
Trên đây là một ví dụ cơ bản. Các thuật toán và hệ thống ML ngày nay có đủ khả năng để tìm hiểu và dự đoán các mẫu phức tạp hơn.

Phụ thuộc thời gian
Một số thuật toán RNG sử dụng thời gian làm đầu vào chính để tạo số ngẫu nhiên, đặc biệt là các thuật toán được tạo bởi chính các nhà phát triển sẽ được sử dụng trong ứng dụng của họ.

Bất cứ khi nào các thuật toán RNG yếu được triển khai có vẻ ngẫu nhiên, chúng có thể được ngoại suy về phía trước hoặc phía sau với độ chính xác hoàn hảo trong trường hợp có đủ dữ liệu.


Bạn vừa chứng minh cho tôi một quan niệm trong suy nghĩ của riêng tôi giữa số lượng và giao tiếp của nó là một phương pháp xác định một mô hình mà tôi biết rằng tôi không ở xa trực giác của mình :)
Bobs

Nhưng nó vẫn đặt ra một câu hỏi không thể tách rời về tính ngẫu nhiên là một "sản phẩm" bị tách rời khỏi tính hợp lý khi chúng ta cố gắng mô tả nó từ một chức năng của ngôn ngữ mà chúng ta sử dụng có nguồn gốc từ sự khiêm tốn trong việc duy trì quá trình tiến hóa và phương pháp duy trì sự tỉnh táo của con người cười lớn.
Bobs

Là sự ngẫu nhiên hay nhận thức của nó là một sự khác biệt giữa thực tế và nhận thức của con người và bởi vì sự khác biệt của nó chỉ là sự tồn tại của nhận thức tình cảm quyết định mỗi hình ảnh của chúng ta và mọi người đều quan sát và thêm vào sự ngẫu nhiên về trí tuệ trong sự phân bố khái niệm của con người.
Bobs

Làm thế nào bạn có thể phân tích thứ gì đó mà không có cơ sở để bắt đầu phân tích nếu bạn cố gắng phân tích tính ngẫu nhiên thì chắc chắn đó là từ cơ sở của sự chắc chắn của bản ngã lol
Bobs

Sự ngẫu nhiên giả là một tài sản của những người nhựa giả mạo như những phẩm chất thực sự đối với trái đất mà họ có một sự coi thường thừa thãi và một sự ngụy biện không hay của con người. Quyết tâm dẫn đến niềm tin và sự chắc chắn của nghề nghiệp và giao tiếp lành mạnh của sản phẩm của một cuộc sống tốt đẹp không chịu được các vấn đề của sự cân bằng của khó khăn.
Bobs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.