x^2+y^2+z^2
Die beiden Frameworks werden in einem separaten Artikel vorgestellt. Bitte beziehen Sie sich darauf. Funktionsoptimierung mit Optuna versuchen [Funktionsoptimierung mit Hyperopt versuchen](https://qiita.com/ pontyo4 / items / 31aa1d4527c7bf99759e) Vergleichsexperiment Dieses Mal werden wir das Minimierungsproblem optimieren. Die Ergebnisse sind für jeden Versuch unterschiedlich, daher werde ich es dreimal versuchen.
Der für dieses Experiment verwendete Code lautet wie folgt.
# -*- coding: utf-8 -*-
import optuna
import hyperopt
from hyperopt import hp
from hyperopt import fmin
from hyperopt import tpe
from hyperopt import Trials
import matplotlib.pyplot as plt
#Zielfunktion für Optuna einstellen(Diesmal x^2+y^2+z^2)
def objective_optuna(trial):
#Stellen Sie die zu optimierenden Parameter ein
param = {
'x': trial.suggest_uniform('x', -100, 100),
'y': trial.suggest_uniform('y', -100, 100),
'z': trial.suggest_uniform('z', -100, 100)
}
#Gibt den Auswertungswert zurück(Es ist standardmäßig so konzipiert, dass es minimiert wird)
return param['x'] ** 2 + param['y'] ** 2 + param['z'] ** 2
#Optimiert mit optuna
def optuna_exe():
#Objekterstellung studieren
study = optuna.create_study()
#Optimierungsausführung
study.optimize(objective_optuna, n_trials=500)
#Beste Parameteranzeige
print(study.best_params)
#Besten Zielfunktionswert anzeigen
print(study.best_value)
epoches = [] #Zum Speichern der Anzahl der Versuche
values = [] #Zum Speichern des besten Wertes
best = 100000
#bestes Update
for i in study.trials:
if best > i.value:
best = i.value
epoches.append(i.number + 1)
values.append(best)
return epoches, values
#Stellen Sie die Zielfunktion für Hyperopt ein
def objective_hyperopt(args):
x, y, z = args
return x ** 2 + y ** 2 + z ** 2
#Optimiert mit Hyperopt
def hyperopt_exe():
#Suchraumeinstellungen
space = [
hp.uniform('x', -100, 100),
hp.uniform('y', -100, 100),
hp.uniform('z', -100, 100)
]
#Ein Objekt zum Aufzeichnen des Suchstatus
trials = Trials()
#Beginnen Sie mit der Erkundung
best = fmin(objective_hyperopt, space, algo=tpe.suggest, max_evals=500, trials=trials)
#Das Ergebnis ausgeben
print(best)
epoches = [] #Zum Speichern der Anzahl der Versuche
values = [] #Zum Speichern des besten Wertes
best = 100000
#bestes Update
for i, n in zip(trials.trials, range(500)):
if best > i['result']['loss']:
best = i['result']['loss']
epoches.append(n+1)
values.append(best)
return epoches, values
def plot_graph():
result_optuna = optuna_exe()
result_hyperopt = hyperopt_exe()
epoch_optuna = result_optuna[0]
value_optuna = result_optuna[1]
epoch_hyperopt = result_hyperopt[0]
value_hyperopt = result_hyperopt[1]
#Zeichnen eines Diagramms
fig, ax = plt.subplots()
ax.set_xlabel("trial")
ax.set_ylabel("value")
ax.set_title("Optuna vs Hyperopt")
ax.grid() #Gitterlinien einfügen
ax.plot(epoch_optuna, value_optuna, color="red", label="Optuna")
ax.plot(epoch_hyperopt, value_hyperopt, color="blue", label="Hyperopt")
ax.legend(loc=0) #Gebrauchsanweisung
plt.show() #Grafikanzeige
if __name__ == '__main__':
plot_graph()
Optuna: 'x': 0.2690396239515218, 'y': -1.75236444646743, 'z': 0.3724308175904496, best_value:3.2818681863901693
Hyperopt: 'x': -2.9497423868903834, 'y': 0.13662455602710644, 'z': -3.844496541052724, best_value:23.499800072493738
Optuna ist im endgültigen best_value ausgezeichnet. Es scheint, dass Optuna dem Diagramm in Bezug auf die Konvergenzgeschwindigkeit überlegen ist.
Optuna: 'x': 0.7811129871251672, 'y': 0.4130867942356189, 'z': 0.6953642534092288, best_value:1.2643096431468364
Hyperopt: 'x': -3.7838067947126675, 'y': -2.595648793357423, 'z': -2.683504623035553, best_value:28.255783580024783
Ist Optuna sowohl beim zweiten als auch beim ersten Mal hinsichtlich des endgültigen Bestwerts und der Konvergenzgeschwindigkeit überlegen?
Optuna: 'x': -0.19339325990518663, 'y': -0.0030977352573082623, 'z': 0.4961595538587318, best_value:0.2835848518257752
Hyperopt: 'x': 2.810074634010315, 'y': -1.2603362587820195, 'z': -0.7356174272489406, best_value:10.026099933181214
Optuna war auch zum dritten Mal im endgültigen best_value-Wert überlegen. Ich habe das Gefühl, dass sich die Konvergenzgeschwindigkeit nicht wesentlich ändert.
Wir sind zu dem Schluss gekommen, dass Optuna hinsichtlich des endgültigen besten Zielfunktionswerts und der Konvergenzgeschwindigkeit überlegen ist. Wenn das Optimierungsproblem etwas schwieriger wird, wird es einen großen Unterschied machen ...