見出し画像

【ベイズ最適化】PHYSBOの使い方入門|コピペで動くPythonコード全文つき

こんにちは、かなめです。

プログラミングを覚えたてのころの話です。チュートリアルの通りに書いたはずのコードが、動かない。画面には英語のエラーが3行。時計を見ると23時で、研究室にはもう誰もいません。

あの夜いちばんこたえたのは、エラーそのものより「これで合っているのか誰にも聞けない」という心細さでした。

今日はコードの回です。なので先に約束します。この記事のコードは、コピペすればそのまま動きます(動かないときの処方箋も後半に書きます)。
そして私が実際にはまった穴を3つ、埋めずに残しておきます。あなたの23時が、少しでも早く終わりますように。

こんな人におすすめ

  • 理屈はもういいから、手を動かして覚えたい方

  • PHYSBOの日本語の実践例を探していた方

  • 過去にエラーで挫折して、Pythonと気まずい関係になっている方

前回のおさらい

第3回までで、ベイズ最適化の輪が完成しました。予測して、次の一手を提案して、実験して、学ぶ。今日はこの輪を、頭の中ではなくPythonで回します。


道具はPHYSBO。実験屋の言葉が通じるライブラリ

使うのはPHYSBO(フィズボ)というPythonライブラリです。東京大学物性研究所のプロジェクトで開発された国産ツールで、物理や材料の研究者を最初からターゲットに育てられてきました。無料で、日本語のマニュアルがあります。

私がPHYSBOを最初の一歩に薦める理由は、たったひとつです。

PHYSBOは「メニュー表から選ぶ」方式だから。

先に「試せる条件の一覧表(メニュー表)」を渡しておくと、PHYSBOはその中から「次はこれを試して」と選んでくれます。当たり前に聞こえるかもしれませんが、世の中の最適化ツールには「最適解は183.7264℃です」と返してくるタイプも多いんです。うちのホットプレートにそんな目盛りはありません。

実験の条件って、実際にはメニューなんですよね。ヒーターの設定は0.5℃刻み、使える溶媒は棚にある数種類、装置の回転数は決まった段階だけ。最初からメニューの中で戦ってくれるPHYSBOは、実験屋と話が合います。

コード全文(4ブロックだけ)

お題はもちろんホットケーキ。140℃から220℃まで0.5℃刻みで、メニューは161行です。この中から「世界一おいしい温度」を10枚で探します。

コードの登場人物は4つだけです。
①メニュー表
②焼いて採点する係
③店長(PHYSBO)
④結果発表

import numpy as np
import physbo

# --- ① メニュー表を作る(140〜220℃、0.5℃刻みで161通り) ---
candidates = np.arange(140, 220.5, 0.5).reshape(-1, 1)

# --- ② 「1枚焼いて採点する係」を作る ---
rng = np.random.default_rng(42)          # 乱数を固定(この記事と同じ結果になるように)

def bake_and_score(actions):
    temp = candidates[actions[0], 0]     # PHYSBOは「メニューの何番?」と番号で聞いてくる
    score = (86 * np.exp(-((temp - 187) ** 2) / (2 * 13 ** 2))
             + 52 * np.exp(-((temp - 155) ** 2) / (2 * 9 ** 2))
             - 30 * np.exp((temp - 214) / 6) + 8)
    score += rng.normal(0, 2.2)          # 味見のゆらぎ
    print(f"  {temp:5.1f}℃ で1枚 → {score:5.1f}点")
    return score

# --- ③ 店長に任せる(まずランダム3枚 → AIの提案で7枚) ---
policy = physbo.search.discrete.Policy(test_X=candidates)
policy.set_seed(0)
policy.random_search(max_num_probes=3, simulator=bake_and_score)
policy.bayes_search(max_num_probes=7, simulator=bake_and_score,
                    score="EI", interval=1, num_rand_basis=500)

# --- ④ 結果発表 ---
best_scores, best_actions = policy.history.export_all_sequence_best_fx()
print(f"\nベスト: {candidates[int(best_actions[-1]), 0]:.1f}℃({best_scores[-1]:.1f}点)")

ブロックごとに、一言ずつ。

①メニュー表。実務ではここが「試せる組成の一覧」や「装置で設定できる条件表」に変わります。ExcelからCSVで読み込んでも大丈夫です。

②採点係。今回は「正解の式+味見のゆらぎ」で実験ごっこをしていますが、本番ではこの関数の中身が本物の実験と測定になります。1行目の「actions」だけ補足すると、PHYSBOはメニューの中身ではなく番号で会話します。「47番を試して」と番号が届くので、メニュー表から47番の温度を引いて、焼いて、点数を返す。それだけの係です。

③店長。最初の3枚がランダムなのは、データがゼロだと予測のしようがないから。畑でいう種まきです。
その後の7枚がAIの提案で、カッコの中の3つはこう読みます。score="EI"は第3回に出てきた獲得関数の名前。interval=1は「1枚焼くたびに学び直してね」。num_rand_basis=500は「計算を速くするための近似の細かさ」で、当面はこの値のままで困りません。

