(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)
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.
Wenn Sie hier die Informationen zu diesem Punkt in "Gaußsche Prozessregression" eingeben und eine Vorhersage treffen, ist dies wie folgt [^ nan].
[^ 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, Es sieht aus wie. Es ist jetzt möglich, im Bereich von $ x = -3 bis 1 $ ziemlich genau vorherzusagen.
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.
EI-Strategie (erwartete Verbesserung)
Erwarteter Wert, um wie viel der Mindestwert gegenüber dem Mindestwert der bisher beobachteten Punkte aktualisiert werden kann
LCB-Strategie (weniger vertrauensgebunden)
Untergrenze des Konfidenzintervalls
etc...
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
ノイズを含んでいます。
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].
[^ 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.
Wenn dieser Zyklus ungefähr 20 Mal wiederholt wird, ist er wie folgt.
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.
Im Allgemeinen können optimierte Suchvorgänge auch in höherdimensionalen Räumen durchgeführt werden. 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. Es sieht so aus, wenn ich es in 3D zeichne. (Blau ist der Durchschnitt, Grün ist die Standardabweichung ±)
Ebenso, wenn 55 Beobachtungszyklen durchgeführt werden
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.
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.
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()
Die ersten 5 Punkte sehen so aus.
Nach 11 Zyklen sieht es so aus.
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.
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
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.
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
Ü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