14

次のように定義されたシグモイド伝達関数を使用するJavaで記述されたニューラルネットワークがあります。

private static double sigmoid(double x)
{
    return 1 / (1 + Math.exp(-x));
}

これは、ネットワークを使用したトレーニングおよび計算中に度も呼び出されます。これをスピードアップする方法はありますか?遅いということではなく、頻繁に使用されるというだけなので、ここでの小さな最適化は全体的に大きな利益になります。

4

4 に答える 4

23

ニューラルネットワークの場合、シグモイド関数の正確な値は必要ありません。したがって、100個の値を事前に計算して、入力に最も近い値を再利用できます。または、(コメントで述べたように)隣接する値から補間を行うこともできます。

これを行う方法は、この記事で説明されています( s-lottの回答から盗まれたリンク)。

これはシグモイド関数です:シグモイド関数グラフ

ご覧のとおり、-10<x<10の値だけがまったく興味深いものです。そして、別のコメントが述べているように、関数は対称的です。値の半分だけを保存する必要があります。


編集:ここに間違ったグラフを表示して申し訳ありません。修正しました。

于 2010-05-22T11:21:46.457 に答える
6

xの値が-10..+ 10ボックスの外側にあるノードが多数ある場合は、それらの値の計算を省略できます。たとえば、..

if( x < -10 )
    y = 0;
else if( x > 10 )
    y = 1;
else
    y = 1 / (1 + Math.exp(-x));
return y;

もちろん、これにはすべての計算の条件付きチェックのオーバーヘッドが発生するため、飽和状態のノードがたくさんある場合にのみ価値があります。

言及する価値のあるもう1つのことは、バックプロパゲーションを使用していて、関数の傾きを処理する必要がある場合は、「記述どおり」ではなく、分割して計算する方がよいということです。

現時点では傾斜を思い出せませんが、ここでは、例としてバイポーラシグモイドを使用して話していることがあります。この方法で計算するのではなく

y = (1 - exp(-x)) / (1 + exp(-x));

exp()に2回ヒットすると、コストのかかる計算を一時変数にキャッシュできます。

temp = exp(-x);
y = (1 - temp) / (1 + temp);

この種のものをBPネットで使用する場所はたくさんあります。

于 2010-05-22T15:22:51.537 に答える
1

これは非常にスムーズな関数であるため、ルックアップおよび補間スキームで十分である可能性があります。

の範囲で関数をプロットする-10 <= x <= 10と、極値で5つの場所の精度が得られます。それはあなたのアプリケーションにとって十分ですか?

于 2010-05-22T11:38:48.243 に答える
0

数学の観点からは、それを最適化する可能性はないと思います。

于 2010-05-22T11:06:39.707 に答える