【问题标题】:CNTK classification model Classifies all 1CNTK 分类模型 分类全部 1
【发布时间】:2017-04-19 05:39:05
【问题描述】:

我有一个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
]

【问题讨论】:

    标签: cntk


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 批量归一化层是否会对特征进行 z 归一化?可以做什么样的归一化?
      • 我指的是标准化,即(x - mean) / std。但是,可以使用 BatchNormalization 来执行此操作,并且可能会表现得更好。作为模型学习过程的一部分,它实际上会学习归一化。据我所知,它使用均值和方差来标准化输入。然而,它还有其他好处,比如减少过度拟合和减少仔细初始化的需要——这几乎总是好的。如果您有兴趣,可以阅读更多详细信息here
      【解决方案3】:

      好像学习率太高,请试试 learningRatesPerSample = 0.001

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 2017-10-25
        相关资源
        最近更新 更多