2017-04-19 20 views
2

クリック数やその他の情報に関連する機能を取り入れ、何かが将来クリックされるかどうかを予測するcntkモデルがあります。しかし、ランダムフォレストで同じ機能を使用すると問題なく動作しますが、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,1にスケーリングするか、またはその標準偏差で除算することです。肯定的な特徴の別の可能性は、f => log(1 + f)のような変換である。また、バッチの正規化レイヤーを使用することもできます。

0

学習率が高すぎると思われる、learningRatesPerSampleを試してみてください= 0.001

1

あなたの機能はさまざまなスケールであるため、機能を標準化することをお勧めします。あなたは言いました、cntkはすべての入力を1と分類します。訓練されたモデルの使用を予測するときに起こりそうです。しかし、トレーニング中に何が起こりますか?グラフにトレーニング+テストエラーのグラフをプロットできますか(cntkは現在TensorBoardをサポートしています)?それは、あなたのモデルが過度にフィットしているかどうかを示すものです。さらに、私はあなたのデータのより良い分布を学ぶために、モデルの学習能力を高めることを提案します(ほとんどの場合、隠れた層の数を増やすことによって)。

+0

batchnormalizationレイヤーはフィーチャの正規化を行いますか?どのような正規化を行うことができますか? –

+0

私は標準化、すなわち '(x-mean)/ std'を参照していました。しかし、BatchNormalizationを使用してこれを行うことができ、パフォーマンスが向上する可能性があります。モデルの学習プロセスの一部として正規化を実際に学習します。私が知る限り、平均と分散を使って入力を正規化します。しかし、オーバーフィットを減らし、慎重に初期化する必要性を減らすなど、他にも優れたメリットがあります。もし興味があれば、[here](https://arxiv.org/abs/1502.03167)の詳細を読むことができます。 –

関連する問題