Optimize タブ
このセクションでは、Optimize タブの各機能を紹介します。
Optimize タブは、最適化の条件を決めて実行するためのタブです。 最適化の結果は、どの手法をどれだけの回数まわしたかにそのまま左右されるため、ここでの設定が結果の質と計算時間の両方を決めることになります。 以下では、画面の番号に沿って ① から順に紹介します。
① クイックアクセス
左側のアイコン を押すと、新しい結果保存ファイルを指定できます。
右側のアイコン を押すと、既存の結果保存ファイルを開くことができます。
.../fish.log
と表示されている部分は、現在の結果保存ファイルのパスを示しています。
最適化のトライアルはすべてこのファイルに蓄積されていくため、別の検討として結果を分けたい場合は、最適化を始める前に新しいファイルを指定してください。
逆に、以前の検討の続きを行いたい場合は、そのときの結果保存ファイルを開くことで、後述の
Continue から同じスタディを再開できます。
... Mode と表示されている部分は、現在の最適化モードを示しています。
目的関数の種類や制約条件の有無に応じて自動的に調整され、適用可能な最適化手法のみが有効になります。
制約条件がある場合は対応している手法が限られるため、モードによっては選べる手法がかなり少なくなります。
② Optimize タブ
利用可能な最適化手法の一覧です。 利用できる最適化手法は最適化モードによって異なります。
サンプラーごとに「次にどこを試すか」の決め方が異なるため、同じ問題を解かせても得られる結果や必要なトライアル数は大きく変わります。
手法の選択ガイドラインについては、目的関数の数と試行回数から候補を絞り込める
サンプラーの選び方 をご参照ください。
たとえば、まずは一度まわしてみたいという段階であれば、問題の特性に応じてサンプラーを自動で選ぶ
AUTO Sampler が出発点になります。
③ トライアル数
トライアルの反復回数を設定します。 GA とその他の最適化手法では、トライアル数の表示形式が異なります。
GA ベースの手法では、Wallacei や Galapagos と同様に、世代数と 1 世代あたりの個体数を指定します。 それ以外の手法では、トライアルの合計数を指定します。
トライアル数は Grasshopper の計算を何回繰り返すかにあたるため、1 回の計算に時間がかかる定義では、この設定がそのまま最適化全体の所要時間に効いてきます。 たとえば 1 トライアルに 3 秒かかる定義で 1000 トライアルを指定すると、それだけで 50 分近くかかる計算になります。 そのため、はじめは少なめのトライアル数で一度通し、1 トライアルあたりの所要時間を把握してから本番の回数を決めると、見積もりを大きく外さずに済みます。
トライアル数
に「負の整数」または「inf」を設定すると、最適化が無制限に継続されます。
最適化時間が Timeout の制限を超えた場合、最適化は停止します。
無制限に設定した場合は指定回数で止まりません。 この Timeout
か、後述の停止ボタンが打ち切りの手段になります。
④ Study
最適化トライアルの集合を表すスタディの設定を構成します。
新しいスタディを作成する際は、Create New で名前を指定しますが、AUTO
を設定すると名前が自動生成されます。 スタディ名は Output タブや Visualize
タブで対象を選ぶときの目印になります。
条件を変えて何度も試す場合は、あとから見分けられる名前を付けておくことで、どの設定の結果なのかを追いやすくなります。
InMemory
にチェックを入れると、最適化中は結果をメモリに保存し、すべての最適化が完了した後に結果ファイルへ書き出します。
これにより、このオプションを使用しない場合と比べて最適化が高速に実行されます。
ただし、最適化中は結果が保存されないため、途中で中断した場合は結果を確認できなくなります。
最適化が正常に完了すると、結果をファイルに保存するかどうかの確認ダイアログが表示されます。
長時間まわす最適化ほど、途中経過を見たくなったり、やむを得ず中断したりする場面が出てきます。
そのため InMemory
は、短時間で終わる検討や、最後まで走らせることが決まっている実行に向いた設定だと考えてください。
Continue を使用すると、既存のスタディを再開できます。
既存の結果に基づいて最適化を継続したい場合は、このオプションにチェックを入れ、Existing Study
コンボボックスから継続したいスタディを選択してください。
これまでのトライアルを引き継いだまま探索を続けられるため、最初に設定したトライアル数では足りなかった場合でも、はじめからやり直さずに済みます。
Copy は対象のスタディのコピーを作成し、新しい名前で継続します。
元のスタディはそのまま残ります。
ここまでの結果を保持したうえで、条件を変えた枝分かれの検討を行いたい場合に使えます。
⑤ その他の設定
最適化を高速化するために、レンダリングを停止したり、冗長なサンプリングを防いだりする設定ができます。 最適化が不安定になる可能性があるため、デフォルトでは無効になっています。
いずれも 1 トライアルあたりの処理を減らす設定です。 そのぶんトライアル数が多いほど、短縮できる時間も大きくなります。 ですが、無効のままでも最適化そのものは問題なく実行できるので、まずはデフォルトのまま一度まわし、計算時間が気になってから有効にすることをおすすめします。
v1.5.0 で追加された Run in Separate Process は、最適化を Tunny
内のプロセスではなく、Rhino とは別のワーカープロセスで実行する設定です。
別プロセス化することで、Grasshopper の Python と Tunny 自身の Python
環境が競合するのを避けられます。 デフォルトで有効になっています。
ワーカーの実行ファイルが用意されていない環境(macOS など)では、自動的に Rhino
と同一プロセスでの実行にフォールバックします。
⑥ 実行・停止ボタン
最適化の開始と終了を操作できます。
停止ボタンを押すと、Tunny は設定ファイルが保存されている .tunny_env
フォルダ内に quit.fishing という名前の空ファイルを作成します。
このファイルの存在が、Tunny
が最適化を停止すると判断するための条件となっています。
そのため、Tunny UI がフリーズした場合は、quit.fishing
ファイルを手動で作成することで最適化プロセスを停止できます。 .tunny_env
フォルダの場所がわからない場合は、Grasshopper 上の Tunny Fishing
コンポーネントを右クリックすることで、Tunny 関連ファイルのフォルダを開けます。
⑦ サンプラー詳細設定
Tunny は Optuna のサンプラーをそのまま使用しています。 各サンプラー設定の値については、以下の表に記載されている Optuna のサンプラーページをご参照ください。
ほとんどの場合、デフォルト設定で要件を満たすか、それ以上の性能が得られます。 設定項目はサンプラーごとに意味が異なり、値を変えると探索の傾向まで変わってきます。 まずはデフォルトのまま実行し、結果を見てから調整する項目を絞っていくのが確実です。
NSGA-II、SPEA-II、HypE
では、一般的な最適化戦略のプリセット設定ボタンが用意されています。
Exploitation Default
プリセットは既知の優良な領域を絞り込むことに重点を置き、Exploration Default
は探索空間の新しい領域の発見を優先します。
つまり、良い解の周辺を詰めるか、まだ見ていない領域を探すかというトレードオフの調整にあたります。
得られた解が似たものばかりに集まっていると感じた場合は、Exploration Default
を試してみるといった使い分けが考えられます。 NSGA-II については、Wallacei
のデフォルト設定に合わせたプリセットも利用できます。
ただし、これは実装の完全な複製ではなく、できるだけ近い設定を目指したものです。
⑧ 目的関数の設定
目的関数の名称と最適化の方向を表示します。
デフォルトでは最小化に設定されています。 最大化したい場合は Max
にチェックを入れてください。
方向の指定は、探索をどちら側に向けるかをそのまま決める設定です。
たとえば変位や重量のように小さいほど良い値であればデフォルトのままで問題ありませんが、床面積や採光量のように大きいほど良い値の場合は
Max にする必要があります。
向きを取り違えたまま実行すると、最適化自体は正常に終わるのに、望みとは逆の解ばかりが集まる結果になります。
計算時間を丸ごと無駄にしてしまうので、実行前に必ず確認してください。
⑨ 変数の設定
各変数の設定を確認できます。
Low、High、Step は NumberSlider の設定を表示します。 TunnyValueList
を使用したカテゴリカル変数の場合、これらの設定は表示されません。
カテゴリカル変数は選択肢のあいだに大小関係がなく、範囲や刻み幅という考え方がそもそも当てはまらないためです。
ここに表示される範囲は、そのまま探索空間の広さになります。 変数を増やしたり範囲を広く取ったりするほど、同じ精度の結果を得るために必要なトライアル数も増えていきます。 動かす必要のない値は変数にせず、範囲も検討したい幅に絞っておくことで、かぎられたトライアル数を意味のある比較に使えます。
デフォルトでは線形スケールでサンプリングが行われます。 LogScale
にチェックを入れると対数スケールでサンプリングされます。
線形スケール
は値の範囲が明確な場合に変数をそのままの値として使用し、対数スケール
は変数を log(x) に変換することで複数のオーダーにまたがる探索を効率的に行います。
たとえば 1 から 1000
まで動かしたい変数を線形スケールのまま扱うと、サンプリングされる点の大半が 3
桁目に集中してしまいます。 このように桁をまたぐ変数では、LogScale
にすることで小さい側にも点が配分されます。
⑩ ライブチャート
最適化結果をリアルタイムで可視化できます。 コンボボックスから選択することで軸の値を変更できます。 単目的最適化を使用している場合、2 つ目のライブチャートはデフォルトで無効(チェックなし)になっています。
目的関数の値が改善しなくなったところで停止ボタンを押すことで、残りのトライアルにかかる時間を節約できます。 トライアル数を多めに設定しておき、チャートの様子を見ながら切り上げる進め方とは相性の良い機能です。