[PYTHON] Passen Sie die Hyperparameter mit der Bayes'schen Optimierung an

Was ist Bayes'sche Optimierung?

(Verschiedenes) ** A. Wie man den besten Platz findet, während man Experimente so weit wie möglich überspringt. ** ** **

Beobachten Sie mit der Methode "** Gaußsche Prozessregression **" zur statistischen Schätzung einer bestimmten Funktion $ f $ den Wert von $ y = f (x) $ nur dort, wo er gut aussieht ** und $ So finden Sie den optimalen Wert von f $.

Dieser Artikel ist als Beispiel für die tatsächliche Verwendung leicht zu verstehen. Machen Sie den besten Korken hoch mit Bayes'scher Optimierung - es sieht köstlich aus

Da ich kürzlich die Möglichkeit hatte, es zu verwenden, möchte ich vorstellen, was ich zu diesem Zweck untersucht habe und welche Berechnung ich als vorläufiges Experiment durchgeführt habe. Detaillierte mathematische Diskussionen finden Sie in Kapitel 6 von PRML und Kapitel 6 von "Gaußscher Prozess und maschinelles Lernen". In diesem Artikel werden eine Bildgeschichte und experimentelle Ergebnisse vorgestellt. .. (Der Ausführungscode hat am Ende einen GitHub-Link)

Was ist die Gaußsche Prozessregression?

Angenommen, Sie möchten eine Funktion wie die schwarze Linie in der folgenden Abbildung erwarten. Die eigentliche Funktion ist $ y = \ frac {1} {16} x ^ 4-x ^ 2 + \ frac {5} {16} x $, aber ich kenne die Funktionsform nicht. Es ist schwierig, alles von Ende zu Ende zu überprüfen. Lassen Sie uns also 5 Punkte (blauer Kreis) erhalten und das Ganze von hier aus vorhersagen.

image.png

Wenn Sie hier die Informationen zu diesem Punkt in "Gaußsche Prozessregression" eingeben und eine Vorhersage treffen, ist dies wie folgt [^ nan].

image.png

[^ nan]: Wenn diese 5 Punkte als Beobachtungen erhalten würden, welche Art von Funktion wäre eine solche Funktion, wie beispielsweise Rauschen nach einer Gaußschen Verteilung oder eine Form, in der die Funktion in einem bestimmten Ausdruck erhalten werden kann. Die Wahrscheinlichkeitsverteilung wird abgeleitet, indem die obigen Annahmen getroffen werden.

In der Gaußschen Prozessregression kommt die Vorhersage als "Wahrscheinlichkeitsverteilung von Funktionen" heraus. Es ist eine Information darüber, wie wahrscheinlich es ist, hier herumzugeben. Die blaue Linie in der Abbildung ist der Durchschnittswert dieser Wahrscheinlichkeitsverteilung, und der mit Hellblau gefüllte Teil ist der Variationsgrad der Wahrscheinlichkeit (hier die doppelte Standardabweichung. $ 2 \ sigma $, sodass die Wahrscheinlichkeit, in diesem Bereich zu liegen, 95% beträgt. ) Wird gezeigt. Die tatsächliche Funktion $ y = \ frac {1} {16} x ^ 4-x ^ 2 + \ frac {5} {16} x $ liegt gut im Fehlerbereich und im Fehlerbereich um den Beobachtungspunkt Sie können sehen, dass dies klein ist und der Fehlerbereich mit zunehmendem Abstand vom Punkt zunimmt.

Wenn Sie noch ein paar Punkte hinzufügen, image.png Es sieht aus wie. Es ist jetzt möglich, im Bereich von $ x = -3 bis 1 $ ziemlich genau vorherzusagen.

Wie man "einen Ort bestimmt, der gut aussieht"

