Diskussion zum Artikel "Neuronale Netze leicht gemacht (Teil 7): Adaptive Optimierungsverfahren"

 

Neuer Artikel Neuronale Netze leicht gemacht (Teil 7): Adaptive Optimierungsverfahren :

In früheren Artikeln haben wir den stochastischen Gradientenabstieg verwendet, um ein neuronales Netzwerk mit der gleichen Lernrate für alle Neuronen innerhalb des Netzwerks zu trainieren. In diesem Artikel schlage ich vor, sich mit adaptiven Lernmethoden zu beschäftigen, die eine Änderung der Lernrate für jedes Neuron ermöglichen. Wir werden auch die Vor- und Nachteile dieses Ansatzes betrachten.

Das Testen der Optimierung durch das Adam-Verfahren wurde unter den gleichen Bedingungen durchgeführt, die in früheren Tests verwendet wurden: Symbol EURUSD, Zeitrahmen H1, Daten von 20 aufeinanderfolgenden Kerzen werden in das Netzwerk eingespeist, und das Training wird mit der Historie der letzten zwei Jahre durchgeführt. Zum Testen wurde der Expert Advisor Fractal_OCL_Adam erstellt. Dieser Expert Advisor wurde auf Basis des Fractal_OCL EA erstellt, indem das Optimierungsverfahren Adam bei der Beschreibung des neuronalen Netzwerks in der OnInit-Funktion des Hauptprogramms angegeben wurde.

      desc.count=(int)HistoryBars*12;
      desc.type=defNeuron;
      desc.optimization=ADAM;

Die Anzahl der Schichten und Neuronen hat sich nicht geändert.

Der Expert Advisor wurde mit Zufallsgewichten im Bereich von -1 bis 1 initialisiert, wobei Nullwerte ausgeschlossen wurden. Während des Testens, bereits nach der 2. Trainingsepoche, stabilisierte sich der Fehler des neuronalen Netzes um 30 %. Wie Sie sich vielleicht erinnern, wenn Sie mit der Methode des stochastischen Gradientenabstiegs lernen, stabilisierte sich der Fehler nach der 5. Testepoche


Die Grafik der verpassten Fraktale zeigt einen allmählichen Anstieg des Wertes während des gesamten Trainings. Nach 12 Trainingsepochen ist jedoch eine allmähliche Abnahme der Wertzuwachsrate zu erkennen. Der Wert war nach der 14. Epoche gleich 72,5 %. Beim Training eines ähnlichen neuronalen Netzes mit der stochastischen Gradientenabstiegsmethode lag der Prozentsatz der fehlenden Fraktale nach 10 Epochen bei 97-100 % mit unterschiedlichen Lernraten.


Autor: Dmitriy Gizlyk

 

+

Ist dies ein Beispiel für MLP? Ist das Lernen mit Adam schneller geworden? Ich erinnere mich, dass Epochen beim letzten Mal sehr lange zum Lernen gebraucht haben.

Der stochastische Gradient braucht mit Sicherheit sehr lange, um zu funktionieren.

 

Vielen Dank für diesen Artikel.

Gibt es Pläne, andere Methoden zur Berechnung der Lernverlustfunktion zu organisieren?

 

Dmitriy Gizlyk - haben Sie neben der bloßen Theorie auch Praxis oder sind Sie ein ewiger "Lehrer"?

Praxis - ist es, wenn Sie mit Hilfe Ihrer Methoden erfolgreich handeln?

Dmitriy Gizlyk
Dmitriy Gizlyk
  • www.mql5.com
Опубликовал статью Нейросети — это просто (Часть 7): Адаптивные методы оптимизации В предыдущих статьях для обучения нейронной сети использовался метод стохастического градиентного спуска с применением единого коэффициента обучения для всех нейронов в сети. В данной статье предлагаю посмотреть в сторону адаптивных методов обучения, которые...
 
Boris Egorov:

Dmitriy Gizlyk - haben Sie neben der bloßen Theorie auch Praxis oder sind Sie ein ewiger "Lehrer"?

Praxis - ist es, wenn Sie mit Hilfe Ihrer Methoden erfolgreich handeln?

Wollen Sie, dass der Artikel eine Gelddruckmaschine enthält?

Der Mann spricht über die Netzwerkarchitektur und Variationen ihrer Organisation, was interessant ist, und was man in das Netzwerk einspeisen kann, bleibt dem Benutzer überlassen.

 

Frage. Welchen Zweck erfüllt die Erstellung einer Aufzählung

enum ENUM_BUFFERS
  {
   WEIGHTS,
   DELTA_WEIGHTS,
   OUTPUT,
   GRADIENT,
   FIRST_MOMENTUM,
   SECOND_MOMENTUM
  };

und Variablen in der Klasse CLayer?

class CLayer: public CArrayObj
  {
private:
...
   int               hWeights;
   int               hDeltaWeights;
   int               hOutput;
   int               hGradient;
...   
  };

Ich kann ihre Verwendung im Code nicht finden.

 
Aleksei Lesnikov:

Frage. Zu welchen Zwecken werden Übertragungen geschaffen

und Variablen in der Klasse CLayer?

