ここでは、ストーリーを前に、いくつかの注意点を説明します。ずっと前、私はちょうど始めたばかりの時に仲間と一緒に働きました。彼はやや厄介な目的で、解決すべき最適化問題を抱えていました。彼の解決策は、最適化のための分析的導関数を生成することでした。
私が見た問題は、これらの派生物が厄介であるということでした。Macsymaを使用して生成され、fortranコードに変換されたものは、それぞれ数十の継続ステートメントでした。実際、継続ステートメントの最大数を超えたため、Fortranコンパイラーはそのことに腹を立てました。その問題を回避できるフラグを見つけましたが、他にも問題がありました。
CAシステムで一般的に生成される長い式では、大幅な減算キャンセルのリスクがあります。多数の大きな数値を計算します。それらすべてが互いに打ち消し合って小さな数値が得られることを見つけるだけです。
多くの場合、分析的に生成された導関数は、有限差分を使用して数値的に生成された導関数よりも実際に評価にコストがかかります。n個の変数の勾配には、目的関数を評価するコストのn倍以上かかる場合があります。(多くの用語はさまざまな派生語で再利用できるため、時間を節約できる可能性がありますが、コンピューター生成の式を使用する代わりに、慎重に手動でコーディングする必要があります。また、厄介な数学をコーディングするときはいつでも式では、エラーの確率は簡単ではありません。これらの導関数が正確であることを確認してください。)
私の話の要点は、これらのCA生成式には独自の問題があるということです。面白いことに、私の同僚は問題の複雑さを実際に誇りに思っていました。代数が非常に厄介だったので、彼は本当に難しい問題を明らかに解決していたのです。彼が考えていなかったのは、その代数が実際に正しいことを計算しているかどうか、正確に計算しているかどうか、そして効率的に実行しているかどうかでした。
このプロジェクトの当時私が上級者だったとしたら、暴動行為を彼に読んだことでしょう。彼のプライドにより、有限差分ベースの勾配が適切であるかどうかさえチェックせずに、おそらく不必要に複雑なソリューションを使用するようになりました。この最適化を実行するために、おそらく1週間の時間を費やしたに違いない。少なくとも、生成された勾配を注意深くテストするように彼に助言したでしょう。正確でしたか?差分微分と比較して、どれほど正確でしたか?実際、今日のツールには、微分予測の誤差の推定値を返すツールもあります。これは、MATLABで記述した(微分)適応微分コードにも当てはまります。
コードをテストします。派生物を検証します。
ただし、これを行う前に、他のより優れた最適化スキームがオプションであるかどうかを検討してください。たとえば、指数フィッティングを行っている場合、分割された非線形最小二乗法(分離可能な最小二乗法と呼ばれることもあります。これはSeber and Wildが本で使用した用語だと思います。)パラメータのセットを本質的に線形のセットと本質的に非線形のセットに分割することです。非線形パラメーターでのみ機能する最適化を使用します。これらのパラメータが「既知」である場合、本質的に線形のパラメータは、単純な線形最小二乗法を使用して推定できます。このスキームは、最適化のパラメータースペースを削減します。線形パラメーターの開始値を見つける必要がないため、問題がより堅牢になります。これにより、検索スペースの次元が減少するため、問題がより迅速に実行されます。もう一度私は供給しましたこの目的のためのツールですが、MATLABのみです。
分析的導関数を使用する場合は、それらをコード化して用語を再利用します。これは重大な時間の節約になる可能性があり、実際にバグを減らして、自分の時間を節約する可能性があります。しかし、それらの数をチェックしてください!
codegen
その中にあるパッケージを確認することをお勧めします。これにより、式のそれぞれまたはすべてに対してコンパクトで効率的なCまたはFortranコードが自動的に生成されます。