適切な最適化アルゴリズムを選択する方法は?


16

関数の最小値を見つける必要があります。http://docs.scipy.org/doc/scipy/reference/optimize.htmlのドキュメントを読む同じことを行う、つまり最小値を見つけるアルゴリズムがいくつかあることがわかります。どちらを選択する必要があるかを知るにはどうすればよいですか?

リストされているアルゴリズムの一部

  • ダウンヒルシンプレックスアルゴリズムを使用して関数を最小化します。
  • BFGSアルゴリズムを使用して関数を最小化します。
  • 非線形共役勾配アルゴリズムを使用して関数を最小化します。
  • Newton-CG法を使用して関数fを最小化します。
  • 修正されたPowellの方法を使用して関数を最小化します。

私の機能は線形です。次元は約232750です(これは毎回計算する必要があるさまざまな勾配の数です)。勾配とコストを計算するのに約2分かかりますので、安くはありません。制約があるとは思わない。それは決定論的で連続的です。


問題の性質を調査する必要があります:それは線形かそうでないか?それの次元は何ですか?評価するコスト関数は安価ですか?デリバティブを分析的および/または安価に評価できますか?制約はありますか?制約がある場合、制約のないものとして問題を簡単に書くことができますか?これらの問題について詳しく説明してください。
usεr11852は回復モニック氏は述べています

@ user11852線形です。次元は約50の特徴であり、勾配とコストを一度計算するのに約2分かかるため、安くはありません。制約があるとは思わない。
siamii

ここで「線形」とはどういう意味かわかりません。問題が線形の場合、勾配は一定で計算が安価です。目的関数が線形で制約がない場合、最小値は-infinity(または0)です。
ポール

@paul:最適化において、線形性は通常、関数自体ではなく制約を指します。私は(誤って認められた)関数の滑らかさとの関連で「線形性」に言及し、それがOPにも言及されていると思います。私の答えでは、とにかく彼が「連続的」と言ったという事実にほとんど基づいていました。
usεr11852が復活モニック言う

回答:


14

あなたが言ったことに基づいて:私はあなたが50の変数に対して最適化する必要があると仮定します。また、分析的な導関数を見つけるのに非常にコストがかかる(数値を出すのは言うまでもなく)最適化が制約されていない状況にあると仮定します。

大雑把に言って、あなたは25-30から100の変数を少し不運にも引き起こします。それは大規模または小規模の最適化ルーチンを選択することになると、ちょっとしたミステリーゾーンです。とはいえ、何も失われていません。

一次導関数でさえもそのようなものを手に入れるのに費用がかかることを考えると、ニュートンの方法のアイデアは殺されます。あなたのヘッセ行列が最初から少し斜めになっている場合でも、準ニュートン(BFGS)でいくらか運があるかもしれません。CGは通常BFGSよりも少し遅いので、おそらくそれほど改善されないでしょう。メモリも問題になる場合に使用します(または、その場合はL-BFGSを使用します)。さらに、関数の評価がどれほど遅いかを考えると、単純な最急降下/ライン検索アルゴリズムは曲がりくねって遅くなります。同じことは、シミュレーテッドアニーリングやその他のランダム検索バリアントにも当てはまります(HMCとそのすべてのジャズにアクセスできないと思います)。

したがって、単一の関数評価に関して、最高の価値が必要な場合は、次のようにします。Powellの方法を使用して、COBYLAもテストします。関数の勾配を内部的に線形近似することで物事を高速化するため、制約付き最適化アルゴリズムですが、関数の線形性を利用できます。また、間違いなくNLopt for Pythonを試してください。勾配のないオプティマイザーがたくさんあります。UOBYQAを試してください。それは、パウエルの発案でもあります(2次近似による制約のない最適化)。

非常に簡単に:N-CGアルゴリズムはヘッセ行列の計算に依存しており、ヘッセ行列の計算には非常に費用がかかるようです。NLCGとBFGSはそれを必要としませんが、最初のステップで一度計算しようとするかもしれません。

シンプレックスアルゴリズムはまったく別物であるため、意図的に省略しました。グラデーション自体とは関係ありません。それを試してみてください、しかし、私はそれについて本当にコメントすることができません。それは本当にあなたの問題の性質に依存しています。

数値最適化に関する最初の参考資料として、CTKellyの著書である「最適化のための反復法」を使用すると、かなりうまく、かなりうまくいくでしょう。


将来の参照用:同様の質問については、Stackexchangeの計算科学ベータ版を確認してください。
usεr11852は回復モニック氏は述べています

答えてくれてありがとう。実際、私の次元は232,750です。これは、毎回計算する勾配の数です。GPUで関数の評価と勾配計算を行います。それはNLoptと互換性がありますか?
siamii

GPUでNLoptを使用したことはありませんが、互換性に関して問題になるはずの明白な理由はわかりません。GPUからの頻繁なI / O操作の問題について、私は疑問に思うかもしれません。
usεr11852は回復モニック氏は述べています

@usεr11852、線形回帰コスト関数の最小化のための勾配降下法とQR分解法の比較についても議論できますか?別の質問をする必要がありますか?
ニシャアローラ博士

@DrNishaArora:はい。これは別の質問に適しています。スレッドを参照してください。閉じた形式の数学ソリューションが利用可能な場合、なぜ線形回帰に勾配降下を使用するのですか?重複を避けるために!
usεr11852は回復モニック言う

1

たぶん、数値最適化に関する入門書を手に入れるべきでしょう。アルゴリズムを決定するには、関数を考慮する必要があります。

あなたが言及するアルゴリズムの中で、重要な違いは、ヤコビアンまたはヘッセ行列が必要であるか、それとも関数のみが必要であるかです。

これは統計に関する Q&Aサイトであり、したがってランダム変数を扱うことを考慮してください。関数が決定論的であることを確認し、検索空間で連続的な結果が得られる方法で評価できるようにしてください。


それは決定論的で連続的です。
siamii
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.