Чи можна нейронну мережу використовувати для прогнозування наступного псевдовипадкового числа?


17

Чи можна подати нейронну мережу на вихід з генератора випадкових чисел і очікувати, що вона вивчить функцію хешування (або генератора), щоб він міг передбачити, що буде наступним згенерованим псевдовипадковим числом ?

Чи щось подібне вже існує? Якщо вже зроблено дослідження цього чи чогось пов’язаного (передбачення псевдовипадкових чисел), чи може хтось вказати мені на потрібні ресурси?

В даний час я переглядаю цю бібліотеку та пов’язані з нею посилання. https://github.com/Vict0rSch/deep_learning/tree/master/keras/recurrent


Відповіді:


13

Якщо ми говоримо про ідеальний RNG, відповідь - явний ні . Неможливо передбачити справді випадкове число, інакше воно не було б справді випадковим.

Коли ми говоримо про псевдо РНГ, справи дещо змінюються. Залежно від якості PRNG, проблема коливається від простого до майже неможливого. Дуже слабкий PRNG, як опублікований XKCD, звичайно, можна легко спрогнозувати нейронною мережею з невеликою кількістю навчання. Але в реальному світі речі виглядають інакше.

Нейронну мережу можна навчити знаходити певні закономірності в історії випадкових чисел, породжених PRNG, щоб передбачити наступний біт. Чим сильніше стає PRNG, тим більше вхідних нейронів потрібно, припускаючи, що ви використовуєте один нейрон для кожного біта попередньої випадковості, генерованої PRNG. Чим менше передбачуваний PRNG отримує, тим більше даних буде потрібно для того, щоб знайти якусь схему. Для сильних PRNG це неможливо.

З позитивної уваги, корисно, що ви можете генерувати довільну кількість моделей тренувань для нейронної мережі, припускаючи, що ви маєте контроль над PRNG і можете створити стільки випадкових чисел, скільки вам потрібно.

Оскільки сучасні PRNG є ключовим компонентом криптографії, було проведено широке дослідження, щоб перевірити, чи є вони "випадковими", щоб протистояти таким атакам прогнозування. Тому я впевнений, що неможливо за допомогою наявних на даний момент обчислювальних ресурсів створити нейронну мережу для успішної атаки на PRNG, який вважається безпечним для криптографії.

Варто також зазначити, що не потрібно точно передбачати вихід PRNG для порушення криптографії - це може бути достатньо передбачити наступний біт із впевненістю трохи більше 50%, щоб значно послабити виконання. Отже, якщо ви зможете створити нейронну мережу, яка прогнозує наступний біт PRNG (вважається безпечним для криптографії) з 55% успішності, ви, ймовірно, будете робити заголовки новин безпеки на досить довгий час.


2
Дякую за пояснення цього. Я намагаюся проаналізувати схему і передбачити наступний біт, і це не ідеальний RNG, а дещо суцільний PRNG. Але це теж не сучасний стан. Я думаю, що з невеликою обчислювальною потужністю та правильною реалізацією я не міг би передбачити це з 60-70%, якщо не більше. Якщо можливо, можете вказати будь-які ресурси, де я можу прочитати більше про це. Я не з досвіду досліджень, а більше з розробника.
AshTyson

3

Будучи новачком у машинному навчанні, я зробив цей експеримент (використовуючи Scikit-learn):

  • Створено велику кількість (N) псевдовипадкових вилучень, використовуючи функцію python random.choices для вибору N чисел із 90.

  • Навчав класифікатор MLP з даними про навчання, складеними таким чином:

    • i-зразок: X <- лотереяРезультати [i: i + 100], Y <- лотереяРезультати [i]

    На практиці я мав на меті функцію, яка задала N чисел, coud передбачити наступне.

  • Попросив навченого класифікатора передбачити залишилися числа.

