ニューラルネットワークを使用して次の疑似乱数を予測できますか?


17

乱数ジェネレーターからの出力をニューラルネットワークに供給し、ハッシュ(またはジェネレーター)関数を学習することを期待して、次に生成される疑似乱数を予測できるようにすることは可能ですか?

このようなものはすでに存在していますか?これまたはこれに関連する何か(疑似乱数の予測に関連する)の​​調査が既に行われている場合、誰かが私に適切なリソースを示すことができますか?

現在、私はこのライブラリとその関連リンクを見ています。 https://github.com/Vict0rSch/deep_learning/tree/master/keras/recurrent


回答:


13

完全なRNGについて話している場合、答えは明らかにノーです。真に乱数を予測することは不可能です。さもなければ、真に乱数になることはありません。

疑似RNGについて話すとき、状況は少し異なります。PRNGの品質にもよりますが、問題の範囲は簡単なものからほとんど不可能です。XKCDが公開したような非常に弱いPRNG は、もちろん、ほとんどトレーニングを行わなくてもニューラルネットワークによって簡単に予測できます。しかし、現実の世界では状況は異なります。

ニューラルネットワークは、PRNGによって生成された乱数の履歴から特定のパターンを見つけて次のビットを予測するようにトレーニングできます。PRNGによって生成される以前のランダム性のビットごとに1つのニューロンを使用していると仮定すると、PRNGが強くなるほど、より多くの入力ニューロンが必要になります。PRNGが予測できないほど、何らかのパターンを見つけるために必要なデータが多くなります。強力なPRNGの場合、これは実行できません。

ポジティブな点として、PRNGを制御していて、必要な数の乱数を生成できると仮定すると、ニューラルネットワーク用の任意の量のトレーニングパターンを生成できると便利です。

最新のPRNGは暗号化の主要なコンポーネントであるため、それらがそのような予測攻撃に耐えるのに「十分にランダム」であることを検証するために、広範な研究が行われました。したがって、現在利用可能な計算リソースでは、暗号化に対して安全であると見なされているPRNGを攻撃するニューラルネットワークを構築することは不可能だと確信しています。

また、PRNGの出力を正確に予測して暗号を解く必要はないことにも注意してください。実装を大幅に弱めるには、50%強の確実性で次のビットを予測するだけで十分な場合があります。したがって、PRNGの次のビットを予測するニューラルネットワーク(暗号化のために安全であると考えられる)を55%の成功率で構築できれば、おそらくかなり長い間、セキュリティニュースの見出しを作るでしょう。


2
これの背後にある説明をありがとう。私はパターンを分析して次のビットを予測しようとしていますが、これは完全なRNGではなく、やや堅実なPRNGです。しかし、それも最先端のものではありません。少しの計算能力と適切な実装があれば、それ以上ではないとしても60〜70%と予測できなかったと思います。できれば、私がこれについて詳しく読むことができるリソースを指摘してください。私は研究の出身ではなく、開発者ではありません。
AshTyson 2017

3

機械学習の完全な初心者である私は、この実験を(Scikit-learnを使用して)行いました。

  • pythonのrandom.choices関数を使用して90の中からN個の数値を選択し、多数(N)の疑似ランダム抽出を生成しました。

  • 次のように構成されたトレーニングデータでMLP分類器をトレーニングしました。

    • i番目のサンプル:X <-lotteryResults [i:i + 100]、Y <-lotteryResults [i]

    実際には、N個の数値を与えて次の関数を予測できる関数を目指しました。

  • 残りの数を予測するように訓練された分類子に依頼しました。

