신경망을 사용하여 다음 의사 난수를 예측할 수 있습니까?


17

신경망에 난수 생성기의 출력을 공급하고 해싱 (또는 생성기) 기능을 익힐 것으로 기대하여 다음에 생성되는 의사 난수 가 무엇인지 예측할 있습니까?

이와 같은 것이 이미 존재합니까? 이 또는 이와 관련하여 (의사 난수의 예측과 관련하여) 이미 연구가 완료된 사람이라면 누구나 올바른 리소스를 알려줄 수 있습니까?

현재이 라이브러리와 관련 링크를보고 있습니다. https://github.com/Vict0rSch/deep_learning/tree/master/keras/recurrent


답변:


13

우리는 완벽한 RNG에 대해 이야기하는 경우, 대답은 분명하다 아니오 . 진정한 난수를 예측하는 것은 불가능합니다. 그렇지 않으면 진정으로 난수가 아닙니다.

의사 RNG에 대해 이야기 할 때 상황이 약간 변경됩니다. PRNG의 품질에 따라 문제는 쉬운 것에서 거의 불가능한 것까지 다양합니다. XKCD가 발표 한 것과 같이 매우 약한 PRNG는 훈련이 거의없는 신경망에 의해 쉽게 예측 될 수 있습니다. 그러나 실제로는 상황이 다르게 보입니다.

신경망은 다음 비트를 예측하기 위해 PRNG에 의해 생성 된 난수 이력에서 특정 패턴을 찾도록 훈련 될 수있다. PRNG가 더 강할수록 PRNG에 의해 생성 된 사전 임의성 비트마다 하나의 뉴런을 사용한다고 가정하면 더 많은 입력 뉴런이 필요합니다. PRNG가 예측할 수 없을수록 패턴을 찾기 위해 더 많은 데이터가 필요합니다. 강력한 PRNG의 경우 이는 불가능합니다.

긍정적으로, PRNG를 제어하고 원하는 수의 난수를 생성 할 수 있다고 가정하면 신경망에 대해 임의의 양의 훈련 패턴을 생성 할 수 있습니다.

현대의 PRNG는 암호화의 핵심 구성 요소이기 때문에 이러한 예측 공격을 견딜 수있는 "무작위"인지 확인하기 위해 광범위한 연구가 수행되었습니다. 따라서 현재 사용 가능한 계산 리소스로는 신경망을 구축하여 암호화에 안전한 것으로 간주되는 PRNG를 성공적으로 공격 할 수 없습니다.

또한 암호화를 깨기 위해 PRNG의 출력을 정확하게 예측할 필요는 없습니다. 구현을 크게 약화시키기 위해서는 확실하게 50 %를 약간 넘는 다음 비트를 예측하는 것으로 충분할 수 있습니다. 따라서 성공률이 55 % 인 PRNG (암호화 보안으로 간주)의 다음 비트를 예측하는 신경망을 구축 할 수 있다면 보안 뉴스 헤드 라인을 꽤 오랫동안 만들 수있을 것입니다.


2
와이에 대한 설명 감사합니다. 패턴을 분석하고 다음 비트를 예측하려고하는데 완벽한 RNG가 아니라 다소 견고한 PRNG입니다. 그러나 최신 기술도 아닙니다. 나는 작은 계산 능력과 적절한 구현으로 60-70 %로 예측할 수 있다고 생각합니다. 가능하면 이에 대해 더 자세히 읽을 수있는 자료를 알려 주시겠습니까? 나는 연구 배경과 더 많은 개발자가 아닙니다.
AshTyson

3

기계 학습에 대한 완전한 초보자이기 때문에이 실험을 수행했습니다 (Scikit-learn 사용).

  • python random.choices 함수를 사용하여 90 개 중 N 개의 숫자를 선택하여 많은 수의 의사 랜덤 추출을 생성했습니다.

  • 다음과 같이 구성된 교육 데이터를 사용하여 MLP 분류기를 훈련했습니다.

    • i 번째 샘플 : X <-복권 결과 [i : i + 100], Y <-복권 결과 [i]

    실제로, 나는 N 개의 숫자를 부여하고, 다음 숫자를 예측하는 함수를 목표로 삼았습니다.

  • 훈련 된 분류 자에게 나머지 숫자를 예측하도록 요청했습니다.

