2

私は Java で基本的なニューラル ネットワークを作成しており、活性化関数を作成しています (現在、シグモイド関数を作成しています)。トレーニングに実際に妥当な時間がかかることを期待して、double( に並べて) sを使用しようとしています。BigDecimalただし、関数がより大きな入力では機能しないことに気付きました。現在、私の機能は次のとおりです。

public static double sigmoid(double t){

    return (1 / (1 + Math.pow(Math.E, -t)));

}

この関数は when までかなり正確な値を返しますが、関数が を返すt = -100ときです。入力が正規化されている場合の典型的なニューラルネットワークでは、これで問題ありませんか? ニューロンは、入力の合計が ~37 を超えることはありますか? 活性化関数に与えられる入力の合計のサイズが NN ごとに異なる場合、それに影響を与える要因にはどのようなものがありますか? また、この機能をより正確にする方法はありますか? より正確かつ/またはより高速な代替手段はありますか?t >= 371.0

4

2 に答える 2

2

はい、正規化されたネットワークでは double を使用しても問題ありません。ただし、これは入力に依存します。入力レイヤーが大きい場合、入力の合計はもちろん大きくなります。

C++ を使用して同じ問題に遭遇しました。t が大きくなると、コンパイラ/rte は E^-t を考慮に入れず、1/1 の部分のみを計算するため、プレーンな 1 を返します。既に正規化された入力を 1000-1000000 で除算しようとしましたが、うまくいくこともありましたが、最初のエポックにランダム化された入力を使用していて、入力レイヤーがマトリックス 784x784 だったため、うまくいかないこともありました。それにもかかわらず、入力レイヤーが小さく、入力が正規化されている場合、これは役立ちます

于 2016-09-27T11:00:18.650 に答える