Die Bayes'sche Optimierung ist eine Methode zur Optimierung einer Funktion unter Verwendung einer maschinellen Lernmethode namens Gauß'scher Prozess, die eine Bayes'sche Kernel-Regression durchführt. Die Vorteile dieser Bayes'schen Optimierung sind vielfältig. Sie kann beispielsweise auf Funktionen angewendet werden, deren Eingaben nicht kontinuierlich (nicht differenzierbar) sind, und sie ist stark für Funktionen mit lokalen Lösungen. Aufgrund dieser Vorzüge wird davon ausgegangen, dass es in Zukunft auf verschiedene Probleme angewendet werden kann. Hier erklären wir, wie GPyOpt verwendet wird, ein Paket, das die Bayes'sche Optimierung in Python durchführt.
Verwenden Sie Anakonda als Umgebung. Sie benötigen die neuesten Scipy- und GPy-Pakete (Gaußscher Prozess).
$ conda update scipy
$ pip install GPy
$ pip install gpyopt
Zunächst optimieren wir eine nichtlineare Funktion, deren Eingabe eindimensional ist. Dieses Mal minimieren wir die Funktion von $ f (x) = \ cos (1,5x) + 0,1x $ im Bereich von $ 0 \ leq x \ leq 10 $.
Bei der Bayes'schen Optimierung werden zunächst einige Eingaben innerhalb eines bestimmten Bereichs zufällig ausgewählt. Führen Sie als Nächstes das Eingabe-Sample durch die Funktion und erhalten Sie das Output-Sample. Dann führen wir anhand dieser Stichprobe eine Regression im Gaußschen Prozess durch. In dieser Abbildung ist Grün die Funktion, die Sie optimieren möchten, und Blau ist die Funktion, die im Gaußschen Prozess wiederholt wird. 
Lassen Sie uns nun herausfinden, wo die Funktion minimiert ist. Wir bestimmen das kleinste x und finden das y und so weiter. Es gibt verschiedene Kriterien dafür, wo x wahrscheinlich das Minimum ist, aber dieses Mal wird x, das sich bis zum kleinsten y im blauen Bereich in dieser Figur erstreckt, auf x gesetzt, das wahrscheinlich das Minimum ist. Ich werde. Dieser blaue Bereich ist der Bereich, der wahrscheinlich eine grüne Linie enthält, wenn nur die Daten der roten Punkte angegeben werden.
Lassen Sie uns nun eine mit dieser Methode testen. Nach dem Abtasten ist es wichtig, dass sich der blaue Bereich ändert. In diesem Zustand ist es dann durch Durchführen einer Abtastung → Aktualisierung des blauen Bereichs → Abtastung → Aktualisierung des blauen Bereichs → ... möglich, x zu finden, das das Minimum von $ f (x) $ ist.
Dann wird die Figur nach einigen Abtastungen gezeigt. Viele Stichproben werden tatsächlich um $ x = 2 $ abgetastet, und die optimale Lösung ist die, bei der $ f (x) $ bei dieser Stichprobe tatsächlich minimiert wird.
Machen wir es mit GPyOpt.
Importieren Sie es zuerst.
import GPy
import GPyOpt
import numpy as np
Definieren Sie dann die Funktion, die Sie optimieren möchten. Hier können Sie die Numpy-Funktion angeben.
def f(x):
'''
Nichtlineare Funktion muss diesmal optimiert werden
'''
return np.cos(1.5*x) + 0.1*x
Definieren wir nun zunächst den Definitionsbereich von x. 'Typ': 'stetig' gibt an, dass es stetig ist, und 'Domäne': (0,10) gibt an, dass es $ 0 \ leq x \ leq 10 $ ist. In der zweiten Zeile erhalten wir das Objekt für die Bayes'sche Optimierung. f ist die Funktion, die Sie optimieren möchten, domain ist der zuvor definierte Definitionsbereich und initial_design_numdata ist die Anzahl der zuerst zu erfassenden Stichproben. Undquisitionstyp bezieht sich auf die Auswahl von x, das als nächstes abgetastet werden soll ('LCB' ist die Auswahl der Stelle, an der der blaue Bereich minimiert wird).
bounds = [{'name': 'x', 'type': 'continuous', 'domain': (0,10)}]
myBopt = GPyOpt.methods.BayesianOptimization(f=f, domain=bounds,initial_design_numdata=5,acquisition_type='LCB')
Wiederholen Sie dann die Probenahme mit dem folgenden Befehl, um sie zu optimieren. max_iter gibt die Anzahl der Abtastungen an.
myBopt.run_optimization(max_iter=15)
Die optimale Lösung wird angezeigt.
print(myBopt.x_opt) #[ 2.05769988]
print(myBopt.fx_opt) #[-0.79271554]
Andere Funktionsvariablen, die verwendet werden können
myBopt.model.model #Gaußsches Prozessmodell für die Bayes'sche Optimierung(GPy-Objekt)
myBopt.model.model.predict #Gaußsche Prozessregressionsfunktion
myBopt.X,myBopt.Y #Abtastung von x und y
Die Bayes'sche Optimierung kann auch in mehreren Dimensionen angewendet werden. Hier wird eine zweidimensionale Bayes'sche Optimierung durchgeführt. Da die Eingangsvariable eine diskrete Variable sein kann, werde ich auch eine diskrete Variable für eine Dimension verwenden.
Die Funktion ist $ f (x) = \ log (10.5-x_0) + 0.1 \ sin (15x_0) $, wenn $ x_1 = 0 $, und $ f (x) = \ cos (wenn $ x_1 = 1 $). 1,5x_0) + 0,1x_0 $. Außerdem werden wir es im Bereich von $ 0 \ leq x_1 \ leq 10 $ minimieren ($ x_0 $ ist 0 oder 1).
Nach der Optimierung sieht es wie im folgenden Bild aus.
Machen wir es mit GPyOpt.
import GPy
import GPyOpt
import numpy as np
def f(x):
'''
Nichtlineare Funktion muss diesmal optimiert werden
'''
x0,x1 = x[:,0],x[:,1]
f0 = np.log(10.5-x0) + 0.1*np.sin(15*x0)
f1 = np.cos(1.5*x0) + 0.1*x0
return (1-x1)*f0 + x1*f1
bounds = [{'name': 'x0', 'type': 'continuous', 'domain': (0,10)},
{'name': 'x1', 'type': 'discrete', 'domain': (0,1)}]
myBopt = GPyOpt.methods.BayesianOptimization(f=f, domain=bounds)
myBopt.run_optimization(max_iter=30)
Es ist nicht so anders als der eindimensionale Fall. Was sich geändert hat, ist, dass die Funktion auch zwei Eingänge hat und Grenzen eine Liste mit zwei Elementen sind. 'Typ': 'diskret' steht für eine Auswahl, 0 oder 1.
Die optimale Lösung wird angezeigt.
print(myBopt.x_opt) #[ 2.0539031 1. ]
print(myBopt.fx_opt) #[-0.7927657]
Recommended Posts