결과 :

  • 물론, 분류자는 신경망을 기반으로하지 않는 임의의 추측 또는 다른 기술과 비교할만한 승리 점수를 얻었습니다 (나는 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의 4 번째 정수이다. 예를 들어, X = [15, 33, 44, 30, 3], y = 30 인 경우. LSTM은 4 번째 샘플을 에코하는 법을 배우고 있습니다.
thinkski

예, 좋은 지적입니다. 나는 아직도 그것이 LSTM 사용법의 매우 흥미로운 실제적인 예라고 생각합니다. 입력으로 만 주어진 씨앗에서 Mersenne Twister와 같은 것을 배우는 방법을 알고 있다면 정말로 관심이 있으니 여기에 게시하십시오. 충분한 샘플로 가능하지만 완전히 잘못되었을 수 있습니다.
isp-zax

2

psuedo 난수 생성기가 숫자를 버릴 경우 이러한 숫자를 분석 할 때 숫자가 난수가 아니기 때문에 해당 알고리즘에 의해 결정되고 우연이 아니기 때문에 숫자를 생성 한 알고리즘을 결정할 수 있습니다. 세계가 물리적 법칙으로 구성되어 있다면 사건에서 우리가 관찰하는 명백한 무작위성보다 이해하고 복제 할 수 있습니다. 의사 생성기는 더 이상 존재하지 않으며, 그 정의로부터 결정 불가능한 실제 무작위성이며 역설을 제시한다. 우리가 관찰 한 사건의 무작위성에 대한 명백한 인식이 규칙에 의해 어떻게 무작위성을 만들어내는가는 암시이며 실제로 우리가 예측할 수없는 확실성입니다.


1
진실. 그래도 상당히 철학적입니다. 다소 기술적 인 답변이 필요합니다. 어쨌든 감사합니다 :)
AshTyson

2

Demento가 말한 것 외에도 난수 생성 알고리즘의 임의성 정도가 주요 문제입니다. 다음은 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 알고리즘이 구현 될 때마다 충분한 데이터 세트를 사용할 수있는 경우 완벽한 정확도앞뒤로 외삽 할 수 있습니다.


당신은 방금 양과 그 의사 소통 사이의 개념을 제가 직관에서 멀지 않은 것으로 알고있는 패턴을 결정하는 방법이라는 개념을 보여주었습니다.
Bobs

그러나 그것은 우리가 진화 과정을 유지하는 데 겸손에서 비롯된 인간의 정신을 유지하는 방법을 인식하는 우리가 사용하는 언어의 기능에서 설명하려고 할 때 합리성에서 분리 된 "생성물"이라는 무작위성에 대한 불가분의 질문을 아직도 제기한다. lol.
Bobs

무작위성 또는 그 인식은 현실과 인간의 인식 사이의 분리이며, 그 분리 성으로 인해 지각력의 잔류 물 만이 개념적 분포의 인간 동심 요인으로 인해 우리 모두가 관찰하고 의사 소통 할 수있는 무작위성에 따라 우리 모두가 관찰하고 전달할 수있는 임의의 그림을 결정합니다.
Bobs

무작위성을 분석하려고한다면 확실하게 자아의 장 발작의 기초에서 온 것입니다.
Bobs

의사 난수 란 플라스틱을 무시하고 무시 당하고 인간의 선입견을 가지고있는 지구의 질에 가장 가까운 것으로 가장하는 플라스틱 사람들의 재산입니다. 결정은 고난의 균형의 문제를 견디지 ​​못하고 선한 삶의 산물에 대한 믿음과 직업의 확실성과 건전한 의사 소통으로 이어진다.
Bobs
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.