Blog

ハイパーパラメータ自動最適化フレームワークOptunaの新しいバージョンであるv3.4がリリースされました。今回のリリースには、ユーザーの相対的な評価結果をもとに最適化を行う新機能 “Preferential Optimization” や、ファイル管理機構、Jupyter Lab拡張、VS Code拡張が含まれています。

ハイライト機能

選好に基づく最適化 (Preferential Optimization)

今回のリリースでは、選好に基づく最適化 (Preferential Optimization)が導入されました。この機能は、画像生成や音声合成、自然言語生成タスクのように、生成物の定量的な評価が難しく、人間が主観的な評価をつける必要があるタスクにおいて特に有用です。

Optuna 3.2においてサポートされたHuman-in-the-Loop最適化では、絶対評価のみが可能となっていました。絶対評価は評価者による基準のブレや試行数を重ねたときの評価基準の変化といった問題が発生しやすいことが知られています。本機能では、生成物をOptuna Dashboard上で人間が見比べて、どちらがより優れているかといった相対的な好み(Human Preferences)をフィードバックすることで評価結果がより安定します。

Preferential Optimizationの動作の流れ

Preferential Optimization動作の様子

Optuna Dashboardは人間による評価を入力するだけでなく、評価結果や傾向を分析・管理することもできます。詳細な使い方は 公式ドキュメントのチュートリアル をご確認ください。

ファイル管理機構 (Optuna Artifact)

OptunaにおけるArtifactモジュールはv3.3から導入されました。v3.4ではこの機能をよりパワーアップさせて、わかりやすいチュートリアルとともに公開します。

機械学習のハイパーパラメータチューニングにおけるモデルスナップショットや複雑な化学構造を対象としたブラックボックス最適化における化学本体など、トライアルごとに比較的大きなサイズのデータをトライアルに紐づけて保存し利用したいという需要に応えるのがArtifactモジュールです。Artifactモジュールは簡単に利用でき、またバックエンドを手軽に切り替えることができるため高い柔軟性を持ちます。以下は簡単な利用例です。


import optuna


# This artifact store for file systems.
artifact_store = optuna.artifacts.FileSystemArtifactStore("/path/to/directory")
# You can use other artifact store for AWS S3 or Google cloud storage.
# artifact_store = optuna.artifacts.Boto3ArtifactStore("my-bucket")
# artifact_store = optuna.artifacts.GCSArtifactStore("my-bucket")

def objective(trial: optuna.Trial) -> float:
    ... = trial.suggest_float("x", -10, 10)

    # Creating and writing an artifact.
    file_path = generate_example(...) # This function returns some kind of file.
    artifact_id = upload_artifact(
        trial, file_path, artifact_store
    ) # The return value is the artifact ID.
    trial.set_user_attr(
        "artifact_id", artifact_id
    ) # Save the ID in RDB so that it can be referenced later.
    return ...

study = optuna.create_study(study_name="test_study", storage="sqlite:///sqlite.db")
study.optimize(objective, n_trials=100)

# Loading and displaying artifacts associated with the best trial.
best_artifact_id = study.best_trial.user_attrs.get("artifact_id")
with artifact_store.open_reader(best_artifact_id) as f:
content = f.read().decode("utf-8")
print(content)

Jupyter Lab 拡張

Optuna用のJupyter Lab拡張を新しく公開しました。Jupyter Lab上でOptunaを実行し、評価結果をJupyter Lab上で確認することができます。Optuna Dashboardを別途起動する必要はありません。

Optuna Jupyter Lab拡張

