2017-04-19 65 views
2

我有一個cntk模型,其中包含與點擊和其他信息相關的功能,並預測將來是否會點擊某些內容。然而,在randomforest中使用相同的功能可以很好地對cntk進行分類。1.爲什麼會發生這種情況?是否需要調整參數?這些功能具有不同的規模。 我乘坐的火車動作看起來是這樣的:CNTK分類模型分類全部1

BrainScriptNetworkBuilder = [ 
    inputD = $inputD$ 
    labelD = $labelD$ 
    #hidden1 = $hidden1$ 
    model(features) = { 
     w0 = ParameterTensor{(1 : 2), initValueScale=10}; b0 = ParameterTensor{1, initValueScale=10}; 
     h1 = w0*features + b0; #hidden layer 
     z = Sigmoid (h1) 
    }.z 
    features = Input(inputD) 
    labels = Input(labelD) 

    z = model(features) 
    #now that we have output, find error 
    err = SquareError (labels, z) 
    lr = Logistic (labels, z) 
    output = z 

    criterionNodes = (err) 
    evaluationNodes = (err) 
    outputNodes = (z) 
] 

SGD = [ 
    epochSize = 4 #learn 
    minibatchSize = 1 #learn 
    maxEpochs = 1000 #learn 
    learningRatesPerSample = 1 
    numMBsToShowResult = 10000 
    firstMBsToShowResult = 10 
] 

回答

1

除了什麼KED說,隨機森林不關心實際值的功能,只關乎他們的相對順序。

與樹不同,神經網絡對特徵的實際值(而不僅僅是它們的相對順序)很敏感。

您的輸入可能包含一些非常大的值。你應該重新編碼它們。有這樣做有不同的方案。一種可能性是從每個特徵中減去平均值,並將其縮放到-1,1或除以它的標準偏差。正特徵的另一種可能性是諸如f => log(1 + f)的轉換。您也可以使用批規範化圖層。

0

看來學習率過高,請嘗試learningRatesPerSample = 0.001

1

由於您的功能具有不同的尺寸,因此我建議您將功能標準化。您提到,cntk將所有輸入分類爲1.我假設它發生在您預測使用訓練好的模型時。但是,在訓練期間會發生什麼?你可以在圖上畫一個訓練+測試錯誤圖(cntk現在支持TensorBoard)?那會給你一些關於你的模型是否過度適應的跡象。此外,作爲一個方面,我建議增加模型的學習能力(很可能通過增加隱藏層的數量)來學習更好的數據分佈。

+0

batchanormalization層z功能的歸一化?什麼樣的標準化可以完成? –

+0

我指的是標準化,即'(x - mean)/ std'。但是,BatchNormalization可以用來做到這一點,並可能會表現更好。它實際上將學習規範化作爲你模型學習過程的一部分。據我所知,它使用均值和方差來標準化輸入。然而,它還有其他很多好處,例如減少過度擬合,減少仔細初始化的需要 - 這幾乎總是有好處。如果你有興趣,你可以在這裏閱讀更多關於它的細節(https://arxiv.org/abs/1502.03167)。 –