In Anbetracht des Problems "Ich muss nicht die Form aller Funktionen kennen, also möchte ich nur den Mindestwert finden". Ich halte es für nutzlos, den Ort (um $ x = -1 bis 1 $) zu beobachten, von dem bekannt ist, dass er mit zunehmendem Wert zunimmt. Sie möchten bevorzugt nach Orten suchen, an denen der Wert klein zu sein scheint. Außerdem möchte ich noch ein paar Punkte hinzufügen, bei denen es eine Menge Unsicherheit gibt (um $ x = 3 $), nach der ich noch nicht viel gesucht habe.

Auf diese Weise besteht die "Erfassungsfunktion" darin, die "Orte, die wahrscheinlich den optimalen Wert haben" und die "Orte, die noch unsicher sind" in ausgewogener Weise zu bewerten. Welche jedoch hervorgehoben werden sollte, hängt vom jeweiligen Fall ab, sodass es je nach Strategie verschiedene Erfassungsfunktionen gibt.

etc...

image.png Wenn ich jeden von ihnen zeichne, sieht es so aus und ich gehe davon aus, dass etwa -2,7 $ der nächste zu beobachtende Punkt ist.

BayesianOptimization Da es schwierig ist, jedes Mal eine solche Berechnung zu schreiben, verwende ich ein Python-Paket namens Bayesian Optimization. Das Ziel verwendet dieselbe Form wie oben, $ y = x ^ 4-16x ^ 2 + 5x $ [^ stf].

[^ stf]: Diese Funktion wird häufig als Optimierungsbenchmark als Funktion mit mehreren Minima in der allgemeinen Dimension verwendet. STYBLINSKI-TANG-FUNKTION

image.png ノイズを含んでいます。

Wenn Sie 3 Punkte nehmen und eine Gaußsche Prozessregression durchführen, sind die Vorhersage- und Erfassungsfunktionen zunächst so. Ich entschied, dass die rote vertikale Linie als nächstes beobachtet werden sollte [^ gp]. image.png

[^ gp]: Die Erfassungsfunktion verwendet die EI-Strategie

Beobachten Sie dieses "x = 0,5", fügen Sie Punkte hinzu und wiederholen Sie die Regression. Die Unsicherheit um "x = 0" wurde signifikant verringert. image.png

Wenn dieser Zyklus ungefähr 20 Mal wiederholt wird, ist er wie folgt. image.png

Der Wert von x, der den Minimalwert annimmt, wurde als "-2,59469813" vorhergesagt. Die wahre Lösung ist "-2.9035 ...", also ist es ganz anders, aber es ist laut, so dass es bis zu einem gewissen Grad nicht geholfen werden kann.

Bei 2 Dimensionen

Im Allgemeinen können optimierte Suchvorgänge auch in höherdimensionalen Räumen durchgeführt werden. image.png image.png Aus STYBLINSKI-TANG-FUNKTION Versuchen Sie in ähnlicher Weise, es mit einer Funktion dieses Typs zu minimieren.

Als Ergebnis einer angemessenen Durchführung der Gaußschen Prozessregression mit 5 Punkten sind der Durchschnittswert, die Standardabweichung und die Erfassungsfunktion wie folgt. image.png Es sieht so aus, wenn ich es in 3D zeichne. (Blau ist der Durchschnitt, Grün ist die Standardabweichung ±) image.png

Ebenso, wenn 55 Beobachtungszyklen durchgeführt werden image.png image.png

Die Form kommt einer echten Funktion sehr nahe. Der Wert von x, der den Mindestwert annimmt, wurde als "(-2,79793531, -2,91749935)" vorhergesagt. Es scheint, dass die Genauigkeit besser ist als zuvor. Wenn Sie x und y in Schritten von 0,1 von -5 bis 5 suchen, müssten Sie 100 Experimente mit 10x10 durchführen, um die Anzahl der Experimente zu speichern.

Hyperparameteroptimierung

Die Bayes'sche Optimierung ist effektiv, wenn die Kosten für die Beobachtung einzelner Werte hoch und die Dimension des Suchraums groß sind. Wenden wir dies auf die Parameteranpassung des maschinellen Lernens an, die die Berechnungszeit für jedes Mal erhöht, wenn die Anzahl der Daten sehr groß wird.

