2016-06-01 8 views
0

少し質問があります。ニューラルネットワークで大きな数字処理

大きな数字(> 1)、例えばニューラルネットワークを訓練するための最良の方法だろう何

:(ちょうどこの背後には本当に何の意味、例えば)

input[][] {{10,100,1000}}; 
desiredOutput {{5000}}; 

正常なので、ニューロンは-1対1しか出力できず、ネットは5000を出力することができません。最初にそれを分割し、最後にそれを再び掛けるのは意味がありますか?

input[][] {{10,100,1000}}; --> {{0.001,0.01,0.1}}; (divide by 10'000) 
desiredOutput {{0.5}}; --> {{5000}}; (multiply by 10'000) 

通常より良い方法がありますか?

+0

'float'による計算が' int'よりも遅いため、数値を分割しません。 –

+0

@KevinWallisとにかくダブルスを入力することができます。十分な時間があります。P –

+0

すべての数値の正規化よりも読みやすいアルゴリズムが必要な場合は意味があります。そうでなければ、私は "大きな数字" –

答えて

0

数値が正の数であり、例のように数桁の大きさが異なる場合、対数スケーリングはおそらく意味があります。そうでなければ、ニューラルネットワークによって実行される出力計算は大きな入力によって支配されるが、より小さい数の修正はほとんど影響を及ぼさない。

ほとんどのアプリケーションでは相対的な変更が重要なので、これはおそらくあなたが望むものではありません。入力を1から2(100%)に変更した場合、絶対差は同じですが、1000から1001(0.1%)を変更した場合よりも出力に与える影響は大きいと思われます。

これは、対数スケーリングによって回避できます。

例:累乗を使用して、元の範囲に出力を変換するに

transformedInput = (Math.log10(input) - 1.0)/4.0 

:0から1まで1から10000までの範囲の範囲を変換するには、この数式を使用することができ

output = Math.pow(10.0, 4.0 * output + 1.0); 
0

回帰のためにネットワークを使いたいと思うようです。その場合、出力レイヤーに線形活性化関数を使用するのが理にかなっています。その理由は、あなたが言及しているように、シグモイド関数は指定された範囲外の値を出力できないからです。おそらくあなたのインプットを中心化して正規化するのにも役立ちます。

0

あなたが求めているのはnormalizationです。はい、データは範囲[0; 1]または[-1; 1]を入力してください。

ネットワークから得られる結果も同じ範囲にスケーリングされますが、入力値を正規化するために使用されるものと同じ係数を出力値に使用する必要はありません。

出力値は、入力と非常に異なる意味を持つ場合があり、入力と同じように拡大縮小する理由はありません。同様にWhy do we have to normalize the input for an artificial neural network?

関連する問題