はじめに
量子コンピュータのハイブリッドを使いこなすには最適化を極める必要があります。ベイズ最適化を見てみたいと思います。
最適化?
最適化には大きく分けて二種類あるようです。
数理(連続)最適化 - 最適化問題のうち解が連続的なもの。
組合せ(離散)最適化 - 最適化問題のうち、解が離散的なもの。
組み合わせ最適化?
ほとんどの社会問題や業務最適化はこの組合せ最適化になるようです。
離散最適化と呼ばれており、代表的なものとして、
・遺伝的アルゴリズムGA
・タブーサーチ
・シミュレーテッドアニーリングSA
があります。
数理最適化?
連続的な値を最適化するようですが、基本的にはmax/minの点を探します。
主に機械学習などのブラックボックス最適化に対して最適化を適用するようです。
機械学習や深層学習などで現在パラメータの最適化自動化で注目されています。
実例?
facebookがpytorch向けに出したり、
「AIモデルの最適化を単純にするAxとBoTorchをFacebookがオープンソース化」
また、google deepmindがalphagoでベイズ最適化に言及しています。
"Bayesian Optimization in AlphaGo"
ベイズ最適化?
ベイズ最適化は探索するデータに優先順位をつけて、効率的なデータの最適化を目指しているようです。
手法としては、
1、関数f(x)を用意する。
2、ランダムに点xを選び、f(x)の値を求める。
3、xとf(x)の値から次にデータとして価値のたかそうな点を算出する。
4、その点xにおけるf(x)の値を求める。
5、そのステップを繰り返し、一定ステップ済んだら終了する。
参考
この資料がバッチリでした。。。
機械学習のためのベイズ最適化入門
概要
引用:http://philipperemy.github.io/visualization/
ガウス過程を使って、ランダムで打った点からグラフが存在してそうなところを推測しながら計算をします。上記は求めたいグラフは青の実線の最大値ですが実際には不明。点線が予測。緑の範囲が存在のしうる部分です。データ範囲に優先順位をつけながら作れるようです。
ガウス過程
ガウス過程は機械学習における教師あり学習の回帰分析に応用される。平均値関数と共分散関数を既知とし与えられたデータがそのガウス過程に従っていると仮定すると未知の観測値の平均と分散がわかる。
参考
こちらを参考にしました。
「Python: ベイズ最適化で機械学習モデルのハイパーパラメータを選ぶ」
パッケージ
インストールします
!pip install bayesian-optimization matplotlib tqdm
Collecting bayesian-optimization
Downloading bayesian-optimization-1.2.0.tar.gz (14 kB)
Requirement already satisfied: matplotlib in /opt/conda/lib/python3.8/site-packages (3.2.2)
Requirement already satisfied: tqdm in /opt/conda/lib/python3.8/site-packages (4.48.0)
Requirement already satisfied: numpy>=1.9.0 in /opt/conda/lib/python3.8/site-packages (from bayesian-optimization) (1.19.1)
Requirement already satisfied: scipy>=0.14.0 in /opt/conda/lib/python3.8/site-packages (from bayesian-optimization) (1.4.1)
Requirement already satisfied: scikit-learn>=0.18.0 in /opt/conda/lib/python3.8/site-packages (from bayesian-optimization) (0.23.1)
Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib) (2.8.1)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.8/site-packages (from matplotlib) (0.10.0)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib) (2.4.7)
Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.8/site-packages (from matplotlib) (1.2.0)
Requirement already satisfied: joblib>=0.11 in /opt/conda/lib/python3.8/site-packages (from scikit-learn>=0.18.0->bayesian-optimization) (0.16.0)
Requirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.8/site-packages (from scikit-learn>=0.18.0->bayesian-optimization) (2.1.0)
Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.8/site-packages (from python-dateutil>=2.1->matplotlib) (1.15.0)
Building wheels for collected packages: bayesian-optimization
Building wheel for bayesian-optimization (setup.py) ... [?25ldone
[?25h Created wheel for bayesian-optimization: filename=bayesian_optimization-1.2.0-py3-none-any.whl size=11684 sha256=fc4197cd7c8c624167dba85bb764d244a31990c3b6ce510e0f354183ac1eda1f
Stored in directory: /home/jovyan/.cache/pip/wheels/37/fa/19/f93e793d3944567a60b3ab93b446cf7370cc82c60c1d1c613f
Successfully built bayesian-optimization
Installing collected packages: bayesian-optimization
Successfully installed bayesian-optimization-1.2.0
グラフ作る
まずグラフを参考ページの通りに作ります。
import math
import numpy as np
from matplotlib import pyplot as plt
def f(x):
return math.exp(-(x - 2) ** 2) + math.exp(-(x - 6) ** 2 / 10) + 1 / (x ** 2 + 1)
X = [x for x in np.arange(-5, 15, 0.1)]
y = [f(x) for x in X]
plt.plot(X, y)
plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.show()
<Figure size 432x288 with 1 Axes>
最適化する
import math
from bayes_opt import BayesianOptimization
#関数と値範囲を指定
bo = BayesianOptimization(f=f, pbounds={'x': (-5, 15),})
bo.maximize(init_points=3, n_iter=10)
| iter | target | x |
-------------------------------------
| [0m 1 [0m | [0m 0.8988 [0m | [0m 4.753 [0m |
| [0m 2 [0m | [0m 0.1058 [0m | [0m-2.912 [0m |
| [95m 3 [0m | [95m 1.001 [0m | [95m 6.472 [0m |
| [0m 4 [0m | [0m 0.004728[0m | [0m 15.0 [0m |
| [0m 5 [0m | [0m 0.306 [0m | [0m 9.494 [0m |
| [95m 6 [0m | [95m 1.339 [0m | [95m 1.723 [0m |
| [0m 7 [0m | [0m 1.012 [0m | [0m 0.2996 [0m |
| [0m 8 [0m | [0m 0.9704 [0m | [0m 2.843 [0m |
| [0m 9 [0m | [0m 1.029 [0m | [0m 1.185 [0m |
| [0m 10 [0m | [0m 0.03059 [0m | [0m 12.11 [0m |
| [0m 11 [0m | [0m 0.5737 [0m | [0m-0.878 [0m |
| [0m 12 [0m | [0m 0.7822 [0m | [0m 7.635 [0m |
| [0m 13 [0m | [0m 0.03847 [0m | [0m-5.0 [0m |
=====================================
##可視化できるらしい
可視化できるらしいので経過を見てみます。
import math
import numpy as np
from bayes_opt import BayesianOptimization
from matplotlib import pyplot as plt
#関数
def f(x):
return math.exp(-(x - 2) ** 2) + math.exp(-(x - 6) ** 2 / 10) + 1 / (x ** 2 + 1)
#関数と値範囲を指定
bo = BayesianOptimization(f=f, pbounds={'x': (-5, 15),})
bo.maximize(init_points=3, n_iter=10)
#プロット
X = [x for x in np.arange(-5, 15, 0.1)]
#元の関数
y = [f(x) for x in X]
plt.plot(X, y, label='true')
xs = [p['params']['x'] for p in bo.res]
ys = [f(p['params']['x']) for p in bo.res]
plt.scatter(xs, ys, c='green', s=20, zorder=10, label='sample')
mean, sigma = bo._gp.predict(np.array(X).reshape(-1, 1), return_std=True)
plt.plot(X, mean, label='pred')
plt.fill_between(X, mean + sigma, mean - sigma, alpha=0.1)
plt.legend()
plt.grid()
plt.show()
| iter | target | x |
-------------------------------------
| [0m 1 [0m | [0m 0.9476 [0m | [0m 5.025 [0m |
| [0m 2 [0m | [0m 0.09534 [0m | [0m-3.085 [0m |
| [95m 3 [0m | [95m 0.9612 [0m | [95m 5.113 [0m |
| [0m 4 [0m | [0m 0.09833 [0m | [0m 10.91 [0m |
| [0m 5 [0m | [0m 0.8465 [0m | [0m 7.372 [0m |
| [0m 6 [0m | [0m 0.004728[0m | [0m 15.0 [0m |
| [95m 7 [0m | [95m 1.09 [0m | [95m 1.293 [0m |
| [0m 8 [0m | [0m 1.034 [0m | [0m-0.06879 [0m |
| [95m 9 [0m | [95m 1.169 [0m | [95m 2.56 [0m |
| [0m 10 [0m | [0m 0.7652 [0m | [0m 3.251 [0m |
| [0m 11 [0m | [0m 0.03848 [0m | [0m-4.999 [0m |
| [0m 12 [0m | [0m 0.4374 [0m | [0m-1.148 [0m |
| [0m 13 [0m | [0m 0.4847 [0m | [0m 8.741 [0m |
=====================================
<Figure size 432x288 with 1 Axes>
なんかいい感じの予想グラフが取れました。