CNTK分类模型Classifies all 1

CNTK classification model Classifies all 1

我有一个 cntk 模型,它接收与点击和其他信息相关的特征,并预测将来是否会点击某些内容。在随机森林中使用相同的功能效果很好,但是,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
]

学习率好像偏高了,试试learningRatesPerSample = 0.001

除了KeD所说的,随机森林不关心特征的实际值,只关心它们的相对顺序。

与树不同,神经网络对特征的实际值很敏感(而不仅仅是它们的相对顺序)。

您的输入可能包含一些具有非常大值的特征。您可能应该重新编码它们。有不同的方案可以做到这一点。一种可能性是从每个特征中减去平均值并将其缩放为 -1,1 或除以它的标准差。正特征的另一种可能性是转换,例如 f => log(1+f)。您还可以使用批量归一化层。

由于您的特征具有不同的尺度,我建议您将特征归一化。你提到,cntk 将所有输入分类为 1。我假设它发生在你使用训练有素的模型进行预测时。但是,训练期间会发生什么?能否在图上画出训练+测试误差图(cntk现在支持TensorBoard了)?这会给您一些指示,表明您的模型是否过度拟合。此外,另一方面,我建议增加模型的学习能力(很可能是通过增加隐藏层的数量)来学习更好的数据分布。