Ich kann ihre Verwendung in dem Code nicht finden.

Danke für den Hinweis. Sie können sie löschen, sie sind noch von Entwürfen übrig.

 

Hallo an alle. Wer hat diesen Fehler beim Versuch, eine Datei zu lesen, festgestellt?

OnInit - 198 -> Fehler beim Lesen von AUDNZD.......

 
Borys Ivanov #:

Hallo an alle. Wer hat diesen Fehler beim Versuch, eine Datei zu lesen, festgestellt?

OnInit - 198 -> Fehler beim Lesen von AUDNZD.......

Diese Meldung informiert Sie nur darüber, dass das vortrainierte Netzwerk nicht geladen wurde. Wenn Sie Ihren EA zum ersten Mal ausführen, ist das normal und Sie brauchen die Meldung nicht zu beachten. Wenn Sie das neuronale Netz bereits trainiert haben und das Training fortsetzen möchten, sollten Sie prüfen, wo der Fehler beim Lesen der Daten aus der Datei aufgetreten ist.

Leider haben Sie den Fehlercode nicht angegeben, so dass wir mehr dazu sagen können.
 
Dmitriy Gizlyk #:

Diese Meldung informiert Sie nur darüber, dass das vortrainierte Netzwerk nicht geladen wurde. Wenn Sie Ihren EA zum ersten Mal ausführen, ist das normal und Sie brauchen die Meldung nicht zu beachten. Wenn Sie das neuronale Netz bereits trainiert haben und das Training fortsetzen möchten, sollten Sie überprüfen, wo der Fehler beim Lesen der Daten aus der Datei aufgetreten ist.

Leider haben Sie den Fehlercode nicht angegeben, so dass Sie mehr dazu sagen können.


Hallo.

Ich werde Ihnen mehr darüber erzählen.

Wenn Sie den Expert Advisor zum ersten Mal starten. Mit diesen Änderungen im Code:

 dError=Net.getRecentAverageError();
         if(add_loop)
           {
            Net.Save(FileName+".nnw",dError,dUndefine,dForecast,dtStudied,false);
            printf("Era %d -> error %.2 f %% forecast %.2 f",count,dError,dForecast);
           }
         ChartScreenShot(0,FileName+IntegerToString(count)+".png",750,400);
         int h=FileOpen(CSV,FILE_READ|FILE_WRITE|FILE_CSV);
         if(h!=INVALID_HANDLE)
           {
            FileSeek(h,0,SEEK_END);
            FileWrite(h,eta,count,dError,dUndefine,dForecast);
            FileFlush(h);
            FileClose(h);
            Print("Файл должен быть создан ChartScreenShot ");
           }
          else Print("Операция FileOpen ChartScreenShot неудачна, ошибка ",GetLastError()); 
        }
     }

Im Log schreibt er dies :

KO 0 18:49:15.205 Core 1 NZDUSD: load 27 bytes of history data to synchronise at 0:00:00.001

FI 0 18:49:15.205 Core 1 NZDUSD: Historie synchronisiert von 2016.01.04 bis 2022.06.28

FF 0 18:49:15.205 Core 1 2019.01.01 00:00:00 OnInit - 202 -> Fehler beim Lesen AUDNZD_PERIOD_D1_ 20Fractal_OCL_Adam 1.nnw prev Net 0

CH 0 18:49:15.205 Core 1 2019.01.01 00:00:00 OpenCL: GPU-Gerät 'gfx902' ausgewählt

KN 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Era 1 -> Fehler 0.01 % Prognose 0.01

QK 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Zu erstellende Datei ChartScreenShot

HH 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Era 2 -> Fehler 0,01 % Prognose 0,01

CP 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Zu erstellende Datei ChartScreenShot

PS 2 18:49:19.829 Kern 1 nicht verbunden

OL 0 18:49:19.829 Kern 1 Verbindung geschlossen

NF 3 18:49:19.829 Tester von Benutzer gestoppt


И в директории "C:\Users\Borys\AppData\Roaming\MetaQuotes\Tester\BA9DEC643240F2BF3709AAEF5784CBBC\Agent-127.0.0.1-3000\MQL5\Files"

Diese Datei wird erstellt:

Fractal_10000000.csv

#define  FileName        Symb.Name()+"_"+EnumToString((ENUM_TIMEFRAMES)Period())+"_"+IntegerToString(HistoryBars,3)+StringSubstr(__FILE__,0,StringFind(__FILE__,".",0))
#define  CSV             "Fractal_"+StringSubstr(DoubleToString(eta),2)+".csv"

mit dem folgenden Inhalt :

0.1 1 0.006391065067727753 0.30606698779533065 0.009849141883310947
0.1 2 0.01416031275898674 0.320172057079727 0.009671500063084178
0.1 1 0.021322935369592233 0.4824709164481285 0.009510368103745911
0.1 2 0.03047882579179044 0.4736268224037817 0.009336035129387396
0.1 1 0.04096262961921367 0.4747386346906194 0.009164897823757697
0.1 2 0.04745129346676422 0.9935630387598718 0.1983981648307233

und so weiter...

