common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

ベイズ最適化

Yuichiro Minato

2021/02/15 01:01

#最適化

はじめに

量子コンピュータのハイブリッドを使いこなすには最適化を極める必要があります。ベイズ最適化を見てみたいと思います。

最適化?

最適化には大きく分けて二種類あるようです。

数理(連続)最適化 - 最適化問題のうち解が連続的なもの。 組合せ(離散)最適化 - 最適化問題のうち、解が離散的なもの。

https://ja.wikipedia.org/wiki/%E6%9C%80%E9%81%A9%E5%8C%96

組み合わせ最適化?

ほとんどの社会問題や業務最適化はこの組合せ最適化になるようです。 離散最適化と呼ばれており、代表的なものとして、

・遺伝的アルゴリズムGA
・タブーサーチ
・シミュレーテッドアニーリングSA

があります。

数理最適化?

連続的な値を最適化するようですが、基本的にはmax/minの点を探します。 主に機械学習などのブラックボックス最適化に対して最適化を適用するようです。 機械学習や深層学習などで現在パラメータの最適化自動化で注目されています。

実例?

facebookがpytorch向けに出したり、
「AIモデルの最適化を単純にするAxとBoTorchをFacebookがオープンソース化」
https://jp.techcrunch.com/2019/05/03/2019-05-01-facebook-open-sources-ax-and-botorch-to-simplify-ai-model-optimization/

また、google deepmindがalphagoでベイズ最適化に言及しています。
"Bayesian Optimization in AlphaGo"
https://arxiv.org/abs/1812.06855

ベイズ最適化?

ベイズ最適化は探索するデータに優先順位をつけて、効率的なデータの最適化を目指しているようです。 手法としては、

1、関数f(x)を用意する。
2、ランダムに点xを選び、f(x)の値を求める。
3、xとf(x)の値から次にデータとして価値のたかそうな点を算出する。
4、その点xにおけるf(x)の値を求める。
5、そのステップを繰り返し、一定ステップ済んだら終了する。

参考

この資料がバッチリでした。。。

機械学習のためのベイズ最適化入門
https://www.slideshare.net/hoxo_m/ss-77421091

概要

visualization_21_1.png 引用:http://philipperemy.github.io/visualization/

ガウス過程を使って、ランダムで打った点からグラフが存在してそうなところを推測しながら計算をします。上記は求めたいグラフは青の実線の最大値ですが実際には不明。点線が予測。緑の範囲が存在のしうる部分です。データ範囲に優先順位をつけながら作れるようです。

ガウス過程

ガウス過程は機械学習における教師あり学習の回帰分析に応用される。平均値関数と共分散関数を既知とし与えられたデータがそのガウス過程に従っていると仮定すると未知の観測値の平均と分散がわかる。

https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%E9%81%8E%E7%A8%8B

参考

こちらを参考にしました。

「Python: ベイズ最適化で機械学習モデルのハイパーパラメータを選ぶ」 https://blog.amedama.jp/entry/2018/08/18/233841

パッケージ

インストールします

!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)

グラフ作る

まずグラフを参考ページの通りに作ります。

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>output

最適化する

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     |

-------------------------------------

|  1        |  0.8988   |  4.753    |

|  2        |  0.1058   | -2.912    |

|  3        |  1.001    |  6.472    |

|  4        |  0.004728 |  15.0     |

|  5        |  0.306    |  9.494    |

|  6        |  1.339    |  1.723    |

|  7        |  1.012    |  0.2996   |

|  8        |  0.9704   |  2.843    |

##可視化できるらしい 可視化できるらしいので経過を見てみます。

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     |

-------------------------------------

|  1        |  0.9476   |  5.025    |

|  2        |  0.09534  | -3.085    |

|  3        |  0.9612   |  5.113    |

|  4        |  0.09833  |  10.91    |

|  5        |  0.8465   |  7.372    |

|  6        |  0.004728 |  15.0     |

|  7        |  1.09     |  1.293    |

|  8        |  1.034    | -0.06879  |
<Figure size 432x288 with 1 Axes>output

なんかいい感じの予想グラフが取れました。

© 2024, blueqat Inc. All rights reserved