使い方は簡単で、PyPIから jupyterlab-optuna をインストールし、Launcherページから “Optuna Dashboard” をクリック、次に表示されるDialog上でOptunaのStorage URL (e.g. sqlite:///db.sqlite3)を入力するだけです。

$ pip install jupyterlab jupyterlab-optuna

Jupyter Lab拡張使い方

VS Code拡張

VS Code拡張も新しく公開されました。使い方は簡単で、Visual Studio Marketplaceから拡張機能をインストール、ファイルエクスプローラー上でSQLite3のファイル (拡張子: *.db または *.sqlite3 )を右クリック、ドロップダウンメニューから “Open in Optuna Dashboard” をクリックするだけです。

Optuna VS Code拡張

VS Code拡張の実現にあたって、SQLite3 WASMやRust (wasm-bindgen) を使用し、Pythonなしで動作するWeb Assembly版 Optuna Dashboardを開発しました。Web Assembly版 Optuna Dashboardは、GitHub Pagesでも公開しており、下記ページを開いてSQLite3ファイルをドラッグアンドドロップするだけでOptunaの最適化履歴を閲覧できます。ぜひお試しください。
https://optuna.github.io/optuna-dashboard

🚀 その他の改善

Categorical変数に対する距離関数のサポート

Categorical変数の各要素に対する距離を考慮して最適化ができるようになりました。この機能は、実験的でTPESamplerのみがサポートしています。この機能は次のようにTPESamplerの categorical_distance_func 引数に距離関数を指定することで利用できます。


import optuna
from optuna.samplers import TPESampler

def objective(trial):
    word = trial.suggest_categorical("word", ["aaaaa", "aabaa", "bbaba"])
    ...

def hamming_distance(s1, s2):
    return sum(c1 != c2 for c1, c2 in zip(s1, s2))

study = optuna.create_study(
    sampler=TPESampler(categorical_distance_func={"word": hamming_distance}),
)
study.optimize(objective, n_trials=100)

この機能を使うことで、Categorical変数の探索空間が広大な場合においても、各選択肢の距離を考慮して効率的に探索を進めることができます。詳細はプルリクエストをご確認ください。

制約付き最適化の可視化関数機能強化

制約付き最適化の可視化関数でのサポートが強化されました。plot_contour() や、plot_intermediate_values()、plot_rank()、plot_slice()、そしてplot_timeline() に制約付き最適化のための対応が追加されています。

使い方も非常に簡単で、これらの可視化機能はSamplerの constraint_func 引数で指定された制約違反の値を自動で使用します。以前のように可視化関数に constraints_func 引数を指定する必要はありません。制約付き最適化機能をご利用中の方はぜひお試しください。

📈 Optuna Dashboard

Plotly (Python) ライブラリとの連携強化

Optuna Dashboard Plotlyとの連携強化

PlotlyのPythonライブラリとの連携が強化され、グラフをStudy内に保存し、Optuna Dashboardで表示できるようになりました。optuna_dashboard.save_plotly_graph_object()関数に、PlotlyのFigureオブジェクトを渡すことで、Optuna Dashboard上でも表示されます。


from optuna_dashboard import save_plotly_graph_object

study = ...
figure = optuna.visualization.plot_optimization_history(study)
save_plotly_graph_object(study, figure)

3Dモデルビューアー対応

3Dモデルアーティファクトのサポート

Three.js との連携がOptuna Dashboardに追加され、OptunaのArtifactStoreにアップロードされた3Dモデル (*.stl and *.3dm)がOptuna Dashboard上で可視化できるようになりました。この機能はOptuna Dashboardのメインコントリビューターであり、3D CADソフトウェアにOptunaを活用されている @hrntsm さんにより実装されました。@hrntsm さんによる3D CADソフトウェアへの応用についての詳細はOptuna公式ブログの記事 “Black-box optimization of geometry and functionality by integrating Optuna and 3D CAD” をご覧ください。

GitHub Sponsors

Optunaの開発には多くのコミュニティから様々な人々が参加しています。そうした方々の開発をサポートしたり、開発者が集まる場を整えるために、我々はGitHub Sponsorsを利用することにしました!皆さんからの援助をお待ちしています。
https://github.com/sponsors/optuna

What’s Ahead

Optuna 3.4では、Preferential OptimizationやJupyterLab拡張、VS Code拡張など新しい機能が入りました。これらは、まだExperimentalで、足りない機能や使いにくい部分もあるかもしれません。

ユーザーフィードバックを反映して、安定化に向けて取り組んでいきたいと思います。今後のOptuna開発に役立てることができるように、みなさまのユースケースをぜひブログやSNS、GitHubでシェアしていただけると幸いです。

Contributors

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

@Alnusjaponica, @HideakiImamura, @RuTiO2le, @YuigaWada, @adjeiv, @c-bata, @ciffelia, @contramundum53, @cross32768, @eukaryo, @g-tamaki, @g-votte, @gen740, @hamster-86, @hrntsm, @hvy, @keisuke-umezawa, @knshnb, @louis-she, @nabenabe0928, @not522, @nzw0301, @ryota717, @semiexp, @shu65, @smygw72, @sousu4, @torotoki, @toshihikoyanase, @xadrianzetx

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

  • Twitter
  • Facebook