Kerne Ridge Hyper Parameters-

Das maschinelle Lernmodell namens Kernel Ridge Regression hat zwei Hyperparameter, "Alpha" und "Gamma" (Parameter, die nicht automatisch bestimmt werden und abhängig von den Daten extern angegeben werden müssen) [^ hyper]. .. "Alpha" ist die Stärke der Regularisierung (Arbeit zur Verhinderung von Überlernen), und "Gamma" ist ein Parameter, der die Form der anzuwendenden Funktion bestimmt.

[^ hyper]: Eigentlich gibt es eine Möglichkeit, die theoretisch geeigneten Parameter zu bestimmen, aber hier werden wir zufällig suchen, ohne darüber nachzudenken.

Lassen Sie uns die Parameter finden, die die Genauigkeit des Modells maximieren, das die Immobilienpreise mit dem in sklearn.datasets enthaltenen Boston-Datensatz vorhersagt.

Lassen Sie uns zunächst die Genauigkeit mit den Standardparameterwerten überprüfen.

KernelRidge(kernel='rbf').fit(train_x, train_y).score(test_x, test_y)
#=> 0.4802674032751879

Es wurde 0,48.

Da sich die Ziffer des Parameters stark ändern kann, führen Sie die Parametersuche durch, indem Sie jede Protokollnummer eingeben.

def get_score_KR(x):
    alpha, gamma = x
    predictor = KernelRidge(kernel='rbf', alpha=alpha, gamma=gamma)
    return cross_val_score(predictor, train_x, train_y, cv=5).mean()
def get_score_KR_log(x):
    print(x)
    return get_score_KR((10**x[0][0], 10**x[0][1]))

Wir werden die Genauigkeit des Modells für Alpha und Gamma mit einer solchen Funktion überprüfen und es als Feedback für Experimente verwenden.


import GPyOpt
bounds = [{'name': 'log alpha', 'type': 'continuous', 'domain': (-4,2)},
         {'name': 'log gamma', 'type': 'continuous', 'domain': (-4,2)}]
bo = GPyOpt.methods.bayesian_optimization.BayesianOptimization(
    f=get_score_KR_log, domain=bounds, model_type='GP', acquisition_type='EI', initial_design_numdata=5, maximize=True)
bo.run_optimization()
bo.plot_acquisition()

image.png image.png Die ersten 5 Punkte sehen so aus.

image.png image.png Nach 11 Zyklen sieht es so aus.

image.png image.png So sieht es in 51 Zyklen aus. [^ alpha] Der optimale Wert von x ist "[-1,97439296, -0,25720405]", dh Alpha = 0,0106, Gamma = 0,553.

[^ alpha]: Es scheint, dass Alpha auf die kleinere Seite geschwenkt wurde, aber dies liegt wahrscheinlich daran, dass die Anzahl der Daten gering ist. Wenn Alpha zu klein ist, funktioniert die Regularisierung nicht und die Generalisierungsleistung sinkt. Daher beschränken wir unsere Suche auf diesen Punkt.

predictor_opt = KernelRidge(kernel='rbf', alpha=10**bo.x_opt[0], gamma=10**bo.x_opt[1])
predictor_opt.fit(train_x, train_y)

predictor_opt.score(test_x ,test_y)
#=> 0.8114250068143878

Als ich die Genauigkeit erneut mit diesem Wert überprüfte, betrug das Ergebnis 0,81, was im Vergleich zu vor der Optimierung erheblich verbessert wurde. Du hast es geschafft.

Vergleich mit der Rastersuche

Im Allgemeinen gibt es viele Dokumente, die "Rastersuche" verwenden, um den Raum einheitlich nach Hyperparameteranpassung zu durchsuchen [^ gs]. In ähnlicher Weise untersuchen wir den Parameterraum von $ 10 ^ {-4} bis 10 ^ 2 $.