結果:

  • もちろん、分類子は、ランダムな推測やニューラルネットワークに基づいていない他の手法に匹敵する優勝スコアを取得しました(結果はscikit-learnライブラリで利用可能ないくつかの分類子と比較しました)。

  • ただし、特定の分布関数を使用して擬似ランダム抽選抽出を生成すると、ニューラルネットワークによって予測された数値は、同じ分布曲線で大まかに生成されます(乱数とニューラルネットワーク予測の発生をプロットすると、予測曲線に多くのスパイクがある場合でも、2つは同じ傾向を持っていることがわかります。ニューラルネットワークは、疑似乱数分布について学習できるのでしょうか。

  • 特定の制限の下でトレーニングセットのサイズを小さくすると、分類子は常に同じ数を予測し始めます。これは、疑似ランダム生成で最も頻繁に発生するものです。奇妙なことに(そうでないかもしれませんが)この動作は、勝利スコアをわずかに増加させるようです。


3

古い質問ですが、1つの実用的な答えに値すると思いました。としてpythonの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の4番目の整数です。たとえば、X = [15、33、44、30、3]の場合、y = 30です。 LSTMは4番目のサンプルをエコーすることを学習しています。
thinkski

はい、良い点です。それでも、LSTMの使い方の非常に興味深い実用的な例であることがわかります。入力としてのみ与えられるシードからMersenne Twisterのようなものを学ぶ方法を知っているなら、私は本当に興味があるので、ここに投稿してください。十分なサンプル数で可能と思われますが、私は完全に間違っているかもしれません。
isp-zax

2

疑似乱数ジェネレータが数値をスローしている場合、これらの数値の分析では、数値がランダムではなく、そのアルゴリズムによって決定され、偶然ではないため、それらを生成したアルゴリズムを決定できます。世界が物理法則で構成されている場合、イベントで観察される見かけ上のランダム性はそれらの物理法則に比べて理解および複製することができます。そして、疑似ジェネレーターはもはや存在せず、実際のランダム性であり、その定義からは決定不可能であり、パラドックスを提示します。ルールが定義によってランダム性をどのように作成できるかは、確かに、観察するイベントのランダム性に対する私たちの明白な認識は暗示であり、実際には予測できない確実性です。


1
そうだね。かなり哲学的ですが。技術的な回答が多少期待されます。とにかくありがとう:)
AshTyson 2017

2

デメントの発言に加えて、乱数生成アルゴリズムのランダム性の範囲が重要な問題です。以下は、RNGを弱くする可能性があるいくつかの設計です。
隠されたシーケンス
これは、生成された前のいくつかの文字シーケンスであると想定します(実際の使用例では、より大きな範囲を使用しています)。

lwjVJA
Ls3Ajg
xpKr+A
XleXYg
9hyCzA
jeFuNg
JaZZoA

最初は、世代のパターンを確認することはできませんが、それらをBase64エンコーディングに変更してから16進数に変更すると、次のようになります。

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

前の数値から各数値を減算すると、次のようになります。

FF97C4EB6A
97C4EB6A
FF97C4EB6A
97C4EB6A
FF97C4EB6A
FF97C4EB6A

これは、アルゴリズムが以前の値に0x97C4EB6Aを追加し、結果を32ビットの数値に切り捨て、Base64でデータをエンコードすることを示しています。
上記は基本的な例です。今日のMLアルゴリズムとシステムは、より複雑なパターンを学習および予測するのに十分な能力を備えています。

時間依存性
一部のRNGアルゴリズムは、乱数を生成するための主要な入力として時間を使用します。特に、アプリケーション内で使用するために開発者自身が作成したものです。

確率的であると思われる弱いRNGアルゴリズムが実装されている場合は常に、十分なデータセットが利用できる場合に備えて、完全な精度前方または後方に推定できます。


量とそのコミュニケーションの概念を、自分の直感から離れていないことがわかっているパターンを決定する方法であることを私自身に示したところです:)
ボブス

しかし、ランダム性が合理性から切り離された「製品」であるという不可分な問題は、進化のプロセスを保持するという謙虚さから派生した、使用する言語の機能から人間の正気を維持する方法から導き出そうとするとき、それでもなお不可分の問題を引き起こします。笑。
ボブ

ランダム性またはその知覚は、現実と人間の知覚の間の分離であり、そのばらばらさのために、知覚の残余だけが私たち全員が観察する一人一人の写真を決定し、概念的分布における人間の同心因子の知的分離性のために、伝達可能なランダム性に追加されます。
ボブ

ランダム性を分析しようとする場合、分析を開始するための根拠のない何かを分析するにはどうすればよいのでしょうか?確かに、それは確実にエゴ腸内爆笑の基礎からです
ボブス

疑似ランダム性は、プラスチックの人々が本当の意味での地球の品質になりすまして、彼らが不必要に無視したり、不道徳な、または人間の夢中になったりする性質です。決意は信仰と職業の確実性、そして苦難のバランスの問題に耐えることなく、良い人生の産物の健全なコミュニケーションにつながります。
ボブは
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.