Beim Neustart wird derselbe Fehler angezeigt und die .csv-Datei wird überschrieben .

Das heißt, der Experte ist immer im Training, weil er die Datei nicht findet.

Und die zweite Frage, bitte schlagen Sie den Code vor (um Daten aus dem Ausgangsneuron zu lesen), um Kauf- und Verkaufsaufträge zu öffnen, wenn das Netzwerk trainiert wird.


Vielen Dank für den Artikel und für die Antwort.

 
Borys Ivanov #:


Hallo.

Ich werde Ihnen mehr darüber erzählen.

wenn Sie den Expert Advisor zum ersten Mal starten. Mit diesen Änderungen im Code:

Im Log wird dies geschrieben:

KO 0 18:49:15.205 Core 1 NZDUSD: Laden von 27 Byte Historiendaten zur Synchronisierung um 0:00:00.001

FI 0 18:49:15.205 Core 1 NZDUSD: Historie synchronisiert von 2016.01.04 bis 2022.06.28

FF 0 18:49:15.205 Core 1 2019.01.01 00:00:00 OnInit - 202 -> Fehler beim Lesen AUDNZD_PERIOD_D1_ 20Fractal_OCL_Adam 1.nnw prev Net 0

CH 0 18:49:15.205 Core 1 2019.01.01 00:00:00 OpenCL: GPU-Gerät 'gfx902' ausgewählt

KN 0 18:49:15.205 Kern 1 2019.01.01 00:00:00 Era 1 -> Fehler 0.01 % Prognose 0.01

QK 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Zu erstellende Datei ChartScreenShot

HH 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Era 2 -> Fehler 0,01 % Prognose 0,01

CP 0 18:49:15.205 Core 1 2019.01.01 00:00:00 Es muss eine Datei erstellt werden ChartScreenShot

PS 2 18:49:19.829 Kern 1 nicht verbunden

OL 0 18:49:19.829 Kern 1 Verbindung geschlossen

NF 3 18:49:19.829 Tester von Benutzer gestoppt


И в директории "C:\Users\Borys\AppData\Roaming\MetaQuotes\Tester\BA9DEC643240F2BF3709AAEF5784CBBC\Agent-127.0.0.1-3000\MQL5\Files"

Diese Datei wird erstellt:

Fractal_10000000.csv

mit diesem Inhalt :

0.1 1 0.006391065067727753 0.30606698779533065 0.009849141883310947
0.1 2 0.01416031275898674 0.320172057079727 0.009671500063084178
0.1 1 0.021322935369592233 0.4824709164481285 0.009510368103745911
0.1 2 0.03047882579179044 0.4736268224037817 0.009336035129387396
0.1 1 0.04096262961921367 0.4747386346906194 0.009164897823757697
0.1 2 0.04745129346676422 0.9935630387598718 0.1983981648307233

Etc...

Wenn Sie es erneut ausführen, wird derselbe Fehler angezeigt und die .csv-Datei wird überschrieben .

Das heißt, der Expert Advisor ist immer im Lernprozess, weil er die Datei nicht findet.

Und die zweite Frage. Bitte schlagen Sie den Code (für das Lesen von Daten aus dem Ausgangsneuron), um Kauf-Verkauf-Aufträge zu öffnen, wenn das Netzwerk trainiert wird.


Vielen Dank für den Artikel und für die Antwort.

Guten Abend, Boris.
Sie versuchen, ein neuronales Netz im Strategie-Tester zu trainieren. Ich empfehle Ihnen nicht, das zu tun. Ich weiß natürlich nicht, welche Änderungen Sie an der Trainingslogik vorgenommen haben. In dem Artikel war das Training des Modells in einer Schleife organisiert. Und die Iterationen des Zyklus wurden so lange wiederholt, bis das Modell vollständig trainiert war oder der EA gestoppt wurde. Und die historischen Daten wurden sofort vollständig in die dynamischen Arrays geladen. Ich verwendete diesen Ansatz, um den Expert Advisor in Echtzeit laufen zu lassen. Der Trainingszeitraum wurde durch einen externen Parameter festgelegt.

Wenn der Expert Advisor im Strategietester gestartet wird, wird die in den Parametern angegebene Lernperiode auf die Tiefe der Historie vom Beginn der Testperiode verschoben. Außerdem arbeitet jeder Agent im MT5-Strategietester in seiner eigenen "Sandbox" und speichert darin Dateien. Wenn Sie also den Expert Advisor im Strategietester erneut ausführen, findet er die Datei des zuvor trainierten Modells nicht.

Versuchen Sie, den Expert Advisor im Echtzeitmodus auszuführen, und überprüfen Sie, ob eine Datei mit der Erweiterung nnw erstellt wurde, nachdem der EA nicht mehr funktioniert. Dies ist die Datei, in der Ihr trainiertes Modell gespeichert ist.

Um das Modell im realen Handel zu verwenden, müssen Sie die aktuelle Marktsituation in die Parameter der Net.FeedForward-Methode eingeben. Und dann die Ergebnisse des Modells mit der Methode Net.GetResult abrufen. Als Ergebnis der letztgenannten Methode enthält der Puffer die Ergebnisse der Arbeit des Modells.