Blog

これはOptuna v3.0のリリースにあたって執筆されたリリースブログの後編です。まだ前編をお読みになっていない方は、ぜひそちらからお読みください。

前編では、v3.0で我々がどのようにOptunaの安定性を向上させ、また最適化アルゴリズムのベンチマーク実験を行ったのかを説明しました。この後編では、Optuna v3.0に追加された様々な新機能と、ロードマップにはありましたが紆余曲折を経て実際には取り組まなかった開発アイテムについてお話しします。

New Features

Optuna v3.0の開発を始めた当初は、我々は何か特定の新機能を導入しようとは思っていませんでした。それは冒頭に述べたv3.0の目標からもわかると思います。しかし、多くのコントリビュータが力を合わせて開発を進めていく中で、今のOptunaコミュニティにとって重要だと判断され、実装された新機能がいくつもあります。ここではそれらの新機能の概要をご紹介しましょう。

New NSGA-II Crossover Options

NSGA-IIは多目的最適化において高い性能を発揮するsamplerであり、Optunaの多目的最適化のデフォルトアルゴリズムです。NSGA-IIはデフォルトではカテゴリカルな変数に対して高い性能を発揮する一方で、実数値変数に対しては性能が十分でない場面が多々ありました。導入されたcrossoverオプションを用いれば、実数値変数に対しても高い性能を発揮することができます。アルゴリズムや性能評価実験に興味のある方は#2903#3221 をご覧ください。

この機能は@yoshinobc によって導入され、 @xadrianzetx の手によってブラッシュアップされました。ありがとうございました!

(新たに実装されたcrossoverオプションを利用したNSGA-IIと、既存のNSGA-II(右上)、既存の多目的最適化手法BoTorch(右下)、NSGA-IIの別実装(真ん中上)を比較した図。NAS bench 101と呼ばれる問題に対して140トライアルの最適化を行なって得られたPareto-frontプロットを表しています。)

A New Algorithm: Quasi-Monte Carlo Sampler

高次元の問題ではrandom searchは十分に探索空間をカバーすることが難しいということが知られています。Quasi-Monte Carlo searchは、高次元において比較的少数のサンプルで探索空間をカバーすることのできる手法です。Optunaに新たに実装された`QMCSampler`は、特に高次元の問題において`RandomSampler`の代わりとなりうるsamplerです。詳細は #2423 をご覧ください。また、`QMCSampler`のパフォーマンスに興味のある方は、 #2964 をご覧ください。

この機能は@kstoneriv3によって導入されました。ありがとうございました!

Constraints Support for Pareto-front plot

Pareto-front plotは多目的最適化の結果を評価するために重要な分析方法の一つです。Optunaの多目的最適化には制約付き最適化を行う機能がありましたが、これまでのPareto-front plotでは各トライアルが制約を満たしていたかどうか区別することができませんでした。この機能の導入によって、制約を満たしているトライアルと満たしていないトライアルが一目でわかるようになりました。詳細は以下の一連のPR#3128, #3497, and #3389をご覧ください。

この機能はPlotly版が @semiexp, Matplotlib版が @fukatani によって導入され、@semiexp によって実装が統一されました。ありがとうございました!

A New Importance Evaluator: Shapley Importance Evaluator

Optunaの変数重要度評価機能はv2で導入されました。これは最適化結果を元にして重要な変数を判断するために用いることのできる分析方法の一つです。v3.0では、SHAP と呼ばれるこれまでとは異なる新しい重要度のevaluatorとして、`optuna.integration.ShapleyImportanceEvaluator` を導入しました。詳細は #3507 をご覧ください。

この機能は @liaison によって導入されました。ありがとうございました!

Constrained Optimization Support for TPE

Tree-structured Parzen Estimator (TPE)は、Optunaのデフォルトのサンプリングアルゴリズムです。Optunaに実装されている`optuna.samplers.TPESampler`はこれまで制約付き最適化に対応していませんでしたが、v3.0で遂に対応しました。以下は、制約を考慮した最適化を実行し下図の右側を出力するためのコードです。この機能についての詳細は #3506 をご覧ください。


def objective(trial):
    # Binh and Korn function with constraints.
    x = trial.suggest_float("x", -15, 30)
    y = trial.suggest_float("y", -15, 30)

    # Store the constraints as user attributes so that they can be restored after optimization.
    c0 = (x - 5) ** 2 + y ** 2 - 25
    c1 = -((x - 8) ** 2) - (y + 3) ** 2 + 7.7
    trial.set_user_attr("constraints", (c0, c1))

    v0 = 4 * x ** 2 + 4 * y ** 2
    v1 = (x - 5) ** 2 + (y - 5) ** 2

    return v0, v1

def constraints(trial):
    return trial.user_attrs["constraints"]

if __name__ == "__main__":
    sampler = optuna.samplers.TPESampler(
        constraints_func=constraints,
    )
    study = optuna.create_study(
        directions=["minimize", "minimize"],
        sampler=sampler,
    )
    study.optimize(objective, n_trials=1000)
 
    optuna.visualization.plot_pareto_front(study, constraints_func=constraints).show()

この機能は @knshnb によって導入されました。ありがとうございました。

Without Constraints With Constraints

New History Visualization with Multiple Studies

