2016-12-06 2 views
1

여기 나를 도울 수 있는지는 잘 모르지만 알아낼 수없는 문제가 있습니다. 나는 약 450,000 개의 엔트리를 가진 커다란 (나를 위해) 데이터 세트를 가지고있다.TFLearn - NaN 손실로 이어지는 대용량 데이터 집합

[217088.0, 212992.0, 696.0, 191891.0, 524.0, 320.0, 0.0, 496.0, 0, 0, 364.0, 20.0, 0, 1.0, 0, 0.0, 0, 4.0, 22.0, 0, 672.0, 46.0, 16.0, 0.0, 0.0, 106496.0, 8.0, 0, 4.0, 2.0, 26.0, 640.0, 0.0, 1073741888.0, 624.0, 516.0, 4.0, 3.0, 0, 4319139.0, 0.0, 0, 0.0, 36.0, 8.0, 217088.0, 0.0, 0, 0, 0, 4.0, 5.0, 0, 20.0, 255624.0, 65535.0, 5.10153058443, 396.0, 4319140.0, 552.0, 144.0, 28.0, 5.0, 1048576.0, 217088.0, 350.0, 0.0, 0, 7.0, 1048576.0, 260.0, 0, 116.0, 0, 322.0, 0.0, 0, 4319141.0, 0.0, 10.0, 0.0, 9.0, 4.0, 0, 0, 0, 6.36484131641, 0.0, 0, 11.0, 72.0, 372.0, 45995.0, 217088.0, 0, 4096.0, 12.0, 80.0, 592.0, 264.0, 0, 0, 4096.0, 0.0, 256.0, 0.0, 49152.0, 700.0, 0, 4096.0, 0, 0, 0.0, 336.0, 8.0, 0, 0.0, 0, 4319142.0, 0.0, 60.0, 308.0, 4319143.0, 0, 0, 0, 0, 0, 0.742746270768, 316.0, 420.0, 276.0, 1073741888.0, 0.0, 332.0, 284.0, 0, 1107296320.0, 0.0, 4.0, 13.0, 18.0, 0.0, 632.0, 424.0, 261200.0, 0.0, 299008.0, 0.0, 4096.0, 0, 0.0, 299008.0, 0, 658.0, 0, 4319144.0, 4319145.0, 12.0, 50.0, 292.0, 688.0, 484.0, 70.0, 20.0, 4319146.0, 16.0, 17.0, 0, 0, 0, 0.0, 18.0, 4.0, 330.0, 0.0, 0, 0.0, 42.0, 303104.0, 19.0, 8.0, 20.0, 0.0, 0.0, 544.0, 340.0, 0, 14.0, 0, 209078.0, 0.0, 0.0, 22.0, 0, 209078.0, 0.0, 0.0, 18932.0, 4319147.0, 4.58031739078, 0.0, 376.0, 0.0, 0, 632.0, 4.0, 0, 0, 0, 428.0, 0, 0, 323584.0, 0.0, 24.0, 4.0, 368.0, 12.0, 40.0, 0, 720.0, 4.0, 348.0, 267.0, 20468.0, 32.0, 45995.0, 303104.0, 0.0, 0.0, 0, 0, 224.0, 16.0, 4.0, 44.0, 0.0, 0.0, 444.0, 720.0, 0, 1180.0, 0.0, 16.0, 412.0, 0.0, 4.0, 8462.0, 600.0, 568.0, 16.0, 0, 2.0, 36.0, 0.0, 6.0, 0, 21.0, 0.0, 24.0, 0, 4.0, 652.0, 4319148.0, 92.0, 8.0, 2.0, 0, 0.0, 0, 16.0, 0, 0, 324.0, 4.0, 300.0, 0, 278.0, 400.0, 0, 0.0, 0, 352.0, 0, 0.0, 209078.0, 8.0, 4096.0, 8.0, 36.0, 0.0, 256.0, 268435456.0, 0.0, 48.0, 4319149.0, 6.0, 4319150.0, 0, 416.0, 0, 0, 283.0, 4.0, 0, 0, 0, 8.0, 592.0, 0, 0, 25.0, 0.0, 0, 0, 0.0, 332.0, 212992.0, 540.0, 512.0, 0, 532.0, 20.0, 26.0, 0.0, 0, 52.0, 440.0, 7.0, 488.0, 8.0, 12.0, 0.0, 60.0, 14.0, 3221225536.0, 7.0, 56.0, 432.0, 4.0, 0, 12.0, 0.0, 40.0, 680.0, 16.0, 504.0, 344.0, 576.0, 0.0, 452.0, 266240.0, 290816.0, 578.0, 0, 552.0, 34.0, 0.0, 636.0, 88.0, 698.0, 282.0, 328.0, 38.0, 8.0, 480.0, 64.0, 4319151.0, 0.0, 0.0, 34.0, 460.0, 64.0, 0, 612.0, 0.0, 4319152.0, 0, 604.0, 0, 436.0, 0, 0, 20.0, 0, 4.0, 0, 0, 0, 0, 40.0, 356.0, 584.0, 0, 84.0, 0.0, 0, 0, 0, 294912.0, 7.0, 29.0, 20.0, 0, 60.0, 0.0, 268.0, 536.0, 4319153.0, 0.0, 106.0, 456.0, 24.0, 404.0, 0, 31.0, 0, 380.0, 24.0, 648.0, 0.0, 0, 0, 0.0, 0, 0, 0, 0.0, 0, 0, 0.0, 0.0, 1883.0, 5.85655736551, 34.0, 17744.0, 28680.0, 38.0, 36.0, 0.0, 24576.0, 596.0, 107.0, 33.0, 4.0, 5.0, 0, 0, 45995.0, 384.0, 8.0, 0, 0, 500.0, 20468.0, 34.0, 312.0, 8.0, 660.0, 0.0, 35.0, 608.0, 0, 684.0, 8.0, 68.0, 0.0, 32.0, 34.0, 23117.0, 3.0, 520.0, 0, 4319154.0, 0, 0, 512.0, 8.0, 28.0, 4096.0, 0, 538.0, 0.0, 572.0, 0.0, 2.0, 36.0, 0.0, 0.0, 32.0, 32.0, 4.0, 28.0, 0, 4.0, 38.0, 68.0, 9.0, 0.0, 0, 0.0, 36.0, 39.0, 618.0, 0, 8.0, 266240.0, 4.0, 5.0, 34.0, 304.0, 0, 0.0, 20.0, 40.0, 0.0, 0.0, 0, 580.0, 556.0, 4.0, 8.0, 262.0, 0, 12.0, 32.0, 0, 76.0, 12.0, 184.0, 720.0, 4.0, 16.0, 644.0, 16.0, 28680.0, 4319155.0, 720.0, 0.0, 564.0, 392.0, 672.0, 0.0, 24.0, 492.0, 0, 0.0, 676.0, 0, 0, 0, 12.0, 592.0, 360.0, 8.0, 692.0, 552.0, 4.0, 36.0, 512.0, 7198.0, 42.0, 44.0, 45.0, 4319156.0, 20.0, 388.0, 476.0, 5.0, 36.0, 20480.0, 47.0, 16.0, 326.0, 0.0, 12.0, 0.0, 0.0, 7.0, 272.0, 280.0, 0.0, 0, 288.0, 48.0, 4319157.0, 10.0, 448.0, 4.0, 4.0, 0, 20468.0, 408.0, 2.0, 50.0, 560.0, 0, 1610612768.0, 8.0, 0, 620.0, 656.0, 4.0, 4096.0, 51.0, 0, 0, 0.0, 28.0, 0, 616.0, 0, 296.0, 2.0, 632.0, 468.0, 28.0, 32.0, 52.0, 0, 528.0, 0, 28.0, 0.0, 0, 24.0, 18.0, 4096.0, 0, 8.0, 180.0, 664.0, 4319158.0, 26.0, 0.0, 6.0, 0, 4096.0, 472.0, 0, 28.0, 72.0, 464.0, 672.0, 0, 24.0, 4.0, 0, 28680.0, 0, 0, 18.0, 0, 0, 4319159.0, 24.0, 28.0, 16.0] 

