Можно ли передать нейронной сети выходной сигнал от генератора случайных чисел и ожидать, что он изучит функцию хеширования (или генератора), чтобы она могла предсказать, каким будет следующее сгенерированное псевдослучайное число ?
Что-то подобное уже существует? Если исследование уже сделано по этому или чему-то связанному (с предсказанием псевдослучайных чисел), может ли кто-нибудь указать мне на правильные ресурсы?
В настоящее время я смотрю на эту библиотеку и связанные с ней ссылки. https://github.com/Vict0rSch/deep_learning/tree/master/keras/recurrent
Ответы:
Если мы говорим о совершенном ГСЧ, то ответ - нет . Невозможно предсказать действительно случайное число, иначе оно не будет действительно случайным.
Когда мы говорим о псевдо-ГСЧ, все немного меняется. В зависимости от качества PRNG проблема варьируется от простой до почти невозможной. Очень слабый PRNG, такой как опубликованный XKCD, можно, конечно, легко предсказать с помощью нейронной сети с небольшим обучением. Но в реальном мире все выглядит иначе.
Нейронная сеть может быть обучена нахождению определенных шаблонов в истории случайных чисел, генерируемых PRNG, для предсказания следующего бита. Чем сильнее становится PRNG, тем больше требуется входных нейронов, при условии, что вы используете один нейрон для каждого бита предыдущей случайности, генерируемой PRNG. Чем менее предсказуемо получает PRNG, тем больше данных потребуется для нахождения какого-либо паттерна. Для сильных PRNG это неосуществимо.
Положительным моментом является то, что полезно генерировать произвольное количество обучающих шаблонов для нейронной сети, предполагая, что вы контролируете PRNG и можете генерировать столько случайных чисел, сколько хотите.
Поскольку современные PRNG являются ключевым компонентом криптографии, были проведены обширные исследования, чтобы убедиться, что они «достаточно случайны», чтобы противостоять таким атакам с предсказанием. Поэтому я вполне уверен, что с имеющимися в настоящее время вычислительными ресурсами невозможно создать нейронную сеть для успешной атаки на PRNG, который считается безопасным для криптографии.
Стоит также отметить, что нет необходимости точно прогнозировать выход PRNG для взлома криптографии - может быть достаточно предсказать следующий бит с точностью чуть более 50%, чтобы значительно ослабить реализацию. Поэтому, если вы в состоянии построить нейронную сеть, которая предсказывает следующий бит PRNG (считающийся безопасным для криптографии) с вероятностью успеха 55%, вы, вероятно, довольно долго будете оставаться в заголовках новостей о безопасности.
источник
Будучи полным новичком в машинном обучении, я провел этот эксперимент (используя Scikit-learn):
Сгенерировал большое количество (N) псевдослучайных извлечений, используя функцию Python random.choices, чтобы выбрать N чисел из 90.
Обученный классификатор MLP с данными обучения, составленными следующим образом:
На практике я стремился к функции, которая задала N чисел, и предсказывала следующую.
Попросил обученного классификатора спрогнозировать оставшиеся цифры.
Результаты:
конечно, классификатор получил выигрышную оценку, сопоставимую с оценкой случайных догадок или других методов, не основанных на нейронных сетях (я сравнил результаты с несколькими классификаторами, доступными в библиотеках scikit-learn)
однако, если я сгенерирую псевдослучайные извлечения из лотереи с определенной функцией распределения, то числа, предсказанные нейронной сетью, будут примерно сгенерированы с одной и той же кривой распределения (если вы строите график случайных чисел и предсказаний нейронной сети, Вы можете видеть, что эти два имеют одинаковую тенденцию, даже если на кривой предикций есть много всплесков.Так что, возможно, нейронная сеть может узнать о распределении псевдослучайных чисел?
Если я уменьшу размер обучающего набора до определенного предела, я вижу, что классификатор начинает предсказывать всегда одни и те же несколько чисел, которые являются одними из самых частых в псевдослучайном поколении. Как ни странно (а может и нет) такое поведение, кажется, немного увеличивает выигрышный счет.
источник
Старый вопрос, но я подумал, что стоит один практический ответ. Я случайно наткнулся на это сразу после того, как посмотрел руководство по созданию такой нейронной сети, продемонстрировав эхо randint Python в качестве примера . Вот окончательный код без подробного объяснения, все еще довольно простой и полезный в случае, если ссылка отключается:
Я только что попробовал, и это действительно работает довольно хорошо! Прошло всего пару минут на моем старом медленном нетбуке. Вот мой собственный вывод, отличный от ссылки выше, и вы можете видеть, что совпадение не идеально, поэтому я полагаю, что критерии выхода слишком излишни:
источник
Если генератор случайных чисел псевдо выбрасывает числа, то при анализе этих чисел вы сможете определить алгоритм, который их создал, поскольку числа не случайны, они определяются этим алгоритмом и не являются случайными. Если мир состоит из физических законов, которые можно понять и воспроизвести, то очевидная случайность, которую мы наблюдаем в событиях, сводится к этим физическим законам. и генератор псевдо больше не является фактической случайностью, которая из своего определения неопределима и представляет собой парадокс. Как правила могут создавать случайность по определению, безусловно, наше очевидное восприятие случайности событий, которые мы наблюдаем, является аллюзией и на самом деле является уверенностью, которую мы не можем предсказать.
источник
В добавление к тому, что сказал Дементо, степень случайности в алгоритме генерации случайных чисел является ключевым вопросом. Ниже приведены некоторые конструкции, которые могут сделать ГСЧ слабым:
Скрытые последовательности.
Предположим, что это несколько предыдущих сгенерированных последовательностей символов: (используется только пример, для практического использования больший диапазон)
Изначально вы не можете наблюдать какой-либо шаблон в поколениях, но изменив их на кодировку Base64, а затем на шестнадцатеричный код, мы получим следующее:
Теперь, если мы вычтем каждое число из предыдущего, мы получим это:
Это указывает на то, что алгоритм просто добавляет 0x97C4EB6A к предыдущему значению, усекает результат до 32-разрядного числа и Base64 кодирует данные.
Выше приведен основной пример. Современные алгоритмы и системы ML достаточно способны изучать и предсказывать более сложные паттерны.
Зависимость от времени
Некоторые алгоритмы RNG используют время как основной вход для генерации случайных чисел, особенно те, которые созданы самими разработчиками для использования в их приложении.
Всякий раз, когда реализуются слабые алгоритмы ГСЧ, которые кажутся стохастическими, они могут быть экстраполированы вперед или назад с идеальной точностью в случае наличия достаточного набора данных.
источник