Diskussion zum Artikel "Tiefe neuronale Netzwerke (Teil V). Bayes'sche Optimierung von DNN-Hyperparametern" - Seite 2

 

Interessante Ergebnisse der Optimierung - der Fehler bei der Validierungsstichprobe war geringer als bei der Trainingsstichprobe!

Mit anderen Worten, das Modell auf einige Daten trainiert, gelernt, auf andere Daten zu arbeiten, dh extrahiert mehr Informationen aus den Trainingsdaten als es tatsächlich war - ist das Science-Fiction oder Abenteuer...?

Ich appelliere an den Autor - stoppen shtukarstva und Fälschung, endlich schreiben ein Expert Advisor und zeigen einige Ergebnisse, zumindest auf Demo.

 
revers45:

Mit anderen Worten: Das Modell, das mit einigen Daten trainiert wurde , hat gelernt, mit anderen Daten zu arbeiten, d. h. es hat mehr Informationen aus den Trainingsdaten extrahiert, als tatsächlich vorhanden waren - ist das Science-Fiction oder ein Abenteuer...?

Alle Modelle wurden auf der Trainingsfläche trainiert, d. h. sie versuchten, den Fehler in der Trainingsfläche zu minimieren, aber am Ende wurde die Auswahl auf der Testfläche getroffen, und wenn das Modell kein Muster in den Daten gefunden hätte, wären die Ergebnisse auf der Trainingsfläche oder auf der Fläche nach der Testfläche sehr schlecht gewesen. Aber wie die Ergebnisse sowohl dort als auch dort gezeigt haben, unterscheiden sie sich nicht sehr von der Testfläche, auf der die Auswahl vorgenommen wurde.
Das heißt, der NS hat nicht vom anderen gelernt, sondern in beiden Datensätzen gemeinsame Muster gefunden.
Wären die Ergebnisse weniger stabil gewesen, hätte die Auswahl auf der Testfläche (ohne Berücksichtigung des Fehlers des Trainers) zu einer Anpassung an diese führen können. In diesem Fall war das nicht der Fall, aber bei anderen Daten (wenn keine Muster gefunden wurden) könnte das der Fall sein. Und dann wäre es besser, ein Gleichgewicht zwischen Fehlern wie Err = (ErrLeran * 0,37 + ErrValid * 0,63) zu suchen

 
elibrarius:

Hallo, Vladimir,

ich verstehe nicht ganz, warum Ihr NS auf Trainingsdaten trainiert wird und seine Auswertung auf Testdaten erfolgt (wenn ich mich nicht irre, verwenden Sie diese als Validierung).

Würden Sie in diesem Fall nicht eine Anpassung an das Testdiagramm erhalten, d. h. Sie würden das Modell auswählen, das auf dem Testdiagramm am besten funktioniert?
Sie sollten auch berücksichtigen, dass das Testdiagramm recht klein ist und Sie eines der zeitlichen Muster anpassen können, was sehr schnell aufhören kann zu funktionieren.
Vielleicht ist es besser, auf dem Trainingsdiagramm zu schätzen, oder auf der Summe der Diagramme, oder wie in Darch (mit vorgelegten Validierungsdaten) auf Err = (ErrLeran * 0,37 + ErrValid * 0,63) - diese Koeffizienten sind Standardwerte, aber sie können geändert werden.

Es gibt viele Optionen, und es ist nicht klar, welche davon die beste ist. Ihre Argumente für den Testplot sind interessant.

Schönen guten Tag.

Lassen Sie uns etwas genauer werden. Datensatz X besteht aus 4 Teilmengen preptrain = 4001, train = 1000, test = 500 und test1= 100 Takte. Für das Pretraining verwenden wir den Trainingssatz - pretrain, den Validierungssatz - train.