내가, 예를 시도하고이 데이터의 떨어져 범주 모델을 만들 수 Tflearn을 사용하고 각 항목은 다음과 같은 형식에 대한 ~ 700 정수의 목록입니다 각 항목은 0 또는 1 레이블이 내가 알 수없는 항목이 0 또는 여기 1. 내 코드를 요약 한 것입니다 여부를 예측하는 모델을 훈련하기 위해 노력하고있어 :

def main(): 
    ## Options ## 
    num_tf_layers = 10   # Number of fully connected layers, ex. softmax layer 
    num_tf_layer_nodes = 32  # Number of nodes in the fully connected layers 
    print_test_scores = 1  # Bool to print test set and predictions 
    use_validation_set = 0  # Bool to use testing set when fitting 
    num_tf_epochs = 10 
    tf_batch_size = 1 
    tf_learn_rate = 0.001 

    ## Opening files 

    print("Preparing labels...") 
    trainY = tflearn.data_utils.to_categorical(temp_train_Y, nb_classes=2) 
    if use_validation_set: 
     testY = tflearn.data_utils.to_categorical(temp_test_Y, nb_classes=2) 
    print('Forming input data...') 
    net = tflearn.input_data(shape=[None, len(trainX[0])]) 
    print('Creating fully connected layers...') 
    for i in range(num_tf_layers): 
     net = tflearn.fully_connected(net, num_tf_layer_nodes) 
    print('Creating softmax layer...') 
    net = tflearn.fully_connected(net, 2, activation='softmax') 
    print('Preparing regression...') 
    net = tflearn.regression(net, learning_rate=tf_learn_rate) 
    print('Preparing DNN...') 
    model = tflearn.DNN(net) 
    print('Fitting...') 
    if use_validation_set: 
     model.fit(trainX, trainY, n_epoch=num_tf_epochs, batch_size=tf_batch_size, validation_set=(testX, testY), show_metric=True) 
    else: 
     model.fit(trainX, trainY, n_epoch=num_tf_epochs, batch_size=tf_batch_size, show_metric=True) 
    print('Complete...') 

