最適化のためにBFGSと共役勾配を選択する際に考慮すべきことは何ですか?これらの変数に適合させようとしている関数は指数関数です。ただし、実際の目的関数には、とりわけ統合が含まれており、それが役立つ場合は非常にコストがかかります。
最適化のためにBFGSと共役勾配を選択する際に考慮すべきことは何ですか?これらの変数に適合させようとしている関数は指数関数です。ただし、実際の目的関数には、とりわけ統合が含まれており、それが役立つ場合は非常にコストがかかります。
回答:
JMはストレージについて正しいです。BFGSには近似ヘッセ行列が必要ですが、アイデンティティ行列で初期化してから、勾配情報がある場合に限り、近似ヘッセ行列のランク2更新を計算することができます。BFGSは準ニュートン法であり、CGよりも少ないステップで収束し、「スタック」する傾向が少し少なく、各反復で大幅な降下を実現するためにわずかなアルゴリズム調整が必要です。
対照的に、CGには行列ベクトル積が必要です。これは、方向導関数を計算できる場合に役立ちます(もう一度、分析的に、または有限差分を使用して)。方向微分の有限差分計算は、ヘッセ行列の有限差分計算よりもはるかに安価であるため、有限差分を使用してアルゴリズムを構築することを選択した場合は、直接方向微分を計算してください。ただし、この観察は実際にはBFGSには当てはまりません。BFGSは勾配情報の内積を使用して近似ヘッシアンを計算します。
ストレージが問題にならないことがわかっている場合は、アプリケーションの小さなテスト問題で2つのアルゴリズムを比較します。問題の特定の詳細を知らなくても、BFGSはより高速になると思いますが、2つのアルゴリズムを実際にテストして、どちらがより適切に機能するかをよりよく理解する必要があります。
最後に、自動差別化についての言葉:Fortran(DAEPACK)の社内自動差別化(AD)機能の経験がありますが、ADツールはしばしば細心の注意を払うことができます。彼らは必ずしも自分で生成したコードを区別できるとは限りません。ADツールには2つのタイプがあります。
ソースからソースへのツールは本質的に修正されたコンパイラであり、作成したソースコードを取得して解析し、ソースコード内の関数の勾配を計算する新しいソースコードを自動的に生成します。演算子のオーバーロードADツールでは、ソースコードでオーバーロードされたAD演算子を使用して、導関数を計算できるようにする必要があります。
私の経験では、更新が多いBFGSは現在のソリューションから離れた場所に情報を保存するため、非遅延ヤコビアンを近似するのに非常に役立ちます。保存しすぎると、実際に収束を失います。これらの理由だけで、非線形共役勾配によく似たBFGSの「メモリレス」バリアントがあります(これらのいずれかについて説明した最終更新を参照)。したがって、BFGSではなくL-BFGSを実行する場合は、メモリの問題がなくなり、メソッドが関連付けられます。逸話的な証拠は、再起動が時には不必要で、時には非常に必要であるため、難しい問題であることを示しています。
2つのうちどちらを選択するかは、関心のある問題にも大きく依存します。リソースがある場合は、両方の問題を試して、どちらが適切かを判断できます。たとえば、私は個人的にこれらのアルゴリズムで最適化を行いませんが、代わりに非線形方程式のシステムの解法に関心があります。これらについては、NCGの方がうまく機能し、非線形前提条件の実行が簡単であることがわかりました。BFGSはより堅牢です。
低次元では、特に関数が2次関数からそれほど遠くない場合、適切に実装されたBFGSメソッドは一般にCGよりも高速で堅牢です。
BFGSもCGも、凸性に関する仮定を必要としません。最初のヘッセ近似(BFGS用)のみ。前提条件(CG用)は正定でなければなりません。しかし、これらは、多くの害を与えることなく低次元で恒等行列として常に選択できます。/scicomp//a/3213/1117も参照してください
プログラムされた勾配がない場合、特に関数値が高価な場合、数値勾配を使用することは大きな労力の無駄です。むしろ、導関数のないアルゴリズムを使用する必要があります。http://archimedes.cheme.cmu.edu/?q=dfocompを参照してください最近の調査については、を。