④結果発表。履歴から「その時点でのベスト」を取り出しています。

実行結果。3枚目、丸焦げ

私の環境の実行ログを、そのまま載せます。

--- まず3枚、ランダムに焼く ---
  195.5℃ で1枚 →  76.7点
  167.0℃ で1枚 →  53.4点
  212.5℃ で1枚 →  -1.2点
--- ここからAIの提案で焼く ---
  145.0℃ で1枚 →  38.6点
  164.5℃ で1枚 →  52.7点
  186.0℃ で1枚 →  90.7点
  188.0℃ で1枚 →  93.7点
  188.5℃ で1枚 →  92.4点
  189.0℃ で1枚 →  92.5点
  189.5℃ で1枚 →  90.1点

ベスト: 188.0℃(93.7点)

まず笑ってほしいのが3枚目です。212.5℃、マイナス1.2点。丸焦げです。

でもこの丸焦げ、無駄になっていません。「高温側は絶望的」と学んだAIは、以降いっさい高温側に近寄らなくなりました。失敗した実験も、ちゃんとデータなんです。

そのあとの7枚は、3幕構成になっています。

  • 4〜5枚目(偵察):まだ何も知らない低温側を2枚だけ試す。第3回の言葉でいう「探索」です

  • 6枚目(発見):186.0℃で90.7点の大当たり

  • 7〜10枚目(追い込み):当たりの周辺を0.5℃刻みで細かく試す「活用」に切り替え、7枚目の188.0℃・93.7点がベストに


種明かしをすると、私が仕込んだ正解は187℃でした。161通りのメニューから、10枚でほぼ的中です。第1回で「5℃刻みの総当たりなら17枚」と書きましたが、今回は0.5℃刻みという10倍細かいメニューで探して、10枚。ページを3回さかのぼるより、この2つの数字を並べるほうが、ベイズ最適化の価値は伝わる気がします。

かなめの実験ノート・拡大版(今日は3連発)


穴その1:インストールしたのに動かない。
PHYSBOはNumPyのバージョンと相性が出ることがあります。
これは公式の講習会資料にも載っている定番のつまずきで、処方箋は「NumPyを更新してから、PHYSBOを入れ直す」。環境構築という沼を、丸ごと迂回できます。

穴その2:大きくしたいのか、小さくしたいのか。
PHYSBOは点数を「大きくする」道具です。
でも実務では「不良率を下げたい」「コストを下げたい」も多いですよね。私は昔この向きを間違えたまま回して、最悪の条件を全力で探索させたことがあります。小さくしたい量には、マイナスを付けて渡す。それだけで解決します。

穴その3:結果が毎回変わって「壊れた」と騒ぐ。
ベイズ最適化は途中で乱数を使うので、何もしないと実行のたびに提案が変わります。壊れていません。コードにset_seedなどの「乱数固定」が2箇所入っているのはこのためで、記事の再現や検証のときは固定、本番の探索では外す、と使い分けます。

先週公開した「さわれるベイズ最適化」で遊んでからこのコードを読むと、あの画面の裏で何が起きていたかが繋がるはずです。

今日の一冊と、学びの入口

『Pythonで学ぶ実験計画法入門 ベイズ最適化によるデータ解析』(金子弘昌 著、講談社)

第1回で紹介した本の再登場です。ホットケーキを卒業して自分の実データでやるなら、この本のサンプルコードが最短ルートです。データの前処理からベイズ最適化までが、一冊で地続きになっています。

Udemy『【キカガク流】人工知能・機械学習 脱ブラックボックス講座 -初級編-』

「コードは動いたけど、中で何が起きているのか不安」という方はこちらへ。動いたあとに学ぶほうが、吸収は段違いにいいです。


おわりに

10枚のログを眺めていて、しみじみ思いました。丸焦げの3枚目も、遠回りに見えた偵察の4枚目も、ぜんぶ188.0℃への道だったんですよね。ベイズ最適化は、失敗をなかったことにしない道具です。人間はつい、失敗した実験をノートの隅に小さく書いてしまいますけど。

よかったらコメントで教えてください。Colabで回してみた結果、エラーで詰まった箇所(必ず誰かの役に立ちます)、それから、あなたの「23時のエラー」の思い出でも。

さて、ホットケーキはおいしく焼けるようになりました。ところが次回、上司(仮)がこう言います。「おいしくて、焦げにくくもして」。……点数が2種類になった瞬間、「最適」という言葉の意味そのものが変わります。次回は多目的最適化。材料開発でいちばん現実に近い回です。

最後まで読んでくださって、ありがとうございました。

かなめ


このシリーズはマガジン【とことんやさしいベイズ最適化】にまとめています。


いいなと思ったら応援しよう!