나는 떨어져이 따라 다음 TFlearn example. 이 프로그램은 250 0과 250 1의 작은 데이터 세트에서 아름답게 작동했습니다. 나는 정확도가 80 %로 높았으며, 더 많은 데이터를 추가하면 정확도를 높일 수 있다고 생각했습니다. 그러나 대량의 데이터를 추가 한 후에는 손실이 NaN으로 이동합니다. 450,000을 한 번에 반복하는 것조차 쉽지 않습니다. 약간의 연구 후에 나는 그것이 디폴트로 남겨 두었던 것처럼, 나는 너무 높은 학습 률을 보일 수도 있음을 알았다. 나는 0.1과 0.000001 사이에서 그것을 설정했고 아무것도 NaN으로가는 손실을 막지 못했습니다. 또한 배치 크기를 1에서 1024 사이로 변경하고 레이어 수를 3에서 20으로 변경했습니다. 아무 도움이되지 않았습니다. 누군가는 그것을 고치기 위해 무엇을 바꾸어야하는지, 어떻게 다르게 접근해야하는지에 대한 아이디어가 있습니까?

감사합니다.

답변

1

네트워크가 vanishing gradient problem 인 것으로 추측됩니다. 이것은 신경망의 근본적인 문제는 아니며 특정 활성화 기능으로 인해 그라데이션 기반 학습 방법에 문제가 있습니다. 문제와 그 원인을 직관적으로 이해하려고 노력합시다.

문제

그라데이션 기반의 방법은 매개 변수 값의 작은 변화가 네트워크의 출력에 미치는 영향을 이해함으로써 매개 변수의 값을 배운다. 매개 변수의 값을 변경하면 네트워크의 출력이 매우 작아 지므로 네트워크가 매개 변수를 효과적으로 학습 할 수 없으므로 문제가됩니다.

이것은 바니시 그라디언트 문제에서 발생합니다. 초기 레이어의 매개 변수와 관련하여 네트워크 출력의 그라디언트가 매우 작아집니다. 이는 초기 레이어의 매개 변수 값이 크게 변경 되더라도 출력에 큰 영향을 미치지 않는다는 멋진 표현입니다. 이 문제가 언제 그리고 왜 발생하는지 이해하려고합시다.