#  SRBM + upper Layer (backpropagation)
 pretrainSRBM_topLayer <- function(Ln, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top) #  SRBM + upper Layer (backpropagation)
  {
    darch( x = X$pretrain$x, y = X$pretrain$y,
          xValid = X$train$x, 
          yValid = X$train$y,
          #=====constant======================
......................................................

Für die Feinabstimmung wird der Pretrain-Satz als Trainingssatz verwendet und der Validierungssatz wird für die ersten 250 Takte des Testsatzes verwendet.

fineTuneRP <- function(Ln, fact1, fact2, dr1, dr2, Dnn) #  rpropagation
  {
    darch( x = X$train$x, y = X$train$y,
           #xValid = X$test$x, yValid = X$test$y,
           xValid = X$test$x %>% head(250), 
           yValid = X$test$y %>% head(250),
           #=====constant========
................................................

Zur Bestimmung der endgültigen Qualität werden daher die letzten 250 Takte des Testsatzes als Testsatz verwendet. Code

#---SRBM + upperLayer + RP----
  fitnes4.DNN <- function(n1, n2, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top)
  {
    Ln <- c(0, 2*n1, 2*n2, 0)
    #--
     pretrainSRBM_topLayer(Ln, fact1, fact2, dr1, dr2, Lr.rbm, Lr.top) -> Dnn
    fineTuneRP(Ln, fact1, fact2, dr1, dr2, Dnn) -> Dnn
    predict(Dnn, newdata = X$test$x %>% tail(250) , type = "class") -> Ypred
    yTest <- X$test$y[ ,1] %>% tail(250)
    #numIncorrect <- sum(Ypred != yTest)
    #Score <- 1 - round(numIncorrect/nrow(xTest), 2)
    Score <- Evaluate(actual = yTest, predicted = Ypred)$Metrics$F1 %>%
      mean() 
    return(list(Score = Score, Pred = Ypred)
  }

Ich sehe hier keinen Widerspruch. Stimmen Sie mir zu?

Viel Glück!

 
elibrarius:

Alle Modelle wurden auf dem Trainingsplot trainiert, d.h. sie versuchten, den Fehler auf diesem Plot zu minimieren, aber am Ende wurde die Auswahl auf dem Testplot durchgeführt, und wenn das Modell kein Muster in den Daten gefunden hat, wären die Ergebnisse auf dem Trainingsplot oder auf dem Plot nach dem Testplot sehr schlecht. Aber wie die Ergebnisse sowohl dort als auch dort gezeigt haben, unterscheiden sie sich nicht sehr von der Testfläche, auf der die Auswahl vorgenommen wurde.
Das heißt, der NS hat nicht vom anderen gelernt, sondern in beiden Datensätzen gemeinsame Muster gefunden.
Wären die Ergebnisse weniger stabil, dann hätte die Auswahl auf der Testfläche (ohne Berücksichtigung des Fehlers des Trainers) zu einer Anpassung an diese führen können. In diesem Fall war das nicht der Fall, aber bei anderen Daten (wenn keine Muster gefunden wurden) könnte das der Fall sein. Und dann wäre es besser, nach einem Gleichgewicht zwischen den Fehlern wie Err = (ErrLeran * 0,37 + ErrValid * 0,63) zu suchen.

Auf jeden Fall sollten die allgemeinen Regelmäßigkeiten auf dem Trainingsdiagramm nicht geringer sein als auf dem Testdiagramm, da sie dort zusammen mit allen anderen gefunden wurden, und daher sollte das NS auf diesem Diagramm nicht schlechter funktionieren.

Meiner Meinung nach ist dies offensichtlich, ebenso wie die Tatsache, dass das Wissen des Lehrers nicht geringer sein sollte als das des Schülers, obwohl der Autor des Artikels offenbar versucht, dies zu widerlegen, denn er schrieb in den Kommentaren, dass er kein Wissenschaftler und kein Programmierer ist, aber darauf besteht, uns beizubringen, wie man neuronale Netze programmiert.

Natürlich hat er bereits eine Menge R-Code gepostet, aber ich würde gerne angemessene Ergebnisse sehen und vor allem verstehen, wie viele Artikel er noch schreiben wird, bis wenigstens ein normaler Expert Advisor erscheint.

 
Vladimir Perervenko:

Guten Tag.

Lassen Sie uns das klären. Datensatz X besteht aus 4 Teilmengen preptrain = 4001, train = 1000, test = 500 und test1= 100 Takte. Für das Pre-Training verwenden wir den Trainingssatz - pretrain, den Validierungssatz - train.

Für die Feinabstimmung wird der Pretrain-Satz als Trainingssatz verwendet und der Validierungssatz sind die ersten 250 Takte des Testsatzes.

Zur Bestimmung der endgültigen Qualität werden daher die letzten 250 Takte des Testsatzes als Testsatz verwendet. Code

Ich sehe hier keinen Widerspruch. Stimmen Sie zu?

Viel Glück!

Technisch ist alles gut gemacht, das ist nicht die Frage.
Ich denke, 250 Balken reichen nicht aus, um das Modell zu bewerten, deshalb habe ich mich gefragt, warum nur dieser Abschnitt ausgewählt wurde.
Ja, es funktioniert in einem bestimmten Fall (Sie haben an allen Standorten gute Ergebnisse erzielt), aber ich denke, es ist nicht universell.

Es könnte ja auch Daten geben, die nicht so gut sind. Zum Beispiel könnte das Modell auf 40 % Fehler in der Trainingskurve trainiert werden und rein zufällig 30 % in der Testkurve anzeigen. Und das zweite Modell, sagen wir mal, wurde auf 35% in beiden Plots trainiert. Das zweite Modell ist offensichtlich besser. Wenn Sie jedoch nur die Testkurve auswählen, wird das erste Modell gewählt. Zum Vergleich gibt es folgende Möglichkeiten der Modellauswertung:
Auswertung nur auf der Trainingsfläche,
oder auf der Summe aller Flächen,
oder wie in Darch (mit vorgelegten Validierungsdaten) auf Err = (ErrLeran * 0,37 + ErrValid * 0,63) - diese Koeffizienten sind Standardwerte, können aber geändert werden.

Die letzte Variante ist die interessanteste, weil sie beide Fehler berücksichtigt, aber mit einem größeren Gewicht des Validierungsabschnitts.
Im Prinzip kann man die Formel z.B. auf Err = (ErrLeran * 0,25 + ErrValid * 0,35 + ErrTest * 0,4) erweitern.

Vielleicht ist es sogar notwendig, anhand der Fehlerdeltas eine Auswahl zu treffen, z. B. wenn ErrLeran und ErrTest um mehr als 5 % voneinander abweichen - dann wird ein solches Modell verworfen. Und treffen Sie eine Auswahl aus den verbleibenden Modellen.

Ich habe ein Experiment gemacht.

Hier sind einige Ergebnisse von 30 Trainingseinheiten: (das Modell ist nicht dasselbe wie das ursprüngliche, alles ist perfekt darauf, also habe ich das Pre-Training entfernt, damit es schlechte Ergebnisse gibt)

Dekodierung: V1 = 1-ErrLearn; V2= 1-ErrOOC; Value = 1 - (ErrLeran * 0.37 + ErrOOC * 0.63); in das OOS habe ich die Daten von Valid und Test geklebt.

Value V1 V2

0.5712 0.4988 0.6138 - OOS ist gut, aber zufällig, da Learn = 50%

0,5002 0,5047 0,4975 - dies war häufiger der Fall

0.6719 0.6911 0.6606 - und ein paar Mal so. Sortieren nach Wert = 1 - (ErrLeran * 0,37 + ErrOOC * 0,63) zieht solche Muster nach oben

 
revers45:
Natürlich hat er schon eine Menge R-Code gepostet, aber ich würde gerne adäquate Ergebnisse sehen und vor allem verstehen, wie viele Artikel er noch schreiben wird, bis es wenigstens einen normalen EA gibt.

In einem der Artikel gab es einen Expert Advisor, den ich in ein paar Tagen für die neue Version von Darch umgeschrieben habe - technisch funktioniert alles perfekt. Der Expert Advisor ist einfach - OHLC lesen und in R eingeben und die Berechnungsfunktion in R ausführen. Am Ende, nachdem er Befehle von der NS erhalten hat, sendet er Handelsbefehle an den Server. Das ist alles. Der Rest - Trailing, Stops, MM - ist ganz nach Ihrem Geschmack.
Das Schwierigste ist genau das, was in den Artikeln beschrieben wird - gute Daten zu finden und den NS richtig darauf zu trainieren. Vladimir zeigt alle möglichen Varianten von Modellen, Ensembles, Optimierungen, Auswahl und Verarbeitung von Prädiktoren..., ich kann nicht mit ihm mithalten)))

 

Was meinen Sie,
, sollten wir vielleicht die Varianten mit der Anzahl der Neuronen in Schichten, bei denen n2 > n1 ist, aus der Aufzählung der Hyperparameter ausschließen?

Zum Beispiel Netz 10 - 20 - 100 - 2 oder 10 - 8 - 100 - 2

Wenn n2 > n1 ist, erhält man eine Kompression auf n1, dann eine Dekompression auf n2 und dann wieder eine Kompression auf 1 oder 2 Neuronen der Ausgabeschicht. Wenn wir am Ende immer noch 2 Neuronen haben, dann sollte die Dekompression in der Mitte nach der Kompression der Daten auf der n1-Schicht keine Perimutationen ergeben. Aber es wird eine Menge Zeit kosten, die offensichtlich schlechteren Varianten zu berechnen.
Ich denke, es kann in der Fitnessfunktion auf folgende Weise gemacht werden: n1 ist die Anzahl der Neuronen und n2 ist der % von n1, dann aufrunden und *2 für maxout.

Update:
hat es selbst gemacht, hoffentlich wird die Rechenleistung effizienter genutzt.
 
elibrarius:

Was meinen Sie,
, sollten wir vielleicht die Varianten mit der Anzahl der Neuronen in Schichten, bei denen n2 > n1 ist, aus der Aufzählung der Hyperparameter ausschließen?

Zum Beispiel Netz 10 - 20 - 100 - 2 oder 10 - 8 - 100 - 2

Wenn n2 > n1 ist, erhält man eine Kompression auf n1, dann eine Dekompression auf n2 und dann wieder eine Kompression auf 1 oder 2 Neuronen der Ausgabeschicht. Wenn wir am Ende immer noch 2 Neuronen haben, sollte die Dekompression in der Mitte nach der Komprimierung der Daten auf der Schicht n1 keine Perimutationen ergeben. Aber es wird viel Zeit in Anspruch nehmen, die offensichtlich schlechteren Varianten zu berechnen.
Ich denke, es kann in der Fitnessfunktion auf folgende Weise gemacht werden: n1 sollte als die Anzahl der Neuronen aufgezählt werden, und n2 als % von n1, dann gerundet und *2 für maxout.

Grüße.

Bei meinen langen Experimenten mit den Parametern sind mir nur ein paar Besonderheiten aufgefallen:

- oft bessere Ergebnisse mit Fakt = 2

- oder wenn beide versteckten Schichten die gleiche Aktivierungsfunktion haben.

Ich habe das Verhältnis der Neuronen in den versteckten Schichten nicht begrenzt. Nicht-optimale Verhältnisse fallen sehr schnell aus der Betrachtung heraus. Aber Sie können diese Idee testen. Vielleicht finde ich Zeit und überprüfe die Optimierung mit rgenoud.

Viel Erfolg!

 
Vladimir Perervenko:

Ich habe das Verhältnis der Neuronen in den versteckten Schichten nicht begrenzt. Nicht-optimale Verhältnisse fallen sehr schnell aus der Betrachtung heraus. Aber Sie können diese Idee testen. Vielleicht finde ich Zeit und überprüfe die Optimierung mit rgenoud.

Ich habe dafür gesorgt, dass die nächste Schicht in % der vorherigen gezählt wird. Aber es besteht keine Lust, besonders zu vergleichen. Rein theoretisch hoffe ich, dass ich Recht habe, dass die Dekompression innerhalb des Netzes keine neuen Informationen liefert, nachdem die vorhergehenden Schichten komprimiert wurden.

Ich habe die Genetik an GA:ga ausprobiert. Es lief NS 200-300 mal zur Berechnung. Das ist eine ganze Menge. Und es gibt keine Verbesserung der Ergebnisse.

Obwohl ich davon ausgehe, dass wir für die Bayes'sche Optimierung mehr Durchläufe brauchen, nicht 20-30, sondern vielleicht bis zu 100. Denn es kommt oft vor, dass das beste Ergebnis eine von 10 zufälligen Startvarianten ist und bei den nächsten 10-20 Durchläufen des Optimierers nichts Besseres gefunden wird. Vielleicht gibt es bei 100 Durchläufen Verbesserungen....

Vladimir Perervenko:

- oft die besten Ergebnisse mit Fakt = 2

- oder wenn beide versteckten Schichten die gleiche Aktivierungsfunktion haben

Für mich ist das anders. Relu ist oft gut.

 
elibrarius:

Ich habe die nächste Schicht als Prozentsatz der vorherigen gezählt. Aber ich habe keine Lust, das zu vergleichen. Rein theoretisch hoffe ich, dass ich Recht habe, dass die Dekompression im Netz nach der Kompression auf den vorherigen Schichten keine neuen Informationen liefert.

Ich habe die Genetik an GA:ga ausprobiert. Es lief NS 200-300 mal zur Berechnung. Das ist eine ganze Menge. Und es gibt keine Verbesserung der Ergebnisse.

Obwohl ich davon ausgehe, dass wir für die Bayes'sche Optimierung mehr Durchläufe brauchen, nicht 20-30, sondern vielleicht bis zu 100. Denn es kommt oft vor, dass das beste Ergebnis eine von 10 zufälligen Startvarianten ist und bei den nächsten 10-20 Durchläufen des Optimierers nichts Besseres gefunden wird. Vielleicht wird es bei 100 Durchläufen Verbesserungen geben....

Das ist der Punkt, an dem es für mich variiert. Relu ist oft gut.

Genetics hat für mich auch nicht die besten Optionen gefunden.

Bei Bayesian muss man nicht nur mit der Anzahl der Durchgänge spielen, sondern auch mit der Anzahl der Punkte. Man muss nach einer schnelleren Option suchen. Das ist sehr mühsam, damit umzugehen.

Viel Glück!

PS. Wechseln Sie nicht zu TensorFlow? Es ist nur ein höheres Niveau.