Результати:

  • звичайно, класифікатор отримав виграшний бал, порівнянний з випадковим відгадуванням або іншими методами, що не ґрунтуються на нейронних мережах (я порівнював результати з декількома класифікаторами, наявними в бібліотеках scikit-learn)

  • однак, якщо я генерую вилучення псевдовипадкових лотерей із певною функцією розподілу, то числа, передбачені нейронною мережею, приблизно генеруються з однаковою кривою розподілу (якщо побудувати графік випадкових чисел та прогнозів нейронної мережі, Ви можете бачити, що обидва мають однаковий тренд, навіть якщо в кривій передбачень є багато шипів. Тож, можливо, нейронна мережа здатна дізнатися про псевдовипадкові розподіли чисел?

  • Якщо я зменшую розмір навчального набору під певним лімітом, я бачу, що класифікатор починає передбачати завжди однакові кілька цифр, які є одними з найчастіших у генерації псевдовипадкових. Як не дивно (а може і ні) така поведінка, здається, трохи збільшить виграшний бал.


3

Старе запитання, але я вважав, що це варто однієї практичної відповіді. Я випадково натрапив на нього відразу після того, дивлячись на керівництво про те , як побудувати таку нейронну мережу, демонструючи відлуння randint пітона в якості прикладу . Ось підсумковий код без детального пояснення, все ще досить простий і корисний у випадку, якщо посилання перейде в офлайн:

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

Я щойно спробував, і це справді працює досить добре! На мою стару повільну нетбук пішло пару хвилин. Ось мій власний висновок, відмінний від посилання вище, і ви можете бачити, що відповідність не є ідеальною, тому я вважаю, що критерії виходу є занадто дозволеними:

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

Це не вчити прогнозувати випадкову послідовність - це вчити повторювати її. Конкретно, навчальні зразки X складаються з 5 випадкових цілих чисел, а вихід, y - четверте ціле число 5. Наприклад, якщо X = [15, 33, 44, 30, 3], y = 30. LSTM вчиться повторювати 4-й зразок.
thinkki

Так, хороший момент. Я все ще вважаю це дуже цікавим практичним прикладом використання LSTM. Якщо ви знаєте, як навчитися щось на зразок Мерсенн Твістер із насіння, поданого лише як вхідний текст, будь ласка, опублікуйте це тут, як мені було б дуже цікаво побачити. Здається, що достатньо зразків, але я можу бути абсолютно неправильним.
isp-zax

2

Якщо генератор випадкових чисел psuedo викидає числа, то при аналізі цих чисел ви зможете визначити алгоритм, який їх створив, оскільки числа не випадкові, вони визначаються цим алгоритмом і не є випадковістю. Якщо світ складається з фізичних законів, які можна зрозуміти та повторити, ніж очевидна випадковість, яку ми спостерігаємо в подіях, зводиться до тих фізичних законів. і генератор psuedo вже не є, а фактична випадковість, яка з його визначення не визначена, і являє парадокс. Як правила можуть створювати випадковість за визначенням, безумовно, наше уявне сприйняття випадковості подій, які ми спостерігаємо, - це алюзія і насправді є певністю, яку ми не в змозі передбачити.


1
Правда. Досить філософський, хоча. Очікується дещо технічної відповіді. Все одно дякую :)
AshTyson

2

Додаючи до сказаного Дементо, ключовим питанням є ступінь випадковості в алгоритмі генерації випадкових чисел. Нижче наведено кілька конструкцій, які можуть зробити RNG слабкими:
Приховані послідовності.
Припустимо, це кілька попередніх послідовностей генерованих символів: (Просто використовується приклад для практичного використання більшого діапазону)

lwjVJA
Ls3Ajg
xpKr+A
XleXYg
9hyCzA
jeFuNg
JaZZoA

Спочатку ви не можете спостерігати будь-яку схему в поколіннях, але змінюючи їх на кодування Base64, а потім на шістнадцяткове, ми отримуємо наступне:

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

Тепер, якщо відняти кожне число з попереднього, отримаємо це:

FF97C4EB6A
97C4EB6A
FF97C4EB6A
97C4EB6A
FF97C4EB6A
FF97C4EB6A

Це вказує на те, що алгоритм просто додає 0x97C4EB6A до попереднього значення, обрізає результат на 32-бітове число і Base64-кодує дані.
Наведене є основним прикладом. Сьогоднішні алгоритми та системи ML є достатньо здатними вивчити та передбачити більш складні структури.

Залежність від часу
Деякі алгоритми RNG використовують час як основний вхід для генерування випадкових чисел, особливо тих, які створені самими розробниками для використання в їх застосуванні.

Щоразу, коли реалізовані слабкі алгоритми RNG, які здаються стохастичними, їх можна екстраполювати вперед або назад з ідеальною точністю, якщо є достатній набір даних.


Ви щойно продемонстрували мені в моїй свідомості концепцію між кількістю та її комунікацією, будучи методом визначення схеми, яку я знав, що я був далеко не від моєї інтуїції :)
Бобс,

Але вона все ще напрошується нероздільного питання про випадковість, що є "продуктом", відстороненим від раціональності, коли ми намагаємось описати це від функції мови, якою ми користуємось, що виходить із смирення у збереженні еволюційного процесу та сприйнятого способу підтримання людської гідності Лол.
Бобс

Чи випадковість або її сприйняття є роз'єднанням між реальністю та людським сприйняттям, а через її непересічність лише залишок чуттєвого сприйняття вирішує кожну картину кожного, яку ми спостерігаємо, і доповнює до комунікативної випадковості через інтелектуальну нерозбірливість у людини концентричним фактором у концептуальному розподілі.
Бобс

Як ти можеш коли-небудь проаналізувати щось без основи, щоб почати свій аналіз, якщо ти намагаєшся проаналізувати випадковість, то, безумовно, це є на основі визначеності его ентеричного лол-лол
Бобс

Псевдовипадковість - властивість пластичних людей, що маскуються як реальні приземні якості, з якими вони зайве нехтують і нечестивою чи людською задокументацією. Рішучість призводить до віри і певної професії та корисного спілкування продукту гарного життя, не витримуючи проблем збалансованості.
Бобс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.