원인

사라져 그라데이션 문제는 활성화 함수의 선택에 따라 달라집니다. 많은 일반적인 활성화 함수 (예 : 시그 모이 드 또는 tanh)는 입력을 매우 작은 출력 범위로 매우 비선형 적으로 스쿼시합니다. 예를 들어, sigmoid는 실제 숫자 라인을 [0, 1]의 "작은"범위로 매핑합니다. 결과적으로 매우 작은 범위로 매핑되는 입력 공간의 넓은 영역이 있습니다. 입력 공간의 이러한 영역에서는 입력이 크게 변경 되어도 출력이 약간 변경되므로 그라데이션이 작습니다.

우리는 이러한 비선형 성의 여러 레이어를 서로 쌓을 때 훨씬 더 악화됩니다. 예를 들어, 첫 번째 레이어는 큰 입력 영역을 작은 출력 영역으로 매핑합니다. 두 번째 레이어는 더 작은 영역에 매핑되고 세 번째 레이어는 더 작은 영역에 매핑됩니다. 결과적으로 첫 번째 레이어의 매개 변수가 크게 변경 되어도 출력이 크게 변경되지는 않습니다.

입력 영역을 작은 영역에 '스쿼시'하는 속성이없는 활성화 함수를 사용하면이 문제를 피할 수 있습니다. 가장 인기있는 선택은 xmax(0,x)으로 매핑하는 정류 된 선형 유닛입니다.

Quora의 post에서 가져온 답.

업데이트 : 폭발 그라데이션 문제

때때로 기울기가 이전 층에서 훨씬 더 큰 얻고 그것이 폭발 그라데이션 문제로 알려져있다. 예를 들어, 가중치 행렬에 대해 큰 값을 선택하고 그래디언트가 커지는 방식으로 바이어스 값을 설정하면 신경망은 폭발적인 그래디언트 문제로 고통을 겪게됩니다. 또 다른 이유는 데이터 포인트 자체가 커서 학습률이 낮더라도 그라데이션 강하 동안 매우 큰 단계를 초래할 수 있기 때문일 수 있습니다. 따라서 그라디언트 문제를 피하기 위해 훈련 전에 열별로 데이터 포인트를 정규화 할 수 있습니다.

또한 학습률이 높을수록 graidnet 문제가 폭발 할 수 있습니다. 나는 당신이 이걸 통해 article whill 사라지는 및 폭발 그라데이션 문제와 그 해결책에 대한 기본적인 아이디어를 설명하는 것이 좋습니다.

@timleathart에게 감사의 말을 전합니다.

+0

소실 그라디언트 문제로 인해 손실이 폭발하지는 않지만 오히려 열악한 값으로 정체됩니다. 게다가, 그는 이미 선형 액티베이션을 사용하고있어서, 사라지는 그라디언트를 실제로 겪을 수는 없습니다. – timleathart

+0

@timleathart 미분 값이 1보다 작은 활성화 함수 (Sigmoid and tanh) 때문에 소실 구배 문제가 발생할 수 있습니다. 따라서 OP가 OP를 사용한 경우 가능성이 있습니다. 나는 당신의 첫 번째 요점에 동의하며 그것을 반영하기 위해 나의 대답을 업데이트하고있다. 그 때문에 downvoted 경우, 나는 당신이 재검토 촉구합니다. 감사. –

+2

OP는 숨겨진 레이어에 사용할 활성화 함수를 지정하지 않았으므로 기본적으로 TFLearn에서 S 자형 또는 탄젠트가 아닌 선형 활성화 'f (x) = x'가됩니다. 문제는 데이터 포인트가 매우 높기 때문에 학습률이 낮더라도 그라데이션 강하 중에 매우 큰 단계가 발생한다는 것입니다. 이것들은 datascience.stackexchange.com에서이 질문의 원래 게시물에 대한 내 대답에 대해 조언 한 훈련 전의 기둥으로 정규화해야합니다. – timleathart