0

C++ で 5 つのパラメーターを持つ関数の単純な勾配降下法を書きたいと考えています。ここで、実装モデルの問題に出くわしました。引数をベクトル/配列に折りたたむために速度を犠牲にする必要があります。これが私の言いたいことです。次のように関数値と勾配計算を実装できます。

double function(double arg1, double arg2, ..., double arg5);
double functionGradient1(double arg1, double arg2, ..., double arg5);
double functionGradient2(double arg1, double arg2, ..., double arg5);
...
double functionGradient5(double arg1, double arg2, ..., double arg5);

また:

double function(double * args);
double functionGradientAt(double * args, int i);

後者の方が実装が簡単ですが、メモリを常に割り当てたり解放したりすると、速度が大幅に低下するのではないかと心配しています。

私の質問は次のとおりです。

  1. どちらを選びますか?
  2. 勾配降下法を実装したことがある場合、そのケースをどのように処理しましたか?
4

2 に答える 2

1

どちらを選びますか?

私は次を選びます:

double function(const vector<double> &args);

または、あなたの例からのものでなければならない場合は、次のようになります。

double function(double * args);

その理由は、そのように引数をアンロールしても顕著なスピードアップが追加されるとは思わないからですが、コードの見栄えが悪くなります。

勾配降下法を実装したことがある場合、そのケースをどのように処理しましたか?

ベクトルで処理しました。

勾配降下の速度は、これらのパラメーターを渡す方法よりも、実行する反復回数に依存する可能性があります。できるだけ速くしたい場合は、自分で実装するのではなく、実装されているライブラリを見つけることをお勧めします。この質問には、それに対する多くの良い提案があります。

于 2015-03-09T10:38:23.923 に答える
0

どちらの場合も: double functionGradient5(double arg1, double arg2, ..., double arg5); 同様に double function(double * args); おそらく、同じ量のメモリを割り当てる必要があります。最初の解決策はメモリをヒープに割り当てます.2番目の解決策は自分で処理する必要があるため、あまり便利ではありませんが、一方で引数を反復処理できるため、場合によっては良くなる。

于 2015-03-09T10:38:25.147 に答える