[^ gs]: Beispiel: Rastersuche und Optimierung zufälliger Parameter im Scikit-Lerndokument 3.2. Optimieren der Hyperparameter eines Schätzers Wird eingeführt, und es gibt eine Beschreibung, dass die Rastersuche weit verbreitet ist.

from sklearn.model_selection import GridSearchCV
parameters = {'alpha':[i*10**j for j in [-4, -3, -2, -1, 0, 1] for i in [1, 2, 4, 8]], 
              'gamma':[i*10**j for j in [-4, -3, -2, -1, 0, 1] for i in [1, 2, 4, 8]]}
gcv = GridSearchCV(KernelRidge(kernel='rbf'), parameters, cv=5)
gcv.fit(train_x, train_y)

bes = gcv.best_estimator_
bes.fit(train_x, train_y)
bes.score(test_x, test_y)
#=> 0.8097198949264954

image.png

Die Form entspricht fast der vorhergesagten gekrümmten Oberfläche bei der Gaußschen Optimierung. Bei dieser Rastersuche wird "Experiment" mit jeweils 24 Punkten für Alpha und Gamma durchgeführt, was insgesamt 576 Punkten entspricht. Dies ist daher in Situationen schwierig, in denen die Anzahl der Daten groß ist und die Berechnung einige Zeit in Anspruch nimmt.

Zusammenfassung

Deshalb konnten wir in etwa 1/10 der Anzahl der Experimente die Parameter finden, die die gleiche Genauigkeit wie die Rastersuche mit Bayes'scher Optimierung aufweisen!

Wenn Sie Fehler oder Fragen haben, kommentieren Sie bitte.

Der Ausführungscode und der Fortschritt jedes Abschnitts sind unten aufgeführt.

Was ist Bayes'sche Optimierung? : BayesianOptimization_Explain BayesianOptimization:BayesianOptimization_Benchmark Hyperparameter-Optimierung: BayesianOptimization_HyperparameterSearch

Verweise

Übersetzt von C. M. Bishop, Hiroshi Motoda et al. (2012) "Mustererkennung und maschinelles Lernen Statistische Vorhersage durch Theorie der oberen und unteren Basis" Maruzen Publishing Daichi Mochihashi, Seisei Ohba (2019) Kodansha "Gauß-Prozess und maschinelles Lernen" Bayes-Optimierungspaket GPyOpt mit Python Mathematik der Bayes'schen Optimierung Machen Sie den besten Korken mit Bayes'scher Optimierung hoch Scikit-learn: Machine Learning in Python, Pedregosa et al., JMLR 12, pp. 2825-2830, 2011. GPyOpt

Recommended Posts

Passen Sie die Hyperparameter mit der Bayes'schen Optimierung an
Bayesianische Optimierung, die mit Python sehr einfach ist
Einführung in die Optimierung
Ich habe die Bayes'sche Optimierung ausprobiert!
Stellen Sie die Achsen mit matplotlib ein
Ich habe versucht, die Bayes'sche Optimierung zu durchlaufen. (Mit Beispielen)
Versuchen Sie die Funktionsoptimierung mit Optuna
Hyperparameter-Tuning mit LightGBM-Tuner
Gruppieren von Spielen mit Kombinationsoptimierung
Stellen Sie unzusammenhängende Fotos mit Optimierung wieder her!
Kombinationsoptimierung mit Quantenglühen
Globale Allzweckoptimierung mit Z3
[Python] Bayesianische Schätzung mit Pyro
Einführung in die Bayes'sche Optimierung
Rastersuche von Hyperparametern mit Scikit-learn
Maximieren Sie den Restaurantverkauf durch kombinierte Optimierung
GPyOpt, ein Paket zur Bayes'schen Optimierung in Python
Mit OR-Tools Part0 erlernte Optimierung [Einführung]
Spieltheorie mit Kombinationsoptimierung lösen