Optimization history plotは最適化の様子を分析する際に最も基本的なプロットの一つです。これまで一つのstudyの最適化履歴をプロットすることしかできませんでしたが、あらたに複数のstudyの比較を行ったり、同じ設定で最適化を行った複数のstudyを用いて平均と分散を表示したりすることが可能になりました。詳細は以下の複数のPR(#2807, #3062, #3122, and #3736)をご覧ください。

この機能はPlotly版が @HideakiImamura, Matplotlib版が@TakuyaInoue-githubの手によって導入され、@knshnb によって実装が統一されました。ありがとうございました!

Deliberate Exclusions

v3では様々な課題に取り組みましたが、その全てが成功したわけではありません。例えば、Storageモジュールに関連したいくつかのアイテムはv3で完了することが難しいという結論に至り、開発を延期することになりました。以下は、v3のロードマップにはありましたが、実際には取り組まなかったアイテムの一覧と、なぜ取り組まなかったかを簡単にまとめたものです。

  • Simplify the after_trial arguments
    • `optuna.samplers.BaseSampler.after_trial`は、トライアルの終了後に呼び出されsamplerごとの後処理を行うためのメソッドです。このメソッドは独自にsamplerを実装するユーザにのみ使われます。したがって、このメソッドをリファクタリングすることによって恩恵を受けるユーザは限定的です。一方で、このメソッドを修正するためには、トライアルが終了後に編集可能にである必要があり、それはトライアルの仕様が大きく変更され、storageの根本的なデザインに矛盾が生じることを意味します。恩恵に対してリスクが非常に大きかったため、v3ではこのアイテムに取り組まないことにしました。
  • Reorganize storages API and make BaseStorage public
    • Storageモジュールは、Optunaにおける最適化の履歴を保持するためのモジュールです。歴史的な経緯から、Storageモジュールには様々な負債が積載しています。例えば、抽象クラスである`optuna.storages.BaseStorage`がユーザに対して公開されているかどうかが曖昧になっています。このような一貫性のなさを解決するために、我々は`BaseStorage`を公開しようとしましたが、そうするにはAPIがあまりに複雑で、また内部的にもリファクタリングの余地が多分にあることから、v3では公開しないことにしました。現在は、`BaseStorage`のリファクタリングが進行中です。
  • Change default sampling algorithm
    • Optunaのデフォルトサンプリングアルゴリズム`optuna.samplers.TPESampler`は、Optuna v1のリリース当初から大きな進化を遂げているにも関わらず、そのデフォルトの挙動は全く変わっていません。我々は、多くのユーザに進化した`TPESampler`の機能を届けるために、ベンチマーク実験を行いデフォルトのアルゴリズムを変更しようとしました。しかし、得られた実験結果からは、進化した`TPESampler`の機能を用いると、多くの場合でパフォーマンスが向上しましたが悪化するケースもあるということが分かりました。デフォルトの変更によって影響を受けるユーザの総数を考慮して、v3ではデフォルトを変更しないという結論に至りました。
  • Rename the name of sample_relative
    • `optuna.samplers.BaseSampler.sampler_relative`は、変数間の相関を考慮して各samplerが仮定する結合分布からサンプルを行うメソッドです。実際には`sample_relative`という名前よりも`sample_joint`のような名前の方が適切ではないかという話が持ち上がり、v3では名称の変更を検討しました。しかし、ユーザに公開されているメソッドの名前の変更にはリスクが伴う一方で、名称の変更によって得られるメリットは少ないと判断され、名称の変更は見送られることとなりました。

What’s Ahead

v3.0は、多くのコントリビュータの協力を得ることで大きな成功を収めました。Optunaのユーザコミュニティと開発コミュニティは大きく飛躍し、ハイパーパラメータ自動最適化フレームワークとして重要な位置を占めるソフトウェアとなりました。しかし、Optunaの開発はここで終わりではありません。我々はこれからも継続的に機能開発やリファクタリングを続けると同時に、コントリビュータが開発に参加しやすい体制を整備し続けていきます。Optunaは絶えず進化し続けているので、常に新しいコントリビュータを募集しています。興味のある方はぜひGitHubで我々コミッターに声をかけたり、または近々開催予定の開発スプリントに参加してみてください!

我々はv3.1の開発も始めています。v3.1では以下のような機能が追加される予定なので、お楽しみに!

  • Journal storageおよびNFS対応ファイルストレージの提供
  • TPEの性能低下疑惑の検証およびリファクタリング
  • CMA-ESの離散変数への対応 

Contributors

v3.0のリリースは多くのコントリビュータの力無しには実現しませんでした。以下は、v3.0の開発に関わった開発者の方々の一覧です。

@29Takuya, @BasLaa, @CorentinNeovision, @Crissman, @HideakiImamura, @Hiroyuki-01, @IEP, @MasahitoKumada, @Rohan138, @TakuyaInoue-github, @abatomunkuev, @akawashiro, @andriyor, @avats-dev, @belldandyxtq, @belltailjp, @c-bata, @captain-pool, @cfkazu, @chezou, @contramundum53, @divyanshugit, @drumehiron, @dubey-anshuman, @fukatani, @g-votte, @gasin, @harupy, @higucheese, @himkt, @hppRC, @hvy, @jmsykes83, @kasparthommen, @kei-mo, @keisuke-umezawa, @keisukefukuda, @knshnb, @kstoneriv3, @liaison, @ll7, @makinzm, @makkimaki, @masaaldosey, @masap, @nlgranger, @not522, @nuka137, @nyanhi, @nzw0301, @semiexp, @shu65, @sidshrivastav, @sile, @solegalli, @takoika, @tohmae, @toshihikoyanase, @tsukudamayo, @tupui, @twsl, @wattlebirdaz, @xadrianzetx, @xuzijian629, @y0z, @yoshinobc, @ytsmiling

開発者の方々、ユーザの皆様、全てのOptunaに関わってくださる人に感謝を。これからもOptunaをよろしくお願いいたします。

  • Twitter
  • Facebook