0

そのため、コードを古い OpenMDAO から新しい OpenMDAO に変換しています。すべての出力と部分勾配が正しいことが確認されました。最初は問題はまったく最適化されませんでしたが、古いコードには勾配を提供しないコンポーネントがいくつかあることに気付きました。そのため、これらのコンポーネントに fd_options['force_fd'] = True を追加しましたが、それでも正しい値に最適化されません。全導関数を確認しましたが、それでも正しくありませんでした。また、古い OpenMDAO よりも各反復を実行するのにかなり長い時間がかかります。新しいコードを古い OpenMDAO コードと同じ値に最適化する唯一の方法は、勾配を提供するコンポーネントであっても、各コンポーネントを有限差分に設定することです。

  1. 古いOpenMDAOが自動有限差分を実行したとき、最適化に必要な出力と入力に対してのみ実行したのですか、それともすべての入力と出力のヤコビアン全体を計算しましたか? 「force_fd」を True にすると、新しい OpenMDAO について同じ質問が表示されます。
  2. コンポーネントのヤコビアンの一部を提供して、残りの有限差分を取得できますか? 古い OpenMDAO では、missing_deriv_policy = 'assume_zero' を設定しない限り、提供されていない勾配は有限差分でしたか?
4

1 に答える 1

2
  1. そのため、古い OpenMDAO は導関数のないコンポーネントのグループを探し、それらを一緒に有限差分可能なグループにまとめていました。新しい OpenMDAO はそれを行わないため、これらの各コンポーネントは個別に有限差分されます。

  2. これはまだサポートされておらず、古い OpenMDAO ではサポートされていませんでした。ただし、重要なトラッカーにはストーリーがあるので、最終的にはこの機能を搭載する予定です。

私があなたに起こっているのではないかと思うのは、有限差分グループ化がたまたま従来の OpenMDAO の方が優れていたということです。1 つの入力と 10 の出力を持つ 1 つのコンポーネントが、10 の入力と 1 つの出力を持つ 2 番目のコンポーネントに接続されているとします。それらを一緒に有限差分する場合、1回の実行のみが必要です。それらを個別に有限差分する場合、コンポーネント 1 を 1 回実行し、コンポーネント 2 を 10 回実行する必要があります。これにより、パフォーマンスが大幅に低下する可能性があります。

個々の FD とグループ FD は、他の変数とは大幅に異なるスケーリングを持つ重要な入力がある場合、精度の問題を引き起こす可能性があるため、デフォルトの FD ステップサイズ 1.0e-6 は適切ではありません。(注:step_sizeパラメータまたは出力を追加するときに a を設定すると、その変数のデフォルトがオーバーライドされます。)

幸いなことに、新しい OpenMDAO には、古い OpenMDAO にあったものを再作成する方法がありますが、自動ではありません。あなたがしなければならないことは、モデルを見て、一緒に FD できるコンポーネントを見つけ出し、サブグループを作成してそれらのコンポーネントをそのグループに移動することです。グループでTrueに設定fd_options['force_fd']すると、グループが一緒に有限の差になります。したがって、たとえば、A -> B -> C があり、その間にコンポーネントがなく、派生物がない場合、A、B、および C を force_fd を True に設定して新しいサブ グループに移動できます。

それでも問題が解決しない場合は、モデルをさらに詳しく調べる必要があるかもしれません。

于 2016-02-22T19:43:16.127 に答える