ISID X(クロス)イノベーション本部 の飯田です。
ブラックボックス最適化を使って、なかなか言語化しにくい自分の思考パターン(好みの色)を表現する取り組みをしてみました。
ブラックボックス最適化とOptuna
ブラックボックス最適化とは「ある関数の出力を最大化 (または最小化) するような入力を勾配情報などを使わずに探索する問題」と言われます。参考
ある入力に対して、その出力結果だけしか取得することが出来ず、それ以外の情報が与えられないような状況で、結果を最適化(最小化・最大化)することを目的としています。
Optuna は株式会社Preferred Networksが開発しているハイパーパラメータの最適化を自動化するためのソフトウェアフレームワークです。
optuna.org
TPE (Tree-structured Parzen Estimator) 等の最適化アルゴリズムが実装されています。
ライブラリの使い方も非常に簡単で、使いやすいと思っています。
つくったもの
FastAPIで簡単な画面を作って、Optunaと組み合わせて、自分の好みの色を探してくれるWebアプリを作ってみました。
「色の好み」をブラックボックス関数と見立て、好みの値が最大になるような最適化をしていくイメージです。
内的な感覚(例:色の好み)の関数と見立てるという意味では、心理物理学という学問領域があります。
心理物理学は、外的な刺激と内的な感覚の対応関係を測定し、また定量的な計測をしようとする学問です。
「色の好み」をブラックボックス最適化で探る取り組みは、心理物理学に近しいものがあるかも知れません
Web画面は下記のようなイメージです(今回、デザイン性は一切考慮しておりません笑)
結果
134試行を行った結果のベストパラメータは{'r': 59, 'g': 112, 'b': 160}でした。
実際に描画すると、こちらの色です。
自分の気持ちとしては、まぁまぁ合っている感じがしています。
最適化が進む様子はこんな様子でした。
コード
流れとしては、ざっくり下記のような流れです
- study.ask() で、過去の結果に基づいて、効率的に探索できる色を決定
- FastAPI経由でHTML上で、その色を画面表示
- 提示された色の好みに対して点数を入力し、APIを呼びだす
- regist_trial(r,g,b,v)で、RGBと評価点を登録
メイン部分のコードは下記のような形です。
sampler = optuna.samplers.TPESampler(multivariate=True, n_startup_trials=10) study = optuna.create_study(direction='maximize', sampler=sampler) def regist_trial(r,g,b,v): trial = optuna.trial.create_trial( params={"r": int(r),"g": int(g),"b": int(b)}, distributions=study_search_space, value=int(v) ) study.add_trial(trial) def sugest_next_color(r,g,b,v): regist_trial(r,g,b,v) trial = study.ask() next_r = trial.suggest_int("r", 0, 255) next_g = trial.suggest_int("g",0, 255) next_b = trial.suggest_int("b",0, 255) return (next_r,next_g,next_b)
最後に
Optunaは機械学習のハイパーパラメータ調整がまず浮かんで来ると思いますが、ブラックボックス最適化はいろいろな場面で有効活用できそうです。
- 料理や化学実験のレシピ・材料配合の最適化
- システムのパラメータ調整
- 官能評価
などにも使えるんじゃないかと思います。
最適化が進む様子のアニメーションは見ていて気持ちいいですね。
最後に、私たちは一緒に働いてくれる仲間を募集しています!
デジタル技術を社会課題解決につなげるようなプロジェクトを推進していきたいプロジェクトマネージャーやエンジニアを募集しています。 ぜひご応募ください!
ソリューションアーキテクト スマートシティ導入コンサルタント/スマートシティ戦略コンサルタント執筆:@iida.michitaka
(Shodoで執筆されました)