11

私はニューラルネットワークを使用してこのKaggle問題を解決しようとしています。PybrainPythonライブラリを使用しています。

これは、古典的な教師あり学習の問題です。次のコードでは、「data」変数はnumpy array(892 * 8)です。7つのフィールドは私の機能であり、1つのフィールドは「0」または「1」の出力値です。

from pybrain.datasets import ClassificationDataSet
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.tools.shortcuts import buildNetwork

dataset = ClassificationDataSet(7,1)
for i in data:
    dataset.appendLinked(i[1:],i[0])
net = buildNetwork(7,9,7,1, bias = True,hiddenclass = SigmoidLayer, outclass = TanhLayer)
trainer = BackpropTrainer(net, learningrate = 0.04, momentum = 0.96, weightdecay = 0.02, verbose = True)
trainer.trainOnDataset(dataset, 8000)
trainer.testOnData(verbose = True)

ニューラルネットワークをトレーニングした後、トレーニングデータでテストしていると、すべての入力に対して常に単一の出力が得られます。好き:

Testing on data:
out:     [  0.075]
correct: [  1.000]
error:  0.42767858
out:     [  0.075]
correct: [  0.000]
error:  0.00283875
out:     [  0.075]
correct: [  1.000]
error:  0.42744569
out:     [  0.077]
correct: [  1.000]
error:  0.42616996
out:     [  0.076]
correct: [  0.000]
error:  0.00291185
out:     [  0.076]
correct: [  1.000]
error:  0.42664586
out:     [  0.075]
correct: [  1.000]
error:  0.42800026
out:     [  0.076]
correct: [  1.000]
error:  0.42719380
out:     [  0.076]
correct: [  0.000]
error:  0.00286796
out:     [  0.076]
correct: [  0.000]
error:  0.00286642
out:     [  0.076]
correct: [  1.000]
error:  0.42696969
out:     [  0.076]
correct: [  0.000]
error:  0.00292401
out:     [  0.074]
correct: [  0.000]
error:  0.00274975
out:     [  0.076]
correct: [  0.000]
error:  0.00286129

LearningRate、weightDecay、momentum、非表示ユニットの数、非表示レイヤーの数、非表示レイヤーのクラス、出力レイヤーのクラスを変更して解決しようとしましたが、いずれの場合も、入力がトレーニングからのものである場合、すべての入力に対して同じ出力が得られます。データ。

「XOR」用のニューラルネットワークを構築していたとき、ナノスケールでエラーが発生し始めるまでに少なくとも700回の反復が必要だったため、8000回以上実行する必要があると思います。'XOR'のトレーニングデータサイズはわずか4でしたが、この場合は892です。したがって、元のデータの10%(現在のトレーニングデータのサイズは89)で8000回の反復を実行しましたが、それでもすべての入力に対して同じ出力が得られました。トレーニングデータで。また、入力を「0」または「1」に分類したいので、出力層のクラスをSoftmaxとして使用している場合、出力として常に「1」が返されます。

どの構成(隠れユニットの数、出力層のクラス、学習率、隠れ層のクラス、勢い)に関係なく、「XOR」で使用していましたが、いずれの場合も多かれ少なかれ収束し始めました。

最終的にエラー率が低くなる構成がある可能性があります。トレーニングデータのすべての入力に対して同じ出力が得られないように、少なくともいくつかの構成。

80,000回の反復で実行しました(トレーニングデータサイズは89です)。出力サンプル:

Testing on data:
out:     [  0.340]
correct: [  0.000]
error:  0.05772102
out:     [  0.399]
correct: [  0.000]
error:  0.07954010
out:     [  0.478]
correct: [  1.000]
error:  0.13600274
out:     [  0.347]
correct: [  0.000]
error:  0.06013008
out:     [  0.500]
correct: [  0.000]
error:  0.12497886
out:     [  0.468]
correct: [  1.000]
error:  0.14177601
out:     [  0.377]
correct: [  0.000]
error:  0.07112816
out:     [  0.349]
correct: [  0.000]
error:  0.06100758
out:     [  0.380]
correct: [  1.000]
error:  0.19237095
out:     [  0.362]
correct: [  0.000]
error:  0.06557341
out:     [  0.335]
correct: [  0.000]
error:  0.05607577
out:     [  0.381]
correct: [  0.000]
error:  0.07247926
out:     [  0.355]
correct: [  1.000]
error:  0.20832669
out:     [  0.382]
correct: [  1.000]
error:  0.19116165
out:     [  0.440]
correct: [  0.000]
error:  0.09663233
out:     [  0.336]
correct: [  0.000]
error:  0.05632861

平均誤差:0.112558819082

(「最大エラー:」、0.21803000849096299、「中央値エラー:」、0.096632332865968451)

範囲(0.33、0.5)内のすべての出力を提供します。

4

1 に答える 1

6

あなたが言及しなかったさらに別のニューラルネットワークメトリックがあります-適応可能な重みの数。隠しレイヤーとその中のユニットの数に関連しているため、これから答えを始めます。

適切に一般化するには、重みの数を Np/Ny よりもはるかに小さくする必要があります。ここで、Np はパターンの数、Ny は正味の出力の数です。「多く」とは正確には議論の余地があります。数倍の差、たとえば10をお勧めします。タスクの約1000のパターンと1つの出力の場合、これは100の重みを意味します。

2 つの非表示レイヤーを使用しても意味がありません。非線形性が関係するほとんどのタスクでは、1 で十分です。あなたの場合、追加の隠しレイヤーは、全体的なパフォーマンスに影響を与えることによってのみ違いを生みます. したがって、1 つの隠れ層が使用される場合、その中のニューロンの数は、重みの数を入力の数で割った値、つまり 100/7 = 14 として概算できます。

Hypertanh か Sigmoid のいずれかで、すべてのニューロンで同じ活性化関数を使用することをお勧めします。出力値は、実際にはシグモイド用に既に正規化されています。とにかく、すべての次元で [0,1] に収まるように入力データを正規化することで、NN のパフォーマンスを向上させることができます。もちろん、各機能を独自に正規化します。

Pybrain ライブラリを使用できる場合は、より大きな学習率で学習を開始し、現在のステップ(LR * (N - i)/N)に比例して滑らかに減少させます。ここで、i は現在のステップ、N は制限、LR は初期学習率です。

@Junuxxが示唆したように、プログラムが期待どおりに動作することを確認するために、Mステップごとに現在のエラーを出力します(可能な場合)。連続するステップでの誤差の差がしきい値未満になった場合、学習を停止します。適切な NN パラメータの開始と大まかな推定のために、しきい値を 0.1 ~ 0.01 に設定します (「ナノスケール」では必要ありません)。

80000 ステップで 89 パターンのネットワークを実行し、結果が得られるという事実は奇妙です。正しいデータを NN に渡していることを再確認し、提供したエラー値が何を意味するかを調べてください。おそらく、表示されるエラーまたは出力のいずれかが間違った場所から取得されます。89 パターンで許容できる結果を得るには、10000 ステップで十分だと思います。

特定のタスクに関しては、SOM ネットが別のオプションになる可能性があると思います (BP よりも適している可能性があります)。

補足として、私は Pybrain に精通していませんが、C++ や他の言語でいくつかの NN をコーディングしているため、タイミングが非常に大きく見えます。

于 2012-10-08